LyoKICogQmVya2VsZXkgbGFzdCBmb3IgTGludXguIEN1cnJlbnRseSBtYWludGFpbmVkIGJ5IHBvZUBkYWltaS5hYXUuZGsgYXQKICogZnRwOi8vZnRwLmRhaW1pLmFhdS5kay9wdWIvbGludXgvcG9lL2FkbXV0aWwqCiAqCiAqIENvcHlyaWdodCAoYykgMTk4NyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAogKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBhcmUKICogZHVwbGljYXRlZCBpbiBhbGwgc3VjaCBmb3JtcyBhbmQgdGhhdCBhbnkgZG9jdW1lbnRhdGlvbiwKICogYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzLCBhbmQgb3RoZXIgbWF0ZXJpYWxzIHJlbGF0ZWQgdG8gc3VjaAogKiBkaXN0cmlidXRpb24gYW5kIHVzZSBhY2tub3dsZWRnZSB0aGF0IHRoZSBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkCiAqIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5LiAgVGhlIG5hbWUgb2YgdGhlCiAqIFVuaXZlcnNpdHkgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCiAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogKi8KCiAvKiAxOTk5LTAyLTIyIEFya2FkaXVzeiBNabZraWV3aWN6IDxtaXNpZWtAcGxkLk9SRy5QTD4KICAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKICAqLwoKIC8qIDIwMDEtMDItMTQgTWFyZWsgWmVsZW0gPG1hcmVrQGZvcm5heC5zaz4KICAqIC0gdXNpbmcgbW1hcCgpIG9uIExpbnV4IC0gZ3JlYXQgc3BlZWQgaW1wcm92ZW1lbnQKICAqLwoKLyoKICogbGFzdAogKi8KI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPHN5cy9maWxlLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiNpbmNsdWRlIDxzaWduYWwuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8dXRtcC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPGdldG9wdC5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KCiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNpbmNsdWRlIDxhcnBhL2luZXQuaD4KCiNpbmNsdWRlICJwYXRobmFtZXMuaCIKI2luY2x1ZGUgIm5scy5oIgoKI2RlZmluZQlTRUNEQVkJKDI0KjYwKjYwKQkJCS8qIHNlY29uZHMgaW4gYSBkYXkgKi8KI2RlZmluZQlOTwkwCQkJCS8qIGZhbHNlL25vICovCiNkZWZpbmUJWUVTCTEJCQkJLyogdHJ1ZS95ZXMgKi8KCnN0YXRpYyBzdHJ1Y3QgdXRtcAl1dG1wYnVmOwoKI2RlZmluZQlITUFYCShpbnQpc2l6ZW9mKHV0bXBidWYudXRfaG9zdCkJLyogc2l6ZSBvZiB1dG1wIGhvc3QgZmllbGQgKi8KI2RlZmluZQlMTUFYCShpbnQpc2l6ZW9mKHV0bXBidWYudXRfbGluZSkJLyogc2l6ZSBvZiB1dG1wIHR0eSBmaWVsZCAqLwojZGVmaW5lCU5NQVgJKGludClzaXplb2YodXRtcGJ1Zi51dF9uYW1lKQkvKiBzaXplIG9mIHV0bXAgbmFtZSBmaWVsZCAqLwoKI2lmbmRlZiBNSU4KI2RlZmluZSBNSU4oYSxiKQkoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCiNlbmRpZgoKLyogbWF4aW11bSBzaXplcyB1c2VkIGZvciBwcmludGluZyAqLwovKiBwcm9iYWJseSB3ZSB3YW50IGEgdHdvLXBhc3MgdmVyc2lvbiB0aGF0IGNvbXB1dGVzIHRoZSByaWdodCBsZW5ndGggKi8KaW50IGhtYXggPSBNSU4oSE1BWCwgMTYpOwppbnQgbG1heCA9IE1JTihMTUFYLCA4KTsKaW50IG5tYXggPSBNSU4oTk1BWCwgMTYpOwoKdHlwZWRlZiBzdHJ1Y3QgYXJnIHsKCWNoYXIJKm5hbWU7CQkJCS8qIGFyZ3VtZW50ICovCiNkZWZpbmUJSE9TVF9UWVBFCS0yCiNkZWZpbmUJVFRZX1RZUEUJLTMKI2RlZmluZQlVU0VSX1RZUEUJLTQKI2RlZmluZSBJTkVUX1RZUEUJLTUKCWludAl0eXBlOwkJCQkvKiB0eXBlIG9mIGFyZyAqLwoJc3RydWN0IGFyZwkqbmV4dDsJCQkvKiBsaW5rZWQgbGlzdCBwb2ludGVyICovCn0gQVJHOwpBUkcJKmFyZ2xpc3Q7CQkJCS8qIGhlYWQgb2YgbGlua2VkIGxpc3QgKi8KCnR5cGVkZWYgc3RydWN0IHR0eXRhYiB7Cglsb25nCWxvZ291dDsJCQkJLyogbG9nIG91dCB0aW1lICovCgljaGFyCXR0eVtMTUFYICsgMV07CQkJLyogdGVybWluYWwgbmFtZSAqLwoJc3RydWN0IHR0eXRhYgkqbmV4dDsJCQkvKiBsaW5rZWQgbGlzdCBwb2ludGVyICovCn0gVFRZOwpUVFkJKnR0eWxpc3Q7CQkJCS8qIGhlYWQgb2YgbGlua2VkIGxpc3QgKi8KCnN0YXRpYyBsb25nCWN1cnJlbnRvdXQsCQkJLyogY3VycmVudCBsb2dvdXQgdmFsdWUgKi8KCQltYXhyZWM7CQkJCS8qIHJlY29yZHMgdG8gZGlzcGxheSAqLwpzdGF0aWMgY2hhcgkqZmlsZSA9IF9QQVRIX1dUTVA7CQkvKiB3dG1wIGZpbGUgKi8KCnN0YXRpYyBpbnQJZG95ZWFyID0gMDsJCQkvKiBvdXRwdXQgeWVhciBpbiBkYXRlcyAqLwpzdGF0aWMgaW50CWRvbG9uZyA9IDA7CQkJLyogcHJpbnQgYWxzbyBpcC1hZGRyICovCgpzdGF0aWMgdm9pZCB3dG1wKHZvaWQpOwpzdGF0aWMgdm9pZCBhZGRhcmcoaW50LCBjaGFyICopOwpzdGF0aWMgdm9pZCBob3N0Y29udihjaGFyICopOwpzdGF0aWMgdm9pZCBvbmludHIoaW50KTsKc3RhdGljIGludCB3YW50KHN0cnVjdCB1dG1wICosIGludCk7ClRUWSAqYWRkdHR5KGNoYXIgKik7CnN0YXRpYyBjaGFyICp0dHljb252KGNoYXIgKik7CgppbnQKbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKCWV4dGVybiBpbnQJb3B0aW5kOwoJZXh0ZXJuIGNoYXIJKm9wdGFyZzsKCWludAljaDsKCglzZXRsb2NhbGUoTENfQUxMLCAiIik7CgliaW5kdGV4dGRvbWFpbihQQUNLQUdFLCBMT0NBTEVESVIpOwoJdGV4dGRvbWFpbihQQUNLQUdFKTsKCgl3aGlsZSAoKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICIwMTIzNDU2Nzg5eWxpOmY6aDp0OiIpKSAhPSAtMSkKCQlzd2l0Y2goKGNoYXIpY2gpIHsKCQljYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6CgkJY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgoJCQkvKgoJCQkgKiBrbHVkZ2U6IGxhc3Qgd2FzIG9yaWdpbmFsbHkgZGVzaWduZWQgdG8gdGFrZQoJCQkgKiBhIG51bWJlciBhZnRlciBhIGRhc2guCgkJCSAqLwoJCQlpZiAoIW1heHJlYykKCQkJCW1heHJlYyA9IGF0b2woYXJndltvcHRpbmQgLSAxXSArIDEpOwoJCQlicmVhazsKCQljYXNlICdmJzoKCQkJZmlsZSA9IG9wdGFyZzsKCQkJYnJlYWs7CgkJY2FzZSAnaCc6CgkJCWhvc3Rjb252KG9wdGFyZyk7CgkJCWFkZGFyZyhIT1NUX1RZUEUsIG9wdGFyZyk7CgkJCWJyZWFrOwoJCWNhc2UgJ3QnOgoJCQlhZGRhcmcoVFRZX1RZUEUsIHR0eWNvbnYob3B0YXJnKSk7CgkJCWJyZWFrOwoJCWNhc2UgJ3knOgoJCQlkb3llYXIgPSAxOwoJCQlicmVhazsKCQljYXNlICdsJzoKCQkJZG9sb25nID0gMTsKCQkJYnJlYWs7CgkJY2FzZSAnaSc6CgkJCWFkZGFyZyhJTkVUX1RZUEUsIG9wdGFyZyk7CgkJCWJyZWFrOwoJCWNhc2UgJz8nOgoJCWRlZmF1bHQ6CgkJCWZwdXRzKF8oInVzYWdlOiBsYXN0IFstI10gWy1mIGZpbGVdIFstdCB0dHldIFstaCBob3N0bmFtZV0gW3VzZXIgLi4uXVxuIiksIHN0ZGVycik7CgkJCWV4aXQoMSk7CgkJfQoJZm9yIChhcmd2ICs9IG9wdGluZDsgKmFyZ3Y7ICsrYXJndikgewojZGVmaW5lCUNPTVBBVElCSUxJVFkKI2lmZGVmCUNPTVBBVElCSUxJVFkKCQkvKiBjb2RlIHRvIGFsbG93ICJsYXN0IHA1IiB0byB3b3JrICovCgkJYWRkYXJnKFRUWV9UWVBFLCB0dHljb252KCphcmd2KSk7CiNlbmRpZgoJCWFkZGFyZyhVU0VSX1RZUEUsICphcmd2KTsKCX0KCXd0bXAoKTsKCWV4aXQoMCk7Cn0KCnN0YXRpYyBjaGFyICp1dG1wX2N0aW1lKHN0cnVjdCB1dG1wICp1KQp7Cgl0aW1lX3QgdCA9ICh0aW1lX3QpIHUtPnV0X3RpbWU7CglyZXR1cm4gY3RpbWUoJnQpOwp9CgovKgogKiBwcmludF9wYXJ0aWFsX2xpbmUgLS0KICoJcHJpbnQgdGhlIGZpcnN0IHBhcnQgb2YgZWFjaCBvdXRwdXQgbGluZSBhY2NvcmRpbmcgdG8gc3BlY2lmaWVkIGZvcm1hdAogKi8Kc3RhdGljIHZvaWQKcHJpbnRfcGFydGlhbF9saW5lKHN0cnVjdCB1dG1wICpicCkgewogICAgY2hhciAqY3Q7CgogICAgY3QgPSB1dG1wX2N0aW1lKGJwKTsKICAgIHByaW50ZigiJS0qLipzICAlLSouKnMgIiwgbm1heCwgbm1heCwgYnAtPnV0X25hbWUsIAoJICAgbG1heCwgbG1heCwgYnAtPnV0X2xpbmUpOwoKICAgIGlmIChkb2xvbmcpIHsKCWlmIChicC0+dXRfYWRkcikgewoJICAgIHN0cnVjdCBpbl9hZGRyIGZvbzsKCSAgICBmb28uc19hZGRyID0gYnAtPnV0X2FkZHI7CgkgICAgcHJpbnRmKCIlLSouKnMgIiwgaG1heCwgaG1heCwgaW5ldF9udG9hKGZvbykpOwoJfSBlbHNlIHsKCSAgICBwcmludGYoIiUtKi4qcyAiLCBobWF4LCBobWF4LCAiIik7Cgl9CiAgICB9IGVsc2UgewoJcHJpbnRmKCIlLSouKnMgIiwgaG1heCwgaG1heCwgYnAtPnV0X2hvc3QpOwogICAgfQoKICAgIGlmIChkb3llYXIpIHsKCXByaW50ZigiJTEwLjEwcyAlNC40cyAlNS41cyAiLCBjdCwgY3QgKyAyMCwgY3QgKyAxMSk7CiAgICB9IGVsc2UgewoJcHJpbnRmKCIlMTAuMTBzICU1LjVzICIsIGN0LCBjdCArIDExKTsKICAgIH0KfQoKLyoKICogd3RtcCAtLQogKglyZWFkIHRocm91Z2ggdGhlIHd0bXAgZmlsZQogKi8Kc3RhdGljIHZvaWQKd3RtcCh2b2lkKSB7CglyZWdpc3RlciBzdHJ1Y3QgdXRtcAkqYnA7CQkvKiBjdXJyZW50IHN0cnVjdHVyZSAqLwoJcmVnaXN0ZXIgVFRZCSpUOwkJCS8qIHR0eSBsaXN0IGVudHJ5ICovCglsb25nCWRlbHRhOwkJCQkvKiB0aW1lIGRpZmZlcmVuY2UgKi8KCWNoYXIgKmNybXNnID0gTlVMTDsKCWNoYXIgKmN0ID0gTlVMTDsKCWludCBmZDsKCXN0cnVjdCB1dG1wICp1dGw7CglzdHJ1Y3Qgc3RhdCBzdDsKCWludCB1dGxfbGVuOwoJaW50IGxpc3RuciA9IDA7CglpbnQgaTsKCgl1dG1wbmFtZShmaWxlKTsKCgl7CiNpZiBkZWZpbmVkKF9IQVZFX1VUX1RWKQoJCXN0cnVjdCB0aW1ldmFsIHR2OwoJCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOwoJCXV0bXBidWYudXRfdHYudHZfc2VjID0gdHYudHZfc2VjOwoJCXV0bXBidWYudXRfdHYudHZfdXNlYyA9IHR2LnR2X3VzZWM7CiNlbHNlCgkJdGltZV90IHQ7CgkJdGltZSgmdCk7CgkJdXRtcGJ1Zi51dF90aW1lID0gdDsKI2VuZGlmCgl9CgoJKHZvaWQpc2lnbmFsKFNJR0lOVCwgb25pbnRyKTsKCSh2b2lkKXNpZ25hbChTSUdRVUlULCBvbmludHIpOwoKCWlmICgoZmQgPSBvcGVuKGZpbGUsT19SRE9OTFkpKSA8IDApCgkJZXhpdCgxKTsKCWZzdGF0KGZkLCAmc3QpOwoJdXRsX2xlbiA9IHN0LnN0X3NpemU7Cgl1dGwgPSBtbWFwKE5VTEwsIHV0bF9sZW4sIFBST1RfUkVBRHxQUk9UX1dSSVRFLAoJCSAgIE1BUF9QUklWQVRFfE1BUF9GSUxFLCBmZCwgMCk7CglpZiAodXRsID09IE5VTEwpCgkJZXhpdCgxKTsKCWxpc3RuciA9IHV0bF9sZW4vc2l6ZW9mKHN0cnVjdCB1dG1wKTsKCglpZihsaXN0bnIpIAoJCWN0ID0gdXRtcF9jdGltZSgmdXRsWzBdKTsKCglmb3IoaSA9IGxpc3RuciAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJYnAgPSB1dGwraTsKCQkvKgoJCSAqIGlmIHRoZSB0ZXJtaW5hbCBsaW5lIGlzICd+JywgdGhlIG1hY2hpbmUgc3RvcHBlZC4KCQkgKiBzZWUgdXRtcCg1KSBmb3IgbW9yZSBpbmZvLgoJCSAqLwoJCWlmICghc3RybmNtcChicC0+dXRfbGluZSwgIn4iLCBMTUFYKSkgewoJCSAgICAvKiAKCQkgICAgICogdXRtcCg1KSBhbHNvIG1lbnRpb25zIHRoYXQgdGhlIHVzZXIgCgkJICAgICAqIG5hbWUgc2hvdWxkIGJlICdzaHV0ZG93bicgb3IgJ3JlYm9vdCcuCgkJICAgICAqIE5vdCBjaGVja2luZyB0aGUgbmFtZSBjYXVzZXMgZS5nLiBydW5sZXZlbAoJCSAgICAgKiBjaGFuZ2VzIHRvIGJlIGRpc3BsYXllZCBhcyAnY3Jhc2gnLiAtdGhhZWxlCgkJICAgICAqLwoJCSAgICBpZiAoIXN0cm5jbXAoYnAtPnV0X3VzZXIsICJyZWJvb3QiLCBOTUFYKSB8fAoJCQkhc3RybmNtcChicC0+dXRfdXNlciwgInNodXRkb3duIiwgTk1BWCkpIHsJCgkJCS8qIGV2ZXJ5Ym9keSBqdXN0IGxvZ2dlZCBvdXQgKi8KCQkJZm9yIChUID0gdHR5bGlzdDsgVDsgVCA9IFQtPm5leHQpCgkJCSAgICBULT5sb2dvdXQgPSAtYnAtPnV0X3RpbWU7CgkJICAgIH0KCgkJICAgIGN1cnJlbnRvdXQgPSAtYnAtPnV0X3RpbWU7CgkJICAgIGNybXNnID0gKHN0cm5jbXAoYnAtPnV0X25hbWUsICJzaHV0ZG93biIsIE5NQVgpCgkJCSAgICA/ICJjcmFzaCIgOiAiZG93biAiKTsKCQkgICAgaWYgKCFicC0+dXRfbmFtZVswXSkKCQkJKHZvaWQpc3RyY3B5KGJwLT51dF9uYW1lLCAicmVib290Iik7CgkJICAgIGlmICh3YW50KGJwLCBOTykpIHsKCQkJY3QgPSB1dG1wX2N0aW1lKGJwKTsKCQkJaWYoYnAtPnV0X3R5cGUgIT0gTE9HSU5fUFJPQ0VTUykgewoJCQkgICAgcHJpbnRfcGFydGlhbF9saW5lKGJwKTsKCQkJICAgIHB1dGNoYXIoJ1xuJyk7CgkJCX0KCQkJaWYgKG1heHJlYyAmJiAhLS1tYXhyZWMpCgkJCSAgICByZXR1cm47CgkJICAgIH0KCQkgICAgY29udGludWU7CgkJfQoJCS8qIGZpbmQgYXNzb2NpYXRlZCB0dHkgKi8KCQlmb3IgKFQgPSB0dHlsaXN0OzsgVCA9IFQtPm5leHQpIHsKCQkgICAgaWYgKCFUKSB7CgkJCS8qIGFkZCBuZXcgb25lICovCgkJCVQgPSBhZGR0dHkoYnAtPnV0X2xpbmUpOwoJCQlicmVhazsKCQkgICAgfQoJCSAgICBpZiAoIXN0cm5jbXAoVC0+dHR5LCBicC0+dXRfbGluZSwgTE1BWCkpCgkJCWJyZWFrOwoJCX0KCQlpZiAoYnAtPnV0X25hbWVbMF0gJiYgYnAtPnV0X3R5cGUgIT0gTE9HSU5fUFJPQ0VTUwoJCSAgICAmJiBicC0+dXRfdHlwZSAhPSBERUFEX1BST0NFU1MKCQkgICAgJiYgd2FudChicCwgWUVTKSkgewoKCQkgICAgcHJpbnRfcGFydGlhbF9saW5lKGJwKTsKCgkJICAgIGlmICghVC0+bG9nb3V0KQoJCQlwdXRzKF8oIiAgc3RpbGwgbG9nZ2VkIGluIikpOwoJCSAgICBlbHNlIHsKCQkJaWYgKFQtPmxvZ291dCA8IDApIHsKCQkJICAgIFQtPmxvZ291dCA9IC1ULT5sb2dvdXQ7CgkJCSAgICBwcmludGYoIi0gJXMiLCBjcm1zZyk7CgkJCX0KCQkJZWxzZQoJCQkgICAgcHJpbnRmKCItICU1LjVzIiwgY3RpbWUoJlQtPmxvZ291dCkrMTEpOwoJCQlkZWx0YSA9IFQtPmxvZ291dCAtIGJwLT51dF90aW1lOwoJCQlpZiAoZGVsdGEgPCBTRUNEQVkpCgkJCSAgICBwcmludGYoIiAgKCU1LjVzKVxuIiwgYXNjdGltZShnbXRpbWUoJmRlbHRhKSkrMTEpOwoJCQllbHNlCgkJCSAgICBwcmludGYoIiAoJWxkKyU1LjVzKVxuIiwgZGVsdGEgLyBTRUNEQVksIGFzY3RpbWUoZ210aW1lKCZkZWx0YSkpKzExKTsKCQkgICAgfQoJCSAgICBpZiAobWF4cmVjICE9IC0xICYmICEtLW1heHJlYykKCQkJcmV0dXJuOwoJCX0KCQlULT5sb2dvdXQgPSBicC0+dXRfdGltZTsKCQl1dG1wYnVmLnV0X3RpbWUgPSBicC0+dXRfdGltZTsKCX0KCW11bm1hcCh1dGwsdXRsX2xlbik7CgljbG9zZShmZCk7CglpZihjdCkgcHJpbnRmKF8oIlxud3RtcCBiZWdpbnMgJXMiKSwgY3QpOyAJLyogY3QgYWxyZWFkeSBlbmRzIGluIFxuICovCn0KCi8qCiAqIHdhbnQgLS0KICoJc2VlIGlmIHdhbnQgdGhpcyBlbnRyeQogKi8Kc3RhdGljIGludAp3YW50KHN0cnVjdCB1dG1wICpicCwgaW50IGNoZWNrKSB7CglyZWdpc3RlciBBUkcJKnN0ZXA7CgoJaWYgKGNoZWNrKSB7CgkJLyoKCQkgKiB3aGVuIHV1Y3AgYW5kIGZ0cCBsb2cgaW4gb3ZlciBhIG5ldHdvcmssIHRoZSBlbnRyeSBpbgoJCSAqIHRoZSB1dG1wIGZpbGUgaXMgdGhlIG5hbWUgcGx1cyB0aGVpciBwcm9jZXNzIGlkLiAgU2VlCgkJICogZXRjL2Z0cGQuYyBhbmQgdXNyLmJpbi91dWNwL3V1Y3BkLmMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCgkJICovCgkJaWYgKCFzdHJuY21wKGJwLT51dF9saW5lLCAiZnRwIiwgc2l6ZW9mKCJmdHAiKSAtIDEpKQoJCQlicC0+dXRfbGluZVszXSA9ICdcMCc7CgkJZWxzZSBpZiAoIXN0cm5jbXAoYnAtPnV0X2xpbmUsICJ1dWNwIiwgc2l6ZW9mKCJ1dWNwIikgLSAxKSkKCQkJYnAtPnV0X2xpbmVbNF0gPSAnXDAnOwoJfQoJaWYgKCFhcmdsaXN0KQoJCXJldHVybihZRVMpOwoKCWZvciAoc3RlcCA9IGFyZ2xpc3Q7IHN0ZXA7IHN0ZXAgPSBzdGVwLT5uZXh0KQoJCXN3aXRjaChzdGVwLT50eXBlKSB7CgkJY2FzZSBIT1NUX1RZUEU6CgkJCWlmICghc3RybmNtcChzdGVwLT5uYW1lLCBicC0+dXRfaG9zdCwgSE1BWCkpCgkJCQlyZXR1cm4oWUVTKTsKCQkJYnJlYWs7CgkJY2FzZSBUVFlfVFlQRToKCQkJaWYgKCFzdHJuY21wKHN0ZXAtPm5hbWUsIGJwLT51dF9saW5lLCBMTUFYKSkKCQkJCXJldHVybihZRVMpOwoJCQlicmVhazsKCQljYXNlIFVTRVJfVFlQRToKCQkJaWYgKCFzdHJuY21wKHN0ZXAtPm5hbWUsIGJwLT51dF9uYW1lLCBOTUFYKSkKCQkJCXJldHVybihZRVMpOwoJCQlicmVhazsKCQljYXNlIElORVRfVFlQRToKCQkJaWYgKGJwLT51dF9hZGRyID09IGluZXRfYWRkcihzdGVwLT5uYW1lKSkKCQkJICByZXR1cm4oWUVTKTsKCQkJYnJlYWs7Cgl9CglyZXR1cm4oTk8pOwp9CgovKgogKiBhZGRhcmcgLS0KICoJYWRkIGFuIGVudHJ5IHRvIGEgbGlua2VkIGxpc3Qgb2YgYXJndW1lbnRzCiAqLwpzdGF0aWMgdm9pZAphZGRhcmcoaW50IHR5cGUsIGNoYXIgKmFyZykgewoJcmVnaXN0ZXIgQVJHCSpjdXI7CgoJaWYgKCEoY3VyID0gKEFSRyAqKW1hbGxvYygodW5zaWduZWQgaW50KXNpemVvZihBUkcpKSkpIHsKCQlmcHV0cyhfKCJsYXN0OiBtYWxsb2MgZmFpbHVyZS5cbiIpLCBzdGRlcnIpOwoJCWV4aXQoMSk7Cgl9CgljdXItPm5leHQgPSBhcmdsaXN0OwoJY3VyLT50eXBlID0gdHlwZTsKCWN1ci0+bmFtZSA9IGFyZzsKCWFyZ2xpc3QgPSBjdXI7Cn0KCi8qCiAqIGFkZHR0eSAtLQogKglhZGQgYW4gZW50cnkgdG8gYSBsaW5rZWQgbGlzdCBvZiB0dHlzCiAqLwpUVFkgKgphZGR0dHkoY2hhciAqdHR5bmFtZSkgewoJcmVnaXN0ZXIgVFRZCSpjdXI7CgoJaWYgKCEoY3VyID0gKFRUWSAqKW1hbGxvYygodW5zaWduZWQgaW50KXNpemVvZihUVFkpKSkpIHsKCQlmcHV0cyhfKCJsYXN0OiBtYWxsb2MgZmFpbHVyZS5cbiIpLCBzdGRlcnIpOwoJCWV4aXQoMSk7Cgl9CgljdXItPm5leHQgPSB0dHlsaXN0OwoJY3VyLT5sb2dvdXQgPSBjdXJyZW50b3V0OwoJbWVtY3B5KGN1ci0+dHR5LCB0dHluYW1lLCBMTUFYKTsKCXJldHVybih0dHlsaXN0ID0gY3VyKTsKfQoKLyoKICogaG9zdGNvbnYgLS0KICoJY29udmVydCB0aGUgaG9zdG5hbWUgdG8gc2VhcmNoIHBhdHRlcm47IGlmIHRoZSBzdXBwbGllZCBob3N0IG5hbWUKICoJaGFzIGEgZG9tYWluIGF0dGFjaGVkIHRoYXQgaXMgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgZG9tYWluLCByaXAKICoJb2ZmIHRoZSBkb21haW4gc3VmZml4IHNpbmNlIHRoYXQncyB3aGF0IGxvZ2luKDEpIGRvZXMuCiAqLwpzdGF0aWMgdm9pZApob3N0Y29udihjaGFyICphcmcpIHsKCXN0YXRpYyBpbnQJZmlyc3QgPSAxOwoJc3RhdGljIGNoYXIJKmhvc3Rkb3QsCgkJCW5hbWVbTUFYSE9TVE5BTUVMRU5dOwoJY2hhcgkqYXJnZG90OwoKCWlmICghKGFyZ2RvdCA9IHN0cmNocihhcmcsICcuJykpKQoJCXJldHVybjsKCWlmIChmaXJzdCkgewoJCWZpcnN0ID0gMDsKCQlpZiAoZ2V0aG9zdG5hbWUobmFtZSwgc2l6ZW9mKG5hbWUpKSkgewoJCQlwZXJyb3IoXygibGFzdDogZ2V0aG9zdG5hbWUiKSk7CgkJCWV4aXQoMSk7CgkJfQoJCWhvc3Rkb3QgPSBzdHJjaHIobmFtZSwgJy4nKTsKCX0KCWlmIChob3N0ZG90ICYmICFzdHJjbXAoaG9zdGRvdCwgYXJnZG90KSkKCQkqYXJnZG90ID0gJ1wwJzsKfQoKLyoKICogdHR5Y29udiAtLQogKgljb252ZXJ0IHR0eSB0byBjb3JyZWN0IG5hbWUuCiAqLwpzdGF0aWMgY2hhciAqCnR0eWNvbnYoY2hhciAqYXJnKSB7CgljaGFyCSptdmFsOwoKCS8qCgkgKiBrbHVkZ2UgLS0gd2UgYXNzdW1lIHRoYXQgYWxsIHR0eSdzIGVuZCB3aXRoCgkgKiBhIHR3byBjaGFyYWN0ZXIgc3VmZml4LgoJICovCglpZiAoc3RybGVuKGFyZykgPT0gMikgewoJCS8qIGVpdGhlciA2IGZvciAidHR5eHgiIG9yIDggZm9yICJjb25zb2xlIiAqLwoJCWlmICghKG12YWwgPSBtYWxsb2MoKHVuc2lnbmVkIGludCk4KSkpIHsKCQkJZnB1dHMoXygibGFzdDogbWFsbG9jIGZhaWx1cmUuXG4iKSwgc3RkZXJyKTsKCQkJZXhpdCgxKTsKCQl9CgkJaWYgKCFzdHJjbXAoYXJnLCAiY28iKSkKCQkJKHZvaWQpc3RyY3B5KG12YWwsICJjb25zb2xlIik7CgkJZWxzZSB7CgkJCSh2b2lkKXN0cmNweShtdmFsLCAidHR5Iik7CgkJCSh2b2lkKXN0cmNweShtdmFsICsgMywgYXJnKTsKCQl9CgkJcmV0dXJuKG12YWwpOwoJfQoJaWYgKCFzdHJuY21wKGFyZywgIi9kZXYvIiwgc2l6ZW9mKCIvZGV2LyIpIC0gMSkpCgkJcmV0dXJuKGFyZyArIDUpOwoJcmV0dXJuKGFyZyk7Cn0KCi8qCiAqIG9uaW50ciAtLQogKglvbiBpbnRlcnJ1cHQsIHdlIGluZm9ybSB0aGUgdXNlciBob3cgZmFyIHdlJ3ZlIGdvdHRlbgogKi8Kc3RhdGljIHZvaWQKb25pbnRyKGludCBzaWdubykgewoJY2hhcgkqY3Q7CgoJY3QgPSB1dG1wX2N0aW1lKCZ1dG1wYnVmKTsKCXByaW50ZihfKCJcbmludGVycnVwdGVkICUxMC4xMHMgJTUuNXMgXG4iKSwgY3QsIGN0ICsgMTEpOwoJaWYgKHNpZ25vID09IFNJR0lOVCkKCQlleGl0KDEpOwoJKHZvaWQpZmZsdXNoKHN0ZG91dCk7CQkJLyogZml4IHJlcXVpcmVkIGZvciByc2ggKi8KfQo=