LyoKICogZnNjay5jIC0gYSBmaWxlIHN5c3RlbSBjb25zaXN0ZW5jeSBjaGVja2VyIGZvciBMaW51eC4KICoKICogKEMpIDE5OTEsIDE5OTIgTGludXMgVG9ydmFsZHMuIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZAogKiBhcyBwZXIgdGhlIEdOVSBjb3B5bGVmdC4KICovCgovKgogKiAwOS4xMS45MSAgLSAgbWFkZSB0aGUgZmlyc3QgcnVkaW1ldGFyeSBmdW5jdGlvbnMKICoKICogMTAuMTEuOTEgIC0gIHVwZGF0ZWQsIGRvZXMgY2hlY2tpbmcsIG5vIHJlcGFpcnMgeWV0LgogKgkJU2VudCBvdXQgdG8gdGhlIG1haWxpbmctbGlzdCBmb3IgdGVzdGluZy4KICoKICogMTQuMTEuOTEgIC0JVGVzdGluZyBzZWVtcyB0byBoYXZlIGdvbmUgd2VsbC4gQWRkZWQgc29tZQogKgkJY29ycmVjdGlvbi1jb2RlLCBhbmQgY2hhbmdlZCBzb21lIGZ1bmN0aW9ucy4KICoKICogMTUuMTEuOTEgIC0gIE1vcmUgY29ycmVjdGlvbiBjb2RlLiBIb3BlZnVsbHkgaXQgbm90aWNlcyBtb3N0CiAqCQljYXNlcyBub3csIGFuZCB0cmllcyB0byBkbyBzb21ldGhpbmcgYWJvdXQgdGhlbS4KICoKICogMTYuMTEuOTEgIC0gIE1vcmUgY29ycmVjdGlvbnMgKHRoYW5rcyB0byBNaWthIEphbGF2YSkuIE1vc3QKICoJCXRoaW5ncyBzZWVtIHRvIHdvcmsgbm93LiBZZWFoLCBzdXJlLgogKgogKgogKiAxOS4wNC45MiAgLQlIYWQgdG8gc3RhcnQgb3ZlciBhZ2FpbiBmcm9tIHRoaXMgb2xkIHZlcnNpb24sIGFzIGEKICoJCWtlcm5lbCBidWcgYXRlIG15IGVuaGFuY2VkIGZzY2sgaW4gZmVicnVhcnkuCiAqCiAqIDI4LjAyLjkzICAtCWFkZGVkIHN1cHBvcnQgZm9yIGRpZmZlcmVudCBkaXJlY3RvcnkgZW50cnkgc2l6ZXMuLgogKgogKiBTYXQgTWFyICA2IDE4OjU5OjQyIDE5OTMsIGZhaXRoQGNzLnVuYy5lZHU6IE91dHB1dCBuYW1lbGVuIHdpdGgKICogICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlci1ibG9jayBpbmZvcm1hdGlvbgogKgogKiBTYXQgT2N0ICA5IDExOjE3OjExIDE5OTMsIGZhaXRoQGNzLnVuYy5lZHU6IG1ha2UgZXhpdCBzdGF0dXMgY29uZm9ybQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoYXQgcmVxdWlyZWQgYnkgZnN1dGlsCiAqCiAqIE1vbiBKYW4gIDMgMTE6MDY6NTIgMTk5NCAtIERyLiBXZXR0c3RlaW4gKGdyZWcld2luZC51dWNwQHBsYWlucy5ub2Rhay5lZHUpCiAqCQkJICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgZmlsZSBzeXN0ZW0gdmFsaWQgZmxhZy4gIEFsc28KICoJCQkgICAgICBhZGRlZCBwcm9ncmFtX3ZlcnNpb24gdmFyaWFibGUgYW5kIG91dHB1dCBvZgogKgkJCSAgICAgIHByb2dyYW0gbmFtZSBhbmQgdmVyc2lvbiBudW1iZXIgd2hlbiBwcm9ncmFtCiAqCQkJICAgICAgaXMgZXhlY3V0ZWQuCiAqCiAqIDMwLjEwLjk0IC0gYWRkZWQgc3VwcG9ydCBmb3IgdjIgZmlsZXN5c3RlbQogKiAgICAgICAgICAgIChBbmRyZWFzIFNjaHdhYiwgc2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlKQogKgogKiAxMC4xMi45NCAgLSAgYWRkZWQgdGVzdCB0byBwcmV2ZW50IGNoZWNraW5nIG9mIG1vdW50ZWQgZnMgYWRhcHRlZAogKiAgICAgICAgICAgICAgZnJvbSBUaGVvZG9yZSBUcydvJ3MgKHR5dHNvQGF0aGVuYS5taXQuZWR1KSBlMmZzY2sKICogICAgICAgICAgICAgIHByb2dyYW0uICAoRGFuaWVsIFF1aW5sYW4sIHF1aW5sYW5AeWdnZHJhc2lsLmNvbSkKICoKICogMDEuMDcuOTYgIC0gRml4ZWQgdGhlIHYyIGZzIHN0dWZmIHRvIHVzZSB0aGUgcmlnaHQgI2RlZmluZXMgYW5kIHN1Y2gKICoJICAgICAgIGZvciBtb2Rlcm4gbGliY3MgKGphbmxAbWF0aC51aW8ubm8sIE5pY29sYWkgTGFuZ2ZlbGR0KQogKgogKiAwMi4wNy45NiAgLSBBZGRlZCBDIGJpdCBmaWRkbGluZyByb3V0aW5lcyBmcm9tIHJta0BlY3Muc290b24uYWMudWsgCiAqICAgICAgICAgICAgIChSdXNzZWxsIEtpbmcpLiAgSGUgbWFkZSB0aGVtIGZvciBBUk0uICBJdCB3b3VsZCBzZWVtCiAqCSAgICAgICB0aGF0IHRoZSBBUk0gaXMgcG93ZXJmdWwgZW5vdWdoIHRvIGRvIHRoaXMgaW4gQyB3aGVyZWFzCiAqICAgICAgICAgICAgIGkzODYgYW5kIG02NGsgbXVzdCB1c2UgYXNzZW1ibHkgdG8gZ2V0IGl0IGZhc3QgPjotKQogKgkgICAgICAgVGhpcyBzaG91bGQgbWFrZSBtaW5peCBmc2NrIHN5c3RlbWluZGVwZW5kZW50LgogKgkgICAgICAgKGphbmxAbWF0aC51aW8ubm8sIE5pY29sYWkgTGFuZ2ZlbGR0KQogKgogKiAwNC4xMS45NiAgLSBBZGRlZCBtaW5vciBmaXhlcyBmcm9tIEFuZHJlYXMgU2Nod2FiIHRvIGF2b2lkIGNvbXBpbGVyCiAqICAgICAgICAgICAgIHdhcm5pbmdzLiAgQWRkZWQgbWM2OGsgYml0b3BzIGZyb20gCiAqCSAgICAgICBKb2VyZyBEb3JjaGFpbiA8ZG9yY2hhaW5AbXBpLXNiLm1wZy5kZT4uCiAqCiAqIDA2LjExLjk2ICAtIEFkZGVkIHYyIGNvZGUgc3VibWl0dGVkIGJ5IEpvZXJnIERvcmNoYWluLCBidXQgd3JpdHRlbiBieQogKiAgICAgICAgICAgICBBbmRyZWFzIFNjaHdhYi4KICoKICogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWm2a2lld2ljeiA8bWlzaWVrQG1pc2llay5ldS5vcmc+CiAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKICoKICoKICogSSd2ZSBoYWQgbm8gdGltZSB0byBhZGQgY29tbWVudHMgLSBob3BlZnVsbHkgdGhlIGZ1bmN0aW9uIG5hbWVzCiAqIGFyZSBjb21tZW50cyBlbm91Z2guIEFzIHdpdGggYWxsIGZpbGUgc3lzdGVtIGNoZWNrZXJzLCB0aGlzIGFzc3VtZXMKICogdGhlIGZpbGUgc3lzdGVtIGlzIHF1aWVzY2VudCAtIGRvbid0IHVzZSBpdCBvbiBhIG1vdW50ZWQgZGV2aWNlCiAqIHVubGVzcyB5b3UgY2FuIGJlIHN1cmUgbm9ib2R5IGlzIHdyaXRpbmcgdG8gaXQgKGFuZCByZW1lbWJlciB0aGF0IHRoZQogKiBrZXJuZWwgY2FuIHdyaXRlIHRvIGl0IHdoZW4gaXQgc2VhcmNoZXMgZm9yIGZpbGVzKS4KICoKICogVXN1YWdlOiBmc2NrIFstbGFydnNtXSBkZXZpY2UKICoJLWwgZm9yIGEgbGlzdGluZyBvZiBhbGwgdGhlIGZpbGVuYW1lcwogKgktYSBmb3IgYXV0b21hdGljIHJlcGFpcnMgKG5vdCBpbXBsZW1lbnRlZCkKICoJLXIgZm9yIHJlcGFpcnMgKGludGVyYWN0aXZlKSAobm90IGltcGxlbWVudGVkKQogKgktdiBmb3IgdmVyYm9zZSAodGVsbHMgaG93IG1hbnkgZmlsZXMpCiAqCS1zIGZvciBzdXBlci1ibG9jayBpbmZvCiAqCS1tIGZvciBtaW5peC1saWtlICJtb2RlIG5vdCBjbGVhcmVkIiB3YXJuaW5ncwogKgktZiBmb3JjZSBmaWxlc3lzdGVtIGNoZWNrIGV2ZW4gaWYgZmlsZXN5c3RlbSBtYXJrZWQgYXMgdmFsaWQKICoKICogVGhlIGRldmljZSBtYXkgYmUgYSBibG9jayBkZXZpY2Ugb3IgYSBpbWFnZSBvZiBvbmUsIGJ1dCB0aGlzIGlzbid0CiAqIGVuZm9yY2VkIChidXQgaXQncyBub3QgbXVjaCBmdW4gb24gYSBjaGFyYWN0ZXIgZGV2aWNlIDotKS4gCiAqLwoKI2luY2x1ZGUgImludGVybmFsLmgiCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8dGVybWlvcy5oPgojaW5jbHVkZSA8bW50ZW50Lmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgoKI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiNpbmNsdWRlIDxsaW51eC9taW5peF9mcy5oPgoKI2lmZGVmIE1JTklYMl9TVVBFUl9NQUdJQzIKI2RlZmluZSBIQVZFX01JTklYMiAxCiNlbmRpZgoKI2lmbmRlZiBfX2xpbnV4X18KI2RlZmluZSB2b2xhdGlsZQojZW5kaWYKCiNkZWZpbmUgUk9PVF9JTk8gMQoKI2RlZmluZSBVUFBFUihzaXplLG4pICgoc2l6ZSsoKG4pLTEpKS8obikpCiNkZWZpbmUgSU5PREVfU0laRSAoc2l6ZW9mKHN0cnVjdCBtaW5peF9pbm9kZSkpCiNpZmRlZiBIQVZFX01JTklYMgojZGVmaW5lIElOT0RFX1NJWkUyIChzaXplb2Yoc3RydWN0IG1pbml4Ml9pbm9kZSkpCiNkZWZpbmUgSU5PREVfQkxPQ0tTIFVQUEVSKElOT0RFUywgKHZlcnNpb24yID8gTUlOSVgyX0lOT0RFU19QRVJfQkxPQ0sgXAoJCQkJICAgIDogTUlOSVhfSU5PREVTX1BFUl9CTE9DSykpCiNlbHNlCiNkZWZpbmUgSU5PREVfQkxPQ0tTIFVQUEVSKElOT0RFUywgKE1JTklYX0lOT0RFU19QRVJfQkxPQ0spKQojZW5kaWYKI2RlZmluZSBJTk9ERV9CVUZGRVJfU0laRSAoSU5PREVfQkxPQ0tTICogQkxPQ0tfU0laRSkKCiNkZWZpbmUgQklUU19QRVJfQkxPQ0sgKEJMT0NLX1NJWkU8PDMpCgpzdGF0aWMgY2hhciAqIHByb2dyYW1fbmFtZSA9ICJmc2NrLm1pbml4IjsKc3RhdGljIGNoYXIgKiBwcm9ncmFtX3ZlcnNpb24gPSAiMS4yIC0gMTEvMTEvOTYiOwpzdGF0aWMgY2hhciAqIGRldmljZV9uYW1lID0gTlVMTDsKc3RhdGljIGludCBJTjsKc3RhdGljIGludCByZXBhaXI9MCwgYXV0b21hdGljPTAsIHZlcmJvc2U9MCwgbGlzdD0wLCBzaG93PTAsIHdhcm5fbW9kZT0wLCAKCWZvcmNlPTA7CnN0YXRpYyBpbnQgZGlyZWN0b3J5PTAsIHJlZ3VsYXI9MCwgYmxvY2tkZXY9MCwgY2hhcmRldj0wLCBsaW5rcz0wLAoJCXN5bWxpbmtzPTAsIHRvdGFsPTA7CgpzdGF0aWMgaW50IGNoYW5nZWQgPSAwOyAvKiBmbGFncyBpZiB0aGUgZmlsZXN5c3RlbSBoYXMgYmVlbiBjaGFuZ2VkICovCnN0YXRpYyBpbnQgZXJyb3JzX3VuY29ycmVjdGVkID0gMDsgLyogZmxhZyBpZiBzb21lIGVycm9yIHdhcyBub3QgY29ycmVjdGVkICovCnN0YXRpYyBpbnQgZGlyc2l6ZSA9IDE2OwpzdGF0aWMgaW50IG5hbWVsZW4gPSAxNDsKc3RhdGljIGludCB2ZXJzaW9uMiA9IDA7CnN0YXRpYyBzdHJ1Y3QgdGVybWlvcyB0ZXJtaW9zOwpzdGF0aWMgaW50IHRlcm1pb3Nfc2V0ID0gMDsKCi8qIEZpbGUtbmFtZSBkYXRhICovCiNkZWZpbmUgTUFYX0RFUFRIIDUwCnN0YXRpYyBpbnQgbmFtZV9kZXB0aCA9IDA7CnN0YXRpYyBjaGFyIG5hbWVfbGlzdFtNQVhfREVQVEhdW05BTUVfTUFYKzFdOwoKc3RhdGljIGNoYXIgKiBpbm9kZV9idWZmZXIgPSBOVUxMOwojZGVmaW5lIElub2RlICgoKHN0cnVjdCBtaW5peF9pbm9kZSAqKSBpbm9kZV9idWZmZXIpLTEpCiNkZWZpbmUgSW5vZGUyICgoKHN0cnVjdCBtaW5peDJfaW5vZGUgKikgaW5vZGVfYnVmZmVyKS0xKQpzdGF0aWMgY2hhciBzdXBlcl9ibG9ja19idWZmZXJbQkxPQ0tfU0laRV07CiNkZWZpbmUgU3VwZXIgKCooc3RydWN0IG1pbml4X3N1cGVyX2Jsb2NrICopc3VwZXJfYmxvY2tfYnVmZmVyKQojZGVmaW5lIElOT0RFUyAoKHVuc2lnbmVkIGxvbmcpU3VwZXIuc19uaW5vZGVzKQojaWZkZWYgSEFWRV9NSU5JWDIKI2RlZmluZSBaT05FUyAoKHVuc2lnbmVkIGxvbmcpKHZlcnNpb24yID8gU3VwZXIuc196b25lcyA6IFN1cGVyLnNfbnpvbmVzKSkKI2Vsc2UKI2RlZmluZSBaT05FUyAoKHVuc2lnbmVkIGxvbmcpKFN1cGVyLnNfbnpvbmVzKSkKI2VuZGlmCiNkZWZpbmUgSU1BUFMgKCh1bnNpZ25lZCBsb25nKVN1cGVyLnNfaW1hcF9ibG9ja3MpCiNkZWZpbmUgWk1BUFMgKCh1bnNpZ25lZCBsb25nKVN1cGVyLnNfem1hcF9ibG9ja3MpCiNkZWZpbmUgRklSU1RaT05FICgodW5zaWduZWQgbG9uZylTdXBlci5zX2ZpcnN0ZGF0YXpvbmUpCiNkZWZpbmUgWk9ORVNJWkUgKCh1bnNpZ25lZCBsb25nKVN1cGVyLnNfbG9nX3pvbmVfc2l6ZSkKI2RlZmluZSBNQVhTSVpFICgodW5zaWduZWQgbG9uZylTdXBlci5zX21heF9zaXplKQojZGVmaW5lIE1BR0lDIChTdXBlci5zX21hZ2ljKQojZGVmaW5lIE5PUk1fRklSU1RaT05FICgyK0lNQVBTK1pNQVBTK0lOT0RFX0JMT0NLUykKCnN0YXRpYyBjaGFyICppbm9kZV9tYXA7CnN0YXRpYyBjaGFyICp6b25lX21hcDsKCnN0YXRpYyB1bnNpZ25lZCBjaGFyICogaW5vZGVfY291bnQgPSBOVUxMOwpzdGF0aWMgdW5zaWduZWQgY2hhciAqIHpvbmVfY291bnQgPSBOVUxMOwoKc3RhdGljIHZvaWQgcmVjdXJzaXZlX2NoZWNrKHVuc2lnbmVkIGludCBpbm8pOwpzdGF0aWMgdm9pZCByZWN1cnNpdmVfY2hlY2syKHVuc2lnbmVkIGludCBpbm8pOwoKI2RlZmluZSBpbm9kZV9pbl91c2UoeCkgKGJpdChpbm9kZV9tYXAsKHgpKSkKI2RlZmluZSB6b25lX2luX3VzZSh4KSAoYml0KHpvbmVfbWFwLCh4KS1GSVJTVFpPTkUrMSkpCgojZGVmaW5lIG1hcmtfaW5vZGUoeCkgKHNldGJpdChpbm9kZV9tYXAsKHgpKSxjaGFuZ2VkPTEpCiNkZWZpbmUgdW5tYXJrX2lub2RlKHgpIChjbHJiaXQoaW5vZGVfbWFwLCh4KSksY2hhbmdlZD0xKQoKI2RlZmluZSBtYXJrX3pvbmUoeCkgKHNldGJpdCh6b25lX21hcCwoeCktRklSU1RaT05FKzEpLGNoYW5nZWQ9MSkKI2RlZmluZSB1bm1hcmtfem9uZSh4KSAoY2xyYml0KHpvbmVfbWFwLCh4KS1GSVJTVFpPTkUrMSksY2hhbmdlZD0xKQoKc3RhdGljIHZvaWQgbGVhdmUoaW50KSBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKTsKc3RhdGljIHZvaWQgbGVhdmUoaW50IHN0YXR1cykKewoJaWYgKHRlcm1pb3Nfc2V0KQoJCXRjc2V0YXR0cigwLCBUQ1NBTk9XLCAmdGVybWlvcyk7CglleGl0KHN0YXR1cyk7Cn0KCnN0YXRpYyB2b2lkIHNob3dfdXNhZ2Uodm9pZCkgewoJZnByaW50ZihzdGRlcnIsCgkJIlVzYWdlOiAlcyBbLWxhcnZzbWZdIC9kZXYvbmFtZVxuIiwKCQlwcm9ncmFtX25hbWUpOwoJbGVhdmUoMTYpOwp9CgpzdGF0aWMgdm9pZCBkaWUoY29uc3QgY2hhciAqc3RyKSB7CglmcHJpbnRmKHN0ZGVyciwgIiVzOiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBzdHIpOwoJbGVhdmUoOCk7Cn0KCi8qCiAqIFRoaXMgc2ltcGx5IGdvZXMgdGhyb3VnaCB0aGUgZmlsZS1uYW1lIGRhdGEgYW5kIHByaW50cyBvdXQgdGhlCiAqIGN1cnJlbnQgZmlsZS4KICovCnN0YXRpYyB2b2lkIHByaW50X2N1cnJlbnRfbmFtZSh2b2lkKQp7CglpbnQgaT0wOwoKCXdoaWxlIChpPG5hbWVfZGVwdGgpCgkJcHJpbnRmKCIvJS4qcyIsbmFtZWxlbixuYW1lX2xpc3RbaSsrXSk7CglpZiAoaSA9PSAwKQoJCXByaW50ZiAoIi8iKTsKfQoKc3RhdGljIGludCBhc2soY29uc3QgY2hhciAqIHN0cmluZywgaW50IGRlZikKewoJaW50IGM7CgoJaWYgKCFyZXBhaXIpIHsKCQlwcmludGYoIlxuIik7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQlyZXR1cm4gMDsKCX0KCWlmIChhdXRvbWF0aWMpIHsKCQlwcmludGYoIlxuIik7CgkJaWYgKCFkZWYpCgkJICAgICAgZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQlyZXR1cm4gZGVmOwoJfQoJcHJpbnRmKGRlZj8iJXMgKHkvbik/ICI6IiVzIChuL3kpPyAiLHN0cmluZyk7Cglmb3IgKDs7KSB7CgkJZmZsdXNoKHN0ZG91dCk7CgkJaWYgKChjPWdldGNoYXIoKSk9PUVPRikgewoJCSAgICAgICAgaWYgKCFkZWYpCgkJCSAgICAgIGVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJCXJldHVybiBkZWY7CgkJfQoJCWM9dG91cHBlcihjKTsKCQlpZiAoYyA9PSAnWScpIHsKCQkJZGVmID0gMTsKCQkJYnJlYWs7CgkJfSBlbHNlIGlmIChjID09ICdOJykgewoJCQlkZWYgPSAwOwoJCQlicmVhazsKCQl9IGVsc2UgaWYgKGMgPT0gJyAnIHx8IGMgPT0gJ1xuJykKCQkJYnJlYWs7Cgl9CglpZiAoZGVmKQoJCXByaW50ZigieVxuIik7CgllbHNlIHsKCQlwcmludGYoIm5cbiIpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkgICAgIH0KCXJldHVybiBkZWY7Cn0KCi8qCiAqIE1ha2UgY2VydGFpbiB0aGF0IHdlIGFyZW4ndCBjaGVja2luZyBhIGZpbGVzeXN0ZW0gdGhhdCBpcyBvbiBhCiAqIG1vdW50ZWQgcGFydGl0aW9uLiAgQ29kZSBhZGFwdGVkIGZyb20gZTJmc2NrLCBDb3B5cmlnaHQgKEMpIDE5OTMsCiAqIDE5OTQgVGhlb2RvcmUgVHMnby4gIEFsc28gbGljZW5zZWQgdW5kZXIgR1BMLgogKi8Kc3RhdGljIHZvaWQgY2hlY2tfbW91bnQodm9pZCkKewoJRklMRSAqIGY7CglzdHJ1Y3QgbW50ZW50ICogbW50OwoJaW50IGNvbnQ7CglpbnQgZmQ7CgoJaWYgKChmID0gc2V0bW50ZW50IChNT1VOVEVELCAiciIpKSA9PSBOVUxMKQoJCXJldHVybjsKCXdoaWxlICgobW50ID0gZ2V0bW50ZW50IChmKSkgIT0gTlVMTCkKCQlpZiAoc3RyY21wIChkZXZpY2VfbmFtZSwgbW50LT5tbnRfZnNuYW1lKSA9PSAwKQoJCQlicmVhazsKCWVuZG1udGVudCAoZik7CglpZiAoIW1udCkKCQlyZXR1cm47CgoJLyoKCSAqIElmIHRoZSByb290IGlzIG1vdW50ZWQgcmVhZC1vbmx5LCB0aGVuIC9ldGMvbXRhYiBpcwoJICogcHJvYmFibHkgbm90IGNvcnJlY3Q7IHNvIHdlIHdvbid0IGlzc3VlIGEgd2FybmluZyBiYXNlZCBvbgoJICogaXQuCgkgKi8KCWZkID0gb3BlbihNT1VOVEVELCBPX1JEV1IpOwoJaWYgKGZkIDwgMCAmJiBlcnJubyA9PSBFUk9GUykKCQlyZXR1cm47CgllbHNlCgkJY2xvc2UoZmQpOwoJCglwcmludGYgKCIlcyBpcyBtb3VudGVkLgkgIiwgZGV2aWNlX25hbWUpOwoJaWYgKGlzYXR0eSgwKSAmJiBpc2F0dHkoMSkpCgkJY29udCA9IGFzaygiRG8geW91IHJlYWxseSB3YW50IHRvIGNvbnRpbnVlIiwgMCk7CgllbHNlCgkJY29udCA9IDA7CglpZiAoIWNvbnQpIHsKCQlwcmludGYgKCJjaGVjayBhYm9ydGVkLlxuIik7CgkJZXhpdCAoMCk7Cgl9CglyZXR1cm47Cn0KCi8qCiAqIGNoZWNrX3pvbmVfbnIgY2hlY2tzIHRvIHNlZSB0aGF0ICpuciBpcyBhIHZhbGlkIHpvbmUgbnIuIElmIGl0CiAqIGlzbid0LCBpdCB3aWxsIHBvc3NpYmx5IGJlIHJlcGFpcmVkLiBDaGVja196b25lX25yIHNldHMgKmNvcnJlY3RlZAogKiBpZiBhbiBlcnJvciB3YXMgY29ycmVjdGVkLCBhbmQgcmV0dXJucyB0aGUgem9uZSAoMCBmb3Igbm8gem9uZQogKiBvciBhIGJhZCB6b25lLW51bWJlcikuCiAqLwpzdGF0aWMgaW50IGNoZWNrX3pvbmVfbnIodW5zaWduZWQgc2hvcnQgKiBuciwgaW50ICogY29ycmVjdGVkKQp7CglpZiAoISpucikKCQlyZXR1cm4gMDsKCWlmICgqbnIgPCBGSVJTVFpPTkUpCgkJcHJpbnRmKCJab25lIG5yIDwgRklSU1RaT05FIGluIGZpbGUgYCIpOwoJZWxzZSBpZiAoKm5yID49IFpPTkVTKQoJCXByaW50ZigiWm9uZSBuciA+PSBaT05FUyBpbiBmaWxlIGAiKTsKCWVsc2UKCQlyZXR1cm4gKm5yOwoJcHJpbnRfY3VycmVudF9uYW1lKCk7CglwcmludGYoIicuIik7CglpZiAoYXNrKCJSZW1vdmUgYmxvY2siLDEpKSB7CgkJKm5yID0gMDsKCQkqY29ycmVjdGVkID0gMTsKCX0KCXJldHVybiAwOwp9CgojaWZkZWYgSEFWRV9NSU5JWDIKc3RhdGljIGludCBjaGVja196b25lX25yMiAodW5zaWduZWQgaW50ICpuciwgaW50ICpjb3JyZWN0ZWQpCnsKCWlmICghKm5yKQoJCXJldHVybiAwOwoJaWYgKCpuciA8IEZJUlNUWk9ORSkKCQlwcmludGYgKCJab25lIG5yIDwgRklSU1RaT05FIGluIGZpbGUgYCIpOwoJZWxzZSBpZiAoKm5yID49IFpPTkVTKQoJCXByaW50ZiAoIlpvbmUgbnIgPj0gWk9ORVMgaW4gZmlsZSBgIik7CgllbHNlCgkJcmV0dXJuICpucjsKCXByaW50X2N1cnJlbnRfbmFtZSAoKTsKCXByaW50ZiAoIicuIik7CglpZiAoYXNrICgiUmVtb3ZlIGJsb2NrIiwgMSkpIHsKCQkqbnIgPSAwOwoJCSpjb3JyZWN0ZWQgPSAxOwoJfQoJcmV0dXJuIDA7Cn0KI2VuZGlmCgovKgogKiByZWFkLWJsb2NrIHJlYWRzIGJsb2NrIG5yIGludG8gdGhlIGJ1ZmZlciBhdCBhZGRyLgogKi8Kc3RhdGljIHZvaWQgcmVhZF9ibG9jayh1bnNpZ25lZCBpbnQgbnIsIGNoYXIgKiBhZGRyKQp7CglpZiAoIW5yKSB7CgkJbWVtc2V0KGFkZHIsMCxCTE9DS19TSVpFKTsKCQlyZXR1cm47Cgl9CglpZiAoQkxPQ0tfU0laRSpuciAhPSBsc2VlayhJTiwgQkxPQ0tfU0laRSpuciwgU0VFS19TRVQpKSB7CgkJcHJpbnRmKCJSZWFkIGVycm9yOiB1bmFibGUgdG8gc2VlayB0byBibG9jayBpbiBmaWxlICciKTsKCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQlwcmludGYoIidcbiIpOwoJCW1lbXNldChhZGRyLDAsQkxPQ0tfU0laRSk7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0gZWxzZSBpZiAoQkxPQ0tfU0laRSAhPSByZWFkKElOLCBhZGRyLCBCTE9DS19TSVpFKSkgewoJCXByaW50ZigiUmVhZCBlcnJvcjogYmFkIGJsb2NrIGluIGZpbGUgJyIpOwoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiJ1xuIik7CgkJbWVtc2V0KGFkZHIsMCxCTE9DS19TSVpFKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQp9CgovKgogKiB3cml0ZV9ibG9jayB3cml0ZXMgYmxvY2sgbnIgdG8gZGlzay4KICovCnN0YXRpYyB2b2lkIHdyaXRlX2Jsb2NrKHVuc2lnbmVkIGludCBuciwgY2hhciAqIGFkZHIpCnsKCWlmICghbnIpCgkJcmV0dXJuOwoJaWYgKG5yIDwgRklSU1RaT05FIHx8IG5yID49IFpPTkVTKSB7CgkJcHJpbnRmKCJJbnRlcm5hbCBlcnJvcjogdHJ5aW5nIHRvIHdyaXRlIGJhZCBibG9ja1xuIgoJCSJXcml0ZSByZXF1ZXN0IGlnbm9yZWRcbiIpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJcmV0dXJuOwoJfQoJaWYgKEJMT0NLX1NJWkUqbnIgIT0gbHNlZWsoSU4sIEJMT0NLX1NJWkUqbnIsIFNFRUtfU0VUKSkKCQlkaWUoInNlZWsgZmFpbGVkIGluIHdyaXRlX2Jsb2NrIik7CglpZiAoQkxPQ0tfU0laRSAhPSB3cml0ZShJTiwgYWRkciwgQkxPQ0tfU0laRSkpIHsKCQlwcmludGYoIldyaXRlIGVycm9yOiBiYWQgYmxvY2sgaW4gZmlsZSAnIik7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCInXG4iKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQp9CgovKgogKiBtYXAtYmxvY2sgY2FsY3VsYXRlcyB0aGUgYWJzb2x1dGUgYmxvY2sgbnIgb2YgYSBibG9jayBpbiBhIGZpbGUuCiAqIEl0IHNldHMgJ2NoYW5nZWQnIGlmIHRoZSBpbm9kZSBoYXMgbmVlZGVkIGNoYW5naW5nLCBhbmQgcmUtd3JpdGVzCiAqIGFueSBpbmRpcmVjdCBibG9ja3Mgd2l0aCBlcnJvcnMuCiAqLwpzdGF0aWMgaW50IG1hcF9ibG9jayhzdHJ1Y3QgbWluaXhfaW5vZGUgKiBpbm9kZSwgdW5zaWduZWQgaW50IGJsa25yKQp7Cgl1bnNpZ25lZCBzaG9ydCBpbmRbQkxPQ0tfU0laRT4+MV07Cgl1bnNpZ25lZCBzaG9ydCBkaW5kW0JMT0NLX1NJWkU+PjFdOwoJaW50IGJsa19jaGcsIGJsb2NrLCByZXN1bHQ7CgoJaWYgKGJsa25yPDcpCgkJcmV0dXJuIGNoZWNrX3pvbmVfbnIoaW5vZGUtPmlfem9uZSArIGJsa25yLCAmY2hhbmdlZCk7CglibGtuciAtPSA3OwoJaWYgKGJsa25yPDUxMikgewoJCWJsb2NrID0gY2hlY2tfem9uZV9ucihpbm9kZS0+aV96b25lICsgNywgJmNoYW5nZWQpOwoJCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CgkJYmxrX2NoZyA9IDA7CgkJcmVzdWx0ID0gY2hlY2tfem9uZV9ucihibGtuciArIGluZCwgJmJsa19jaGcpOwoJCWlmIChibGtfY2hnKQoJCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCQlyZXR1cm4gcmVzdWx0OwoJfQoJYmxrbnIgLT0gNTEyOwoJYmxvY2sgPSBjaGVja196b25lX25yKGlub2RlLT5pX3pvbmUgKyA4LCAmY2hhbmdlZCk7CglyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBkaW5kKTsKCWJsa19jaGcgPSAwOwoJcmVzdWx0ID0gY2hlY2tfem9uZV9ucihkaW5kICsgKGJsa25yLzUxMiksICZibGtfY2hnKTsKCWlmIChibGtfY2hnKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBkaW5kKTsKCWJsb2NrID0gcmVzdWx0OwoJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCWJsa19jaGcgPSAwOwoJcmVzdWx0ID0gY2hlY2tfem9uZV9ucihpbmQgKyAoYmxrbnIlNTEyKSwgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CglyZXR1cm4gcmVzdWx0Owp9CgojaWZkZWYgSEFWRV9NSU5JWDIKc3RhdGljIGludCBtYXBfYmxvY2syIChzdHJ1Y3QgbWluaXgyX2lub2RlICppbm9kZSwgdW5zaWduZWQgaW50IGJsa25yKQp7CiAgCXVuc2lnbmVkIGludCBpbmRbQkxPQ0tfU0laRSA+PiAyXTsKCXVuc2lnbmVkIGludCBkaW5kW0JMT0NLX1NJWkUgPj4gMl07Cgl1bnNpZ25lZCBpbnQgdGluZFtCTE9DS19TSVpFID4+IDJdOwoJaW50IGJsa19jaGcsIGJsb2NrLCByZXN1bHQ7CgoJaWYgKGJsa25yIDwgNykKCQlyZXR1cm4gY2hlY2tfem9uZV9ucjIgKGlub2RlLT5pX3pvbmUgKyBibGtuciwgJmNoYW5nZWQpOwoJYmxrbnIgLT0gNzsKCWlmIChibGtuciA8IDI1NikgewoJCWJsb2NrID0gY2hlY2tfem9uZV9ucjIgKGlub2RlLT5pX3pvbmUgKyA3LCAmY2hhbmdlZCk7CgkJcmVhZF9ibG9jayAoYmxvY2ssIChjaGFyICopIGluZCk7CgkJYmxrX2NoZyA9IDA7CgkJcmVzdWx0ID0gY2hlY2tfem9uZV9ucjIgKGJsa25yICsgaW5kLCAmYmxrX2NoZyk7CgkJaWYgKGJsa19jaGcpCgkJCXdyaXRlX2Jsb2NrIChibG9jaywgKGNoYXIgKikgaW5kKTsKCQlyZXR1cm4gcmVzdWx0OwoJfQoJYmxrbnIgLT0gMjU2OwoJaWYgKGJsa25yID49IDI1NiAqIDI1NikgewoJCWJsb2NrID0gY2hlY2tfem9uZV9ucjIgKGlub2RlLT5pX3pvbmUgKyA4LCAmY2hhbmdlZCk7CgkJcmVhZF9ibG9jayAoYmxvY2ssIChjaGFyICopIGRpbmQpOwoJCWJsa19jaGcgPSAwOwoJCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyIChkaW5kICsgYmxrbnIgLyAyNTYsICZibGtfY2hnKTsKCQlpZiAoYmxrX2NoZykKCQkJd3JpdGVfYmxvY2sgKGJsb2NrLCAoY2hhciAqKSBkaW5kKTsKCQlibG9jayA9IHJlc3VsdDsKCQlyZWFkX2Jsb2NrIChibG9jaywgKGNoYXIgKikgaW5kKTsKCQlibGtfY2hnID0gMDsKCQlyZXN1bHQgPSBjaGVja196b25lX25yMiAoaW5kICsgYmxrbnIgJSAyNTYsICZibGtfY2hnKTsKCQlpZiAoYmxrX2NoZykKCQkJd3JpdGVfYmxvY2sgKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJCXJldHVybiByZXN1bHQ7Cgl9CglibGtuciAtPSAyNTYgKiAyNTY7CglibG9jayA9IGNoZWNrX3pvbmVfbnIyIChpbm9kZS0+aV96b25lICsgOSwgJmNoYW5nZWQpOwoJcmVhZF9ibG9jayAoYmxvY2ssIChjaGFyICopIHRpbmQpOwoJYmxrX2NoZyA9IDA7CglyZXN1bHQgPSBjaGVja196b25lX25yMiAodGluZCArIGJsa25yIC8gKDI1NiAqIDI1NiksICZibGtfY2hnKTsKCWlmIChibGtfY2hnKQoJCXdyaXRlX2Jsb2NrIChibG9jaywgKGNoYXIgKikgdGluZCk7CglibG9jayA9IHJlc3VsdDsKCXJlYWRfYmxvY2sgKGJsb2NrLCAoY2hhciAqKSBkaW5kKTsKCWJsa19jaGcgPSAwOwoJcmVzdWx0ID0gY2hlY2tfem9uZV9ucjIgKGRpbmQgKyAoYmxrbnIgLyAyNTYpICUgMjU2LCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayAoYmxvY2ssIChjaGFyICopIGRpbmQpOwoJYmxvY2sgPSByZXN1bHQ7CglyZWFkX2Jsb2NrIChibG9jaywgKGNoYXIgKikgaW5kKTsKCWJsa19jaGcgPSAwOwoJcmVzdWx0ID0gY2hlY2tfem9uZV9ucjIgKGluZCArIGJsa25yICUgMjU2LCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayAoYmxvY2ssIChjaGFyICopIGluZCk7CglyZXR1cm4gcmVzdWx0Owp9CiNlbmRpZgoKc3RhdGljIHZvaWQgd3JpdGVfc3VwZXJfYmxvY2sodm9pZCkKewoJLyoKCSAqIFNldCB0aGUgc3RhdGUgb2YgdGhlIGZpbGVzeXN0ZW0gYmFzZWQgb24gd2hldGhlciBvciBub3QgdGhlcmUKCSAqIGFyZSB1bmNvcnJlY3RlZCBlcnJvcnMuICBUaGUgZmlsZXN5c3RlbSB2YWxpZCBmbGFnIGlzCgkgKiB1bmNvbmRpdGlvbmFsbHkgc2V0IGlmIHdlIGdldCB0aGlzIGZhci4KCSAqLwoJU3VwZXIuc19zdGF0ZSB8PSBNSU5JWF9WQUxJRF9GUzsKCWlmICggZXJyb3JzX3VuY29ycmVjdGVkICkKCQlTdXBlci5zX3N0YXRlIHw9IE1JTklYX0VSUk9SX0ZTOwoJZWxzZQoJCVN1cGVyLnNfc3RhdGUgJj0gfk1JTklYX0VSUk9SX0ZTOwoJCglpZiAoQkxPQ0tfU0laRSAhPSBsc2VlayhJTiwgQkxPQ0tfU0laRSwgU0VFS19TRVQpKQoJCWRpZSgic2VlayBmYWlsZWQgaW4gd3JpdGVfc3VwZXJfYmxvY2siKTsKCWlmIChCTE9DS19TSVpFICE9IHdyaXRlKElOLCBzdXBlcl9ibG9ja19idWZmZXIsIEJMT0NLX1NJWkUpKQoJCWRpZSgidW5hYmxlIHRvIHdyaXRlIHN1cGVyLWJsb2NrIik7CgoJcmV0dXJuOwp9CgpzdGF0aWMgdm9pZCB3cml0ZV90YWJsZXModm9pZCkKewoJd3JpdGVfc3VwZXJfYmxvY2soKTsKCglpZiAoSU1BUFMqQkxPQ0tfU0laRSAhPSB3cml0ZShJTixpbm9kZV9tYXAsSU1BUFMqQkxPQ0tfU0laRSkpCgkJZGllKCJVbmFibGUgdG8gd3JpdGUgaW5vZGUgbWFwIik7CglpZiAoWk1BUFMqQkxPQ0tfU0laRSAhPSB3cml0ZShJTix6b25lX21hcCxaTUFQUypCTE9DS19TSVpFKSkKCQlkaWUoIlVuYWJsZSB0byB3cml0ZSB6b25lIG1hcCIpOwoJaWYgKElOT0RFX0JVRkZFUl9TSVpFICE9IHdyaXRlKElOLGlub2RlX2J1ZmZlcixJTk9ERV9CVUZGRVJfU0laRSkpCgkJZGllKCJVbmFibGUgdG8gd3JpdGUgaW5vZGVzIik7Cn0KCnN0YXRpYyB2b2lkIGdldF9kaXJzaXplICh2b2lkKQp7CglpbnQgYmxvY2s7CgljaGFyIGJsa1tCTE9DS19TSVpFXTsKCWludCBzaXplOwoKI2lmIEhBVkVfTUlOSVgyCglpZiAodmVyc2lvbjIpCgkJYmxvY2sgPSBJbm9kZTJbUk9PVF9JTk9dLmlfem9uZVswXTsKCWVsc2UKI2VuZGlmCgkJYmxvY2sgPSBJbm9kZVtST09UX0lOT10uaV96b25lWzBdOwoJcmVhZF9ibG9jayAoYmxvY2ssIGJsayk7Cglmb3IgKHNpemUgPSAxNjsgc2l6ZSA8IEJMT0NLX1NJWkU7IHNpemUgPDw9IDEpIHsKCQlpZiAoc3RyY21wIChibGsgKyBzaXplICsgMiwgIi4uIikgPT0gMCkgewoJCQlkaXJzaXplID0gc2l6ZTsKCQkJbmFtZWxlbiA9IHNpemUgLSAyOwoJCQlyZXR1cm47CgkJfQoJfQoJLyogdXNlIGRlZmF1bHRzICovCn0KCnN0YXRpYyB2b2lkIHJlYWRfc3VwZXJibG9jayh2b2lkKQp7CglpZiAoQkxPQ0tfU0laRSAhPSBsc2VlayhJTiwgQkxPQ0tfU0laRSwgU0VFS19TRVQpKQoJCWRpZSgic2VlayBmYWlsZWQiKTsKCWlmIChCTE9DS19TSVpFICE9IHJlYWQoSU4sIHN1cGVyX2Jsb2NrX2J1ZmZlciwgQkxPQ0tfU0laRSkpCgkJZGllKCJ1bmFibGUgdG8gcmVhZCBzdXBlciBibG9jayIpOwoJaWYgKE1BR0lDID09IE1JTklYX1NVUEVSX01BR0lDKSB7CgkJbmFtZWxlbiA9IDE0OwoJCWRpcnNpemUgPSAxNjsKCQl2ZXJzaW9uMiA9IDA7Cgl9IGVsc2UgaWYgKE1BR0lDID09IE1JTklYX1NVUEVSX01BR0lDMikgewoJCW5hbWVsZW4gPSAzMDsKCQlkaXJzaXplID0gMzI7CgkJdmVyc2lvbjIgPSAwOwojaWZkZWYgSEFWRV9NSU5JWDIKCX0gZWxzZSBpZiAoTUFHSUMgPT0gTUlOSVgyX1NVUEVSX01BR0lDKSB7CgkJbmFtZWxlbiA9IDE0OwoJCWRpcnNpemUgPSAxNjsKCQl2ZXJzaW9uMiA9IDE7Cgl9IGVsc2UgaWYgKE1BR0lDID09IE1JTklYMl9TVVBFUl9NQUdJQzIpIHsKCQluYW1lbGVuID0gMzA7CgkJZGlyc2l6ZSA9IDMyOwoJCXZlcnNpb24yID0gMTsKI2VuZGlmCgl9IGVsc2UKCQlkaWUoImJhZCBtYWdpYyBudW1iZXIgaW4gc3VwZXItYmxvY2siKTsKCWlmIChaT05FU0laRSAhPSAwIHx8IEJMT0NLX1NJWkUgIT0gMTAyNCkKCQlkaWUoIk9ubHkgMWsgYmxvY2tzL3pvbmVzIHN1cHBvcnRlZCIpOwoJaWYgKElNQVBTICogQkxPQ0tfU0laRSAqIDggPCBJTk9ERVMgKyAxKQoJCWRpZSgiYmFkIHNfaW1hcF9ibG9ja3MgZmllbGQgaW4gc3VwZXItYmxvY2siKTsKCWlmIChaTUFQUyAqIEJMT0NLX1NJWkUgKiA4IDwgWk9ORVMgLSBGSVJTVFpPTkUgKyAxKQoJCWRpZSgiYmFkIHNfem1hcF9ibG9ja3MgZmllbGQgaW4gc3VwZXItYmxvY2siKTsKfQoKc3RhdGljIHZvaWQgcmVhZF90YWJsZXModm9pZCkKewoJaW5vZGVfbWFwID0gbWFsbG9jKElNQVBTICogQkxPQ0tfU0laRSk7CglpZiAoIWlub2RlX21hcCkKCQlkaWUoIlVuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIGlub2RlIG1hcCIpOwoJem9uZV9tYXAgPSBtYWxsb2MoWk1BUFMgKiBCTE9DS19TSVpFKTsKCWlmICghaW5vZGVfbWFwKQoJCWRpZSgiVW5hYmxlIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3Igem9uZSBtYXAiKTsKCW1lbXNldChpbm9kZV9tYXAsMCxzaXplb2YoaW5vZGVfbWFwKSk7CgltZW1zZXQoem9uZV9tYXAsMCxzaXplb2Yoem9uZV9tYXApKTsKCWlub2RlX2J1ZmZlciA9IG1hbGxvYyhJTk9ERV9CVUZGRVJfU0laRSk7CglpZiAoIWlub2RlX2J1ZmZlcikKCQlkaWUoIlVuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIGlub2RlcyIpOwoJaW5vZGVfY291bnQgPSBtYWxsb2MoSU5PREVTICsgMSk7CglpZiAoIWlub2RlX2NvdW50KQoJCWRpZSgiVW5hYmxlIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3IgaW5vZGUgY291bnQiKTsKCXpvbmVfY291bnQgPSBtYWxsb2MoWk9ORVMpOwoJaWYgKCF6b25lX2NvdW50KQoJCWRpZSgiVW5hYmxlIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3Igem9uZSBjb3VudCIpOwoJaWYgKElNQVBTKkJMT0NLX1NJWkUgIT0gcmVhZChJTixpbm9kZV9tYXAsSU1BUFMqQkxPQ0tfU0laRSkpCgkJZGllKCJVbmFibGUgdG8gcmVhZCBpbm9kZSBtYXAiKTsKCWlmIChaTUFQUypCTE9DS19TSVpFICE9IHJlYWQoSU4sem9uZV9tYXAsWk1BUFMqQkxPQ0tfU0laRSkpCgkJZGllKCJVbmFibGUgdG8gcmVhZCB6b25lIG1hcCIpOwoJaWYgKElOT0RFX0JVRkZFUl9TSVpFICE9IHJlYWQoSU4saW5vZGVfYnVmZmVyLElOT0RFX0JVRkZFUl9TSVpFKSkKCQlkaWUoIlVuYWJsZSB0byByZWFkIGlub2RlcyIpOwoJaWYgKE5PUk1fRklSU1RaT05FICE9IEZJUlNUWk9ORSkgewoJCXByaW50ZigiV2FybmluZzogRmlyc3R6b25lICE9IE5vcm1fZmlyc3R6b25lXG4iKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQoJZ2V0X2RpcnNpemUgKCk7CglpZiAoc2hvdykgewoJCXByaW50ZigiJWxkIGlub2Rlc1xuIixJTk9ERVMpOwoJCXByaW50ZigiJWxkIGJsb2Nrc1xuIixaT05FUyk7CgkJcHJpbnRmKCJGaXJzdGRhdGF6b25lPSVsZCAoJWxkKVxuIixGSVJTVFpPTkUsTk9STV9GSVJTVFpPTkUpOwoJCXByaW50ZigiWm9uZXNpemU9JWRcbiIsQkxPQ0tfU0laRTw8Wk9ORVNJWkUpOwoJCXByaW50ZigiTWF4c2l6ZT0lbGRcbiIsTUFYU0laRSk7CgkJcHJpbnRmKCJGaWxlc3lzdGVtIHN0YXRlPSVkXG4iLCBTdXBlci5zX3N0YXRlKTsKCQlwcmludGYoIm5hbWVsZW49JWRcblxuIixuYW1lbGVuKTsKCX0KfQoKc3RydWN0IG1pbml4X2lub2RlICogZ2V0X2lub2RlKHVuc2lnbmVkIGludCBucikKewoJc3RydWN0IG1pbml4X2lub2RlICogaW5vZGU7CgoJaWYgKCFuciB8fCBuciA+IElOT0RFUykKCQlyZXR1cm4gTlVMTDsKCXRvdGFsKys7Cglpbm9kZSA9IElub2RlICsgbnI7CglpZiAoIWlub2RlX2NvdW50W25yXSkgewoJCWlmICghaW5vZGVfaW5fdXNlKG5yKSkgewoJCQlwcmludGYoIklub2RlICVkIG1hcmtlZCBub3QgdXNlZCwgYnV0IHVzZWQgZm9yIGZpbGUgJyIsCgkJCQlucik7CgkJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCQlwcmludGYoIidcbiIpOwoJCQlpZiAocmVwYWlyKSB7CgkJCQlpZiAoYXNrKCJNYXJrIGluIHVzZSIsMSkpCgkJCQkJbWFya19pbm9kZShucik7CgkJCX0gZWxzZSB7CgkJCSAgICAgICAgZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQkJfQoJCX0KCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQkJZGlyZWN0b3J5Kys7CgkJZWxzZSBpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKCQkJcmVndWxhcisrOwoJCWVsc2UgaWYgKFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkpCgkJCWNoYXJkZXYrKzsKCQllbHNlIGlmIChTX0lTQkxLKGlub2RlLT5pX21vZGUpKQoJCQlibG9ja2RldisrOwoJCWVsc2UgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCgkJCXN5bWxpbmtzKys7CgkJZWxzZSBpZiAoU19JU1NPQ0soaW5vZGUtPmlfbW9kZSkpCgkJCTsKCQllbHNlIGlmIChTX0lTRklGTyhpbm9kZS0+aV9tb2RlKSkKCQkJOwoJCWVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBwcmludF9jdXJyZW50X25hbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgaGFzIG1vZGUgJTA1b1xuIixpbm9kZS0+aV9tb2RlKTsKICAgICAgICAgICAgICAgIH0KCgl9IGVsc2UKCQlsaW5rcysrOwoJaWYgKCErK2lub2RlX2NvdW50W25yXSkgewoJCXByaW50ZigiV2FybmluZzogaW5vZGUgY291bnQgdG9vIGJpZy5cbiIpOwoJCWlub2RlX2NvdW50W25yXS0tOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9CglyZXR1cm4gaW5vZGU7Cn0KCiNpZmRlZiBIQVZFX01JTklYMgpzdHJ1Y3QgbWluaXgyX2lub2RlICoKZ2V0X2lub2RlMiAodW5zaWduZWQgaW50IG5yKQp7CglzdHJ1Y3QgbWluaXgyX2lub2RlICppbm9kZTsKCglpZiAoIW5yIHx8IG5yID4gSU5PREVTKQoJCXJldHVybiBOVUxMOwoJdG90YWwrKzsKCWlub2RlID0gSW5vZGUyICsgbnI7CglpZiAoIWlub2RlX2NvdW50W25yXSkgewoJCWlmICghaW5vZGVfaW5fdXNlIChucikpIHsKCQkJcHJpbnRmICgiSW5vZGUgJWQgbWFya2VkIG5vdCB1c2VkLCBidXQgdXNlZCBmb3IgZmlsZSAnIiwgbnIpOwoJCQlwcmludF9jdXJyZW50X25hbWUgKCk7CgkJCXByaW50ZiAoIidcbiIpOwoJCQlpZiAocmVwYWlyKSB7CgkJCQlpZiAoYXNrICgiTWFyayBpbiB1c2UiLCAxKSkKCQkJCQltYXJrX2lub2RlIChucik7CgkJCQllbHNlCgkJCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQkJfQoJCX0KCQlpZiAoU19JU0RJUiAoaW5vZGUtPmlfbW9kZSkpCgkJCWRpcmVjdG9yeSsrOwoJCWVsc2UgaWYgKFNfSVNSRUcgKGlub2RlLT5pX21vZGUpKQoJCQlyZWd1bGFyKys7CgkJZWxzZSBpZiAoU19JU0NIUiAoaW5vZGUtPmlfbW9kZSkpCgkJCWNoYXJkZXYrKzsKCQllbHNlIGlmIChTX0lTQkxLIChpbm9kZS0+aV9tb2RlKSkKCQkJYmxvY2tkZXYrKzsKCQllbHNlIGlmIChTX0lTTE5LIChpbm9kZS0+aV9tb2RlKSkKCQkJc3ltbGlua3MrKzsKCQllbHNlIGlmIChTX0lTU09DSyAoaW5vZGUtPmlfbW9kZSkpOwoJCWVsc2UgaWYgKFNfSVNGSUZPIChpbm9kZS0+aV9tb2RlKSk7CgkJZWxzZSB7CgkJCXByaW50X2N1cnJlbnRfbmFtZSAoKTsKCQkJcHJpbnRmICgiIGhhcyBtb2RlICUwNW9cbiIsIGlub2RlLT5pX21vZGUpOwoJCX0KCX0gZWxzZQoJCWxpbmtzKys7CglpZiAoISsraW5vZGVfY291bnRbbnJdKSB7CgkJcHJpbnRmICgiV2FybmluZzogaW5vZGUgY291bnQgdG9vIGJpZy5cbiIpOwoJCWlub2RlX2NvdW50W25yXS0tOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9CglyZXR1cm4gaW5vZGU7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBjaGVja19yb290KHZvaWQpCnsKCXN0cnVjdCBtaW5peF9pbm9kZSAqIGlub2RlID0gSW5vZGUgKyBST09UX0lOTzsKCglpZiAoIWlub2RlIHx8ICFTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCWRpZSgicm9vdCBpbm9kZSBpc24ndCBhIGRpcmVjdG9yeSIpOwp9CgojaWZkZWYgSEFWRV9NSU5JWDIKc3RhdGljIHZvaWQgY2hlY2tfcm9vdDIgKHZvaWQpCnsKCXN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlID0gSW5vZGUyICsgUk9PVF9JTk87CgoJaWYgKCFpbm9kZSB8fCAhU19JU0RJUiAoaW5vZGUtPmlfbW9kZSkpCgkJZGllICgicm9vdCBpbm9kZSBpc24ndCBhIGRpcmVjdG9yeSIpOwp9CiNlbmRpZgoKc3RhdGljIGludCBhZGRfem9uZSh1bnNpZ25lZCBzaG9ydCAqIHpuciwgaW50ICogY29ycmVjdGVkKQp7CglpbnQgcmVzdWx0OwoJaW50IGJsb2NrOwoKCXJlc3VsdCA9IDA7CglibG9jayA9IGNoZWNrX3pvbmVfbnIoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm4gMDsKCWlmICh6b25lX2NvdW50W2Jsb2NrXSkgewoJCXByaW50ZigiQmxvY2sgaGFzIGJlZW4gdXNlZCBiZWZvcmUuIE5vdyBpbiBmaWxlIGAiKTsKCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQlwcmludGYoIicuIik7CgkJaWYgKGFzaygiQ2xlYXIiLDEpKSB7CgkJCSp6bnIgPSAwOwoJCQlibG9jayA9IDA7CgkJCSpjb3JyZWN0ZWQgPSAxOwoJCX0KCX0KCWlmICghYmxvY2spCgkJcmV0dXJuIDA7CglpZiAoIXpvbmVfaW5fdXNlKGJsb2NrKSkgewoJCXByaW50ZigiQmxvY2sgJWQgaW4gZmlsZSBgIixibG9jayk7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCInIGlzIG1hcmtlZCBub3QgaW4gdXNlLiIpOwoJCWlmIChhc2soIkNvcnJlY3QiLDEpKQoJCQltYXJrX3pvbmUoYmxvY2spOwoJfQoJaWYgKCErK3pvbmVfY291bnRbYmxvY2tdKQoJCXpvbmVfY291bnRbYmxvY2tdLS07CglyZXR1cm4gYmxvY2s7Cn0KCiNpZmRlZiBIQVZFX01JTklYMgpzdGF0aWMgaW50IGFkZF96b25lMiAodW5zaWduZWQgaW50ICp6bnIsIGludCAqY29ycmVjdGVkKQp7CglpbnQgcmVzdWx0OwoJaW50IGJsb2NrOwoKCXJlc3VsdCA9IDA7CglibG9jayA9IGNoZWNrX3pvbmVfbnIyICh6bnIsIGNvcnJlY3RlZCk7CglpZiAoIWJsb2NrKQoJCXJldHVybiAwOwoJaWYgKHpvbmVfY291bnRbYmxvY2tdKSB7CgkJcHJpbnRmICgiQmxvY2sgaGFzIGJlZW4gdXNlZCBiZWZvcmUuIE5vdyBpbiBmaWxlIGAiKTsKCQlwcmludF9jdXJyZW50X25hbWUgKCk7CgkJcHJpbnRmICgiJy4iKTsKCQlpZiAoYXNrICgiQ2xlYXIiLCAxKSkgewoJCQkqem5yID0gMDsKCQkJYmxvY2sgPSAwOwoJCQkqY29ycmVjdGVkID0gMTsKCQl9Cgl9CglpZiAoIWJsb2NrKQoJCXJldHVybiAwOwoJaWYgKCF6b25lX2luX3VzZSAoYmxvY2spKSB7CgkJcHJpbnRmICgiQmxvY2sgJWQgaW4gZmlsZSBgIiwgYmxvY2spOwoJCXByaW50X2N1cnJlbnRfbmFtZSAoKTsKCQlwcmludGYgKCInIGlzIG1hcmtlZCBub3QgaW4gdXNlLiIpOwoJCWlmIChhc2sgKCJDb3JyZWN0IiwgMSkpCgkJCW1hcmtfem9uZSAoYmxvY2spOwoJfQoJaWYgKCErK3pvbmVfY291bnRbYmxvY2tdKQoJCXpvbmVfY291bnRbYmxvY2tdLS07CglyZXR1cm4gYmxvY2s7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBhZGRfem9uZV9pbmQodW5zaWduZWQgc2hvcnQgKiB6bnIsIGludCAqIGNvcnJlY3RlZCkKewoJc3RhdGljIGNoYXIgYmxrW0JMT0NLX1NJWkVdOwoJaW50IGksIGNoZ19ibGs9MDsKCWludCBibG9jazsKCglibG9jayA9IGFkZF96b25lKHpuciwgY29ycmVjdGVkKTsKCWlmICghYmxvY2spCgkJcmV0dXJuOwoJcmVhZF9ibG9jayhibG9jaywgYmxrKTsKCWZvciAoaT0wIDsgaSA8IChCTE9DS19TSVpFPj4xKSA7IGkrKykKCQlhZGRfem9uZShpICsgKHVuc2lnbmVkIHNob3J0ICopIGJsaywgJmNoZ19ibGspOwoJaWYgKGNoZ19ibGspCgkJd3JpdGVfYmxvY2soYmxvY2ssIGJsayk7Cn0KCiNpZmRlZiBIQVZFX01JTklYMgpzdGF0aWMgdm9pZAphZGRfem9uZV9pbmQyICh1bnNpZ25lZCBpbnQgKnpuciwgaW50ICpjb3JyZWN0ZWQpCnsKCXN0YXRpYyBjaGFyIGJsa1tCTE9DS19TSVpFXTsKCWludCBpLCBjaGdfYmxrID0gMDsKCWludCBibG9jazsKCglibG9jayA9IGFkZF96b25lMiAoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm47CglyZWFkX2Jsb2NrIChibG9jaywgYmxrKTsKCWZvciAoaSA9IDA7IGkgPCBCTE9DS19TSVpFID4+IDI7IGkrKykKCQlhZGRfem9uZTIgKGkgKyAodW5zaWduZWQgaW50ICopIGJsaywgJmNoZ19ibGspOwoJaWYgKGNoZ19ibGspCgkJd3JpdGVfYmxvY2sgKGJsb2NrLCBibGspOwp9CiNlbmRpZgoKc3RhdGljIHZvaWQgYWRkX3pvbmVfZGluZCh1bnNpZ25lZCBzaG9ydCAqIHpuciwgaW50ICogY29ycmVjdGVkKQp7CglzdGF0aWMgY2hhciBibGtbQkxPQ0tfU0laRV07CglpbnQgaSwgYmxrX2NoZz0wOwoJaW50IGJsb2NrOwoKCWJsb2NrID0gYWRkX3pvbmUoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm47CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJZm9yIChpPTAgOyBpIDwgKEJMT0NLX1NJWkU+PjEpIDsgaSsrKQoJCWFkZF96b25lX2luZChpICsgKHVuc2lnbmVkIHNob3J0ICopIGJsaywgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIGJsayk7Cn0KCiNpZmRlZiBIQVZFX01JTklYMgpzdGF0aWMgdm9pZAphZGRfem9uZV9kaW5kMiAodW5zaWduZWQgaW50ICp6bnIsIGludCAqY29ycmVjdGVkKQp7CglzdGF0aWMgY2hhciBibGtbQkxPQ0tfU0laRV07CglpbnQgaSwgYmxrX2NoZyA9IDA7CglpbnQgYmxvY2s7CgoJYmxvY2sgPSBhZGRfem9uZTIgKHpuciwgY29ycmVjdGVkKTsKCWlmICghYmxvY2spCgkJcmV0dXJuOwoJcmVhZF9ibG9jayAoYmxvY2ssIGJsayk7Cglmb3IgKGkgPSAwOyBpIDwgQkxPQ0tfU0laRSA+PiAyOyBpKyspCgkJYWRkX3pvbmVfaW5kMiAoaSArICh1bnNpZ25lZCBpbnQgKikgYmxrLCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayAoYmxvY2ssIGJsayk7Cn0KCnN0YXRpYyB2b2lkCmFkZF96b25lX3RpbmQyICh1bnNpZ25lZCBpbnQgKnpuciwgaW50ICpjb3JyZWN0ZWQpCnsKCXN0YXRpYyBjaGFyIGJsa1tCTE9DS19TSVpFXTsKCWludCBpLCBibGtfY2hnID0gMDsKCWludCBibG9jazsKCglibG9jayA9IGFkZF96b25lMiAoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm47CglyZWFkX2Jsb2NrIChibG9jaywgYmxrKTsKCWZvciAoaSA9IDA7IGkgPCBCTE9DS19TSVpFID4+IDI7IGkrKykKCQlhZGRfem9uZV9kaW5kMiAoaSArICh1bnNpZ25lZCBpbnQgKikgYmxrLCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayAoYmxvY2ssIGJsayk7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBjaGVja196b25lcyh1bnNpZ25lZCBpbnQgaSkKewoJc3RydWN0IG1pbml4X2lub2RlICogaW5vZGU7CgoJaWYgKCFpIHx8IGkgPiBJTk9ERVMpCgkJcmV0dXJuOwoJaWYgKGlub2RlX2NvdW50W2ldID4gMSkJLyogaGF2ZSB3ZSBjb3VudGVkIHRoaXMgZmlsZSBhbHJlYWR5PyAqLwoJCXJldHVybjsKCWlub2RlID0gSW5vZGUgKyBpOwoJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpICYmICFTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmCgkgICAgIVNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCgkJcmV0dXJuOwoJZm9yIChpPTAgOyBpPDcgOyBpKyspCgkJYWRkX3pvbmUoaSArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKCWFkZF96b25lX2luZCg3ICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwoJYWRkX3pvbmVfZGluZCg4ICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwp9CgojaWZkZWYgSEFWRV9NSU5JWDIKc3RhdGljIHZvaWQKY2hlY2tfem9uZXMyICh1bnNpZ25lZCBpbnQgaSkKewoJc3RydWN0IG1pbml4Ml9pbm9kZSAqaW5vZGU7CgoJaWYgKCFpIHx8IGkgPiBJTk9ERVMpCgkJcmV0dXJuOwoJaWYgKGlub2RlX2NvdW50W2ldID4gMSkJLyogaGF2ZSB3ZSBjb3VudGVkIHRoaXMgZmlsZSBhbHJlYWR5PyAqLwoJCXJldHVybjsKCWlub2RlID0gSW5vZGUyICsgaTsKCWlmICghU19JU0RJUiAoaW5vZGUtPmlfbW9kZSkgJiYgIVNfSVNSRUcgKGlub2RlLT5pX21vZGUpCgkgICAgJiYgIVNfSVNMTksgKGlub2RlLT5pX21vZGUpKQoJCXJldHVybjsKCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCgkJYWRkX3pvbmUyIChpICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwoJYWRkX3pvbmVfaW5kMiAoNyArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKCWFkZF96b25lX2RpbmQyICg4ICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwoJYWRkX3pvbmVfdGluZDIgKDkgKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBjaGVja19maWxlKHN0cnVjdCBtaW5peF9pbm9kZSAqIGRpciwgdW5zaWduZWQgaW50IG9mZnNldCkKewoJc3RhdGljIGNoYXIgYmxrW0JMT0NLX1NJWkVdOwoJc3RydWN0IG1pbml4X2lub2RlICogaW5vZGU7CglpbnQgaW5vOwoJY2hhciAqIG5hbWU7CglpbnQgYmxvY2s7CgoJYmxvY2sgPSBtYXBfYmxvY2soZGlyLG9mZnNldC9CTE9DS19TSVpFKTsKCXJlYWRfYmxvY2soYmxvY2ssIGJsayk7CgluYW1lID0gYmxrICsgKG9mZnNldCAlIEJMT0NLX1NJWkUpICsgMjsKCWlubyA9ICogKHVuc2lnbmVkIHNob3J0ICopIChuYW1lLTIpOwoJaWYgKGlubyA+IElOT0RFUykgewoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiIGNvbnRhaW5zIGEgYmFkIGlub2RlIG51bWJlciBmb3IgZmlsZSAnIik7CgkJcHJpbnRmKCIlLipzJy4iLG5hbWVsZW4sbmFtZSk7CgkJaWYgKGFzaygiIFJlbW92ZSIsMSkpIHsKCQkJKih1bnNpZ25lZCBzaG9ydCAqKShuYW1lLTIpID0gMDsKCQkJd3JpdGVfYmxvY2soYmxvY2ssIGJsayk7CgkJfQoJCWlubyA9IDA7Cgl9CQoJaWYgKG5hbWVfZGVwdGggPCBNQVhfREVQVEgpCgkJc3RybmNweSAobmFtZV9saXN0W25hbWVfZGVwdGhdLCBuYW1lLCBuYW1lbGVuKTsKCW5hbWVfZGVwdGgrKzsKCWlub2RlID0gZ2V0X2lub2RlKGlubyk7CgluYW1lX2RlcHRoLS07CglpZiAoIW9mZnNldCkgewoJCWlmICghaW5vZGUgfHwgc3RyY21wKCIuIixuYW1lKSkgewoJCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQkJcHJpbnRmKCI6IGJhZCBkaXJlY3Rvcnk6ICcuJyBpc24ndCBmaXJzdFxuIik7CgkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJfSBlbHNlIHJldHVybjsKCX0KCWlmIChvZmZzZXQgPT0gZGlyc2l6ZSkgewoJCWlmICghaW5vZGUgfHwgc3RyY21wKCIuLiIsbmFtZSkpIHsKCQkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJCXByaW50ZigiOiBiYWQgZGlyZWN0b3J5OiAnLi4nIGlzbid0IHNlY29uZFxuIik7CgkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJfSBlbHNlIHJldHVybjsKCX0KCWlmICghaW5vZGUpCgkJcmV0dXJuOwoJaWYgKG5hbWVfZGVwdGggPCBNQVhfREVQVEgpCgkJc3RybmNweShuYW1lX2xpc3RbbmFtZV9kZXB0aF0sbmFtZSxuYW1lbGVuKTsKCW5hbWVfZGVwdGgrKzsJCglpZiAobGlzdCkgewoJCWlmICh2ZXJib3NlKQoJCQlwcmludGYoIiU2ZCAlMDdvICUzZCAiLGlubyxpbm9kZS0+aV9tb2RlLGlub2RlLT5pX25saW5rcyk7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCgkJCXByaW50ZigiOlxuIik7CgkJZWxzZQoJCQlwcmludGYoIlxuIik7Cgl9CgljaGVja196b25lcyhpbm8pOwoJaWYgKGlub2RlICYmIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCgkJcmVjdXJzaXZlX2NoZWNrKGlubyk7CgluYW1lX2RlcHRoLS07CglyZXR1cm47Cn0KCiNpZmRlZiBIQVZFX01JTklYMgpzdGF0aWMgdm9pZApjaGVja19maWxlMiAoc3RydWN0IG1pbml4Ml9pbm9kZSAqZGlyLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQp7CglzdGF0aWMgY2hhciBibGtbQkxPQ0tfU0laRV07CglzdHJ1Y3QgbWluaXgyX2lub2RlICppbm9kZTsKCWludCBpbm87CgljaGFyICpuYW1lOwoJaW50IGJsb2NrOwoKCWJsb2NrID0gbWFwX2Jsb2NrMiAoZGlyLCBvZmZzZXQgLyBCTE9DS19TSVpFKTsKCXJlYWRfYmxvY2sgKGJsb2NrLCBibGspOwoJbmFtZSA9IGJsayArIChvZmZzZXQgJSBCTE9DS19TSVpFKSArIDI7Cglpbm8gPSAqKHVuc2lnbmVkIHNob3J0ICopIChuYW1lIC0gMik7CglpZiAoaW5vID4gSU5PREVTKSB7CgkJcHJpbnRfY3VycmVudF9uYW1lICgpOwoJCXByaW50ZiAoIiBjb250YWlucyBhIGJhZCBpbm9kZSBudW1iZXIgZm9yIGZpbGUgJyIpOwoJCXByaW50ZiAoIiUuKnMnLiIsIG5hbWVsZW4sIG5hbWUpOwoJCWlmIChhc2sgKCIgUmVtb3ZlIiwgMSkpIHsKCQkJKih1bnNpZ25lZCBzaG9ydCAqKSAobmFtZSAtIDIpID0gMDsKCQkJd3JpdGVfYmxvY2sgKGJsb2NrLCBibGspOwoJCX0KCQlpbm8gPSAwOwoJfQoJaWYgKG5hbWVfZGVwdGggPCBNQVhfREVQVEgpCgkJc3RybmNweSAobmFtZV9saXN0W25hbWVfZGVwdGhdLCBuYW1lLCBuYW1lbGVuKTsKCW5hbWVfZGVwdGgrKzsKCWlub2RlID0gZ2V0X2lub2RlMiAoaW5vKTsKCW5hbWVfZGVwdGgtLTsKCWlmICghb2Zmc2V0KSB7CgkJaWYgKCFpbm9kZSB8fCBzdHJjbXAgKCIuIiwgbmFtZSkpIHsKCQkJcHJpbnRfY3VycmVudF9uYW1lICgpOwoJCQlwcmludGYgKCI6IGJhZCBkaXJlY3Rvcnk6ICcuJyBpc24ndCBmaXJzdFxuIik7CgkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJfSBlbHNlCgkJCXJldHVybjsKCX0KCWlmIChvZmZzZXQgPT0gZGlyc2l6ZSkgewoJCWlmICghaW5vZGUgfHwgc3RyY21wICgiLi4iLCBuYW1lKSkgewoJCQlwcmludF9jdXJyZW50X25hbWUgKCk7CgkJCXByaW50ZiAoIjogYmFkIGRpcmVjdG9yeTogJy4uJyBpc24ndCBzZWNvbmRcbiIpOwoJCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCX0gZWxzZQoJCQlyZXR1cm47Cgl9CglpZiAoIWlub2RlKQoJCXJldHVybjsKCW5hbWVfZGVwdGgrKzsKCWlmIChsaXN0KSB7CgkJaWYgKHZlcmJvc2UpCgkJCXByaW50ZiAoIiU2ZCAlMDdvICUzZCAiLCBpbm8sIGlub2RlLT5pX21vZGUsIGlub2RlLT5pX25saW5rcyk7CgkJcHJpbnRfY3VycmVudF9uYW1lICgpOwoJCWlmIChTX0lTRElSIChpbm9kZS0+aV9tb2RlKSkKCQkJcHJpbnRmICgiOlxuIik7CgkJZWxzZQoJCQlwcmludGYgKCJcbiIpOwoJfQoJY2hlY2tfem9uZXMyIChpbm8pOwoJaWYgKGlub2RlICYmIFNfSVNESVIgKGlub2RlLT5pX21vZGUpKQoJCXJlY3Vyc2l2ZV9jaGVjazIgKGlubyk7CgluYW1lX2RlcHRoLS07CglyZXR1cm47Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCByZWN1cnNpdmVfY2hlY2sodW5zaWduZWQgaW50IGlubykKewoJc3RydWN0IG1pbml4X2lub2RlICogZGlyOwoJdW5zaWduZWQgaW50IG9mZnNldDsKCglkaXIgPSBJbm9kZSArIGlubzsKCWlmICghU19JU0RJUihkaXItPmlfbW9kZSkpCgkJZGllKCJpbnRlcm5hbCBlcnJvciIpOwoJaWYgKGRpci0+aV9zaXplIDwgMiAqIGRpcnNpemUpIHsKCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQlwcmludGYoIjogYmFkIGRpcmVjdG9yeTogc2l6ZTwzMiIpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9Cglmb3IgKG9mZnNldCA9IDAgOyBvZmZzZXQgPCBkaXItPmlfc2l6ZSA7IG9mZnNldCArPSBkaXJzaXplKQoJCWNoZWNrX2ZpbGUoZGlyLG9mZnNldCk7Cn0KCiNpZmRlZiBIQVZFX01JTklYMgpzdGF0aWMgdm9pZApyZWN1cnNpdmVfY2hlY2syICh1bnNpZ25lZCBpbnQgaW5vKQp7CglzdHJ1Y3QgbWluaXgyX2lub2RlICpkaXI7Cgl1bnNpZ25lZCBpbnQgb2Zmc2V0OwoKCWRpciA9IElub2RlMiArIGlubzsKCWlmICghU19JU0RJUiAoZGlyLT5pX21vZGUpKQoJCWRpZSAoImludGVybmFsIGVycm9yIik7CglpZiAoZGlyLT5pX3NpemUgPCAyICogZGlyc2l6ZSkgewoJCXByaW50X2N1cnJlbnRfbmFtZSAoKTsKCQlwcmludGYgKCI6IGJhZCBkaXJlY3Rvcnk6IHNpemUgPCAzMiIpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9Cglmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGRpci0+aV9zaXplOyBvZmZzZXQgKz0gZGlyc2l6ZSkKCQljaGVja19maWxlMiAoZGlyLCBvZmZzZXQpOwp9CiNlbmRpZgoKc3RhdGljIGludCBiYWRfem9uZShpbnQgaSkKewoJY2hhciBidWZmZXJbMTAyNF07CgoJaWYgKEJMT0NLX1NJWkUqaSAhPSBsc2VlayhJTiwgQkxPQ0tfU0laRSppLCBTRUVLX1NFVCkpCgkJZGllKCJzZWVrIGZhaWxlZCBpbiBiYWRfem9uZSIpOwoJcmV0dXJuIChCTE9DS19TSVpFICE9IHJlYWQoSU4sIGJ1ZmZlciwgQkxPQ0tfU0laRSkpOwp9CgpzdGF0aWMgdm9pZCBjaGVja19jb3VudHModm9pZCkKewoJaW50IGk7CgoJZm9yIChpPTEgOyBpIDw9IElOT0RFUyA7IGkrKykgewoJCWlmICghaW5vZGVfaW5fdXNlKGkpICYmIElub2RlW2ldLmlfbW9kZSAmJiB3YXJuX21vZGUpIHsKCQkJcHJpbnRmKCJJbm9kZSAlZCBtb2RlIG5vdCBjbGVhcmVkLiIsaSk7CgkJCWlmIChhc2soIkNsZWFyIiwxKSkgewoJCQkJSW5vZGVbaV0uaV9tb2RlID0gMDsKCQkJCWNoYW5nZWQgPSAxOwoJCQl9CgkJfQoJCWlmICghaW5vZGVfY291bnRbaV0pIHsKCQkJaWYgKCFpbm9kZV9pbl91c2UoaSkpCgkJCQljb250aW51ZTsKCQkJcHJpbnRmKCJJbm9kZSAlZCBub3QgdXNlZCwgbWFya2VkIHVzZWQgaW4gdGhlIGJpdG1hcC4iLGkpOwoJCQlpZiAoYXNrKCJDbGVhciIsMSkpCgkJCQl1bm1hcmtfaW5vZGUoaSk7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoIWlub2RlX2luX3VzZShpKSkgewoJCQlwcmludGYoIklub2RlICVkIHVzZWQsIG1hcmtlZCB1bnVzZWQgaW4gdGhlIGJpdG1hcC4iLCBpKTsKCQkJaWYgKGFzaygiU2V0IiwxKSkKCQkJCW1hcmtfaW5vZGUoaSk7CgkJfQoJCWlmIChJbm9kZVtpXS5pX25saW5rcyAhPSBpbm9kZV9jb3VudFtpXSkgewoJCQlwcmludGYoIklub2RlICVkIChtb2RlID0gJTA3byksIGlfbmxpbmtzPSVkLCBjb3VudGVkPSVkLiIsCgkJCQlpLElub2RlW2ldLmlfbW9kZSxJbm9kZVtpXS5pX25saW5rcyxpbm9kZV9jb3VudFtpXSk7CgkJCWlmIChhc2soIlNldCBpX25saW5rcyB0byBjb3VudCIsMSkpIHsKCQkJCUlub2RlW2ldLmlfbmxpbmtzPWlub2RlX2NvdW50W2ldOwoJCQkJY2hhbmdlZD0xOwoJCQl9CgkJfQoJfQoJZm9yIChpPUZJUlNUWk9ORSA7IGkgPCBaT05FUyA7IGkrKykgewoJCWlmICh6b25lX2luX3VzZShpKSA9PSB6b25lX2NvdW50W2ldKQoJCQljb250aW51ZTsKCQlpZiAoIXpvbmVfY291bnRbaV0pIHsKCQkJaWYgKGJhZF96b25lKGkpKQoJCQkJY29udGludWU7CgkJCXByaW50ZigiWm9uZSAlZDogbWFya2VkIGluIHVzZSwgbm8gZmlsZSB1c2VzIGl0LiIsaSk7CgkJCWlmIChhc2soIlVubWFyayIsMSkpCgkJCQl1bm1hcmtfem9uZShpKTsKCQkJY29udGludWU7CgkJfQoJCXByaW50ZigiWm9uZSAlZDogJXNpbiB1c2UsIGNvdW50ZWQ9JWRcbiIsIAoJCQlpLHpvbmVfaW5fdXNlKGkpPyIiOiJub3QgIix6b25lX2NvdW50W2ldKTsKCX0KfQoKI2lmZGVmIEhBVkVfTUlOSVgyCnN0YXRpYyB2b2lkCmNoZWNrX2NvdW50czIgKHZvaWQpCnsKCWludCBpOwoKCWZvciAoaSA9IDE7IGkgPD0gSU5PREVTOyBpKyspIHsKCQlpZiAoIWlub2RlX2luX3VzZSAoaSkgJiYgSW5vZGUyW2ldLmlfbW9kZSAmJiB3YXJuX21vZGUpIHsKCQkJcHJpbnRmICgiSW5vZGUgJWQgbW9kZSBub3QgY2xlYXJlZC4iLCBpKTsKCQkJaWYgKGFzayAoIkNsZWFyIiwgMSkpIHsKCQkJCUlub2RlMltpXS5pX21vZGUgPSAwOwoJCQkJY2hhbmdlZCA9IDE7CgkJCX0KCQl9CgkJaWYgKCFpbm9kZV9jb3VudFtpXSkgewoJCQlpZiAoIWlub2RlX2luX3VzZSAoaSkpCgkJCQljb250aW51ZTsKCQkJcHJpbnRmICgiSW5vZGUgJWQgbm90IHVzZWQsIG1hcmtlZCB1c2VkIGluIHRoZSBiaXRtYXAuIiwgaSk7CgkJCWlmIChhc2sgKCJDbGVhciIsIDEpKQoJCQkJdW5tYXJrX2lub2RlIChpKTsKCQkJY29udGludWU7CgkJfQoJCWlmICghaW5vZGVfaW5fdXNlIChpKSkgewoJCQlwcmludGYgKCJJbm9kZSAlZCB1c2VkLCBtYXJrZWQgdW51c2VkIGluIHRoZSBiaXRtYXAuIiwgaSk7CgkJCWlmIChhc2sgKCJTZXQiLCAxKSkKCQkJCW1hcmtfaW5vZGUgKGkpOwoJCX0KCQlpZiAoSW5vZGUyW2ldLmlfbmxpbmtzICE9IGlub2RlX2NvdW50W2ldKSB7CgkJCXByaW50ZiAoIklub2RlICVkIChtb2RlID0gJTA3byksIGlfbmxpbmtzPSVkLCBjb3VudGVkPSVkLiIsCgkJCQlpLCBJbm9kZTJbaV0uaV9tb2RlLCBJbm9kZTJbaV0uaV9ubGlua3MsIGlub2RlX2NvdW50W2ldKTsKCQkJaWYgKGFzayAoIlNldCBpX25saW5rcyB0byBjb3VudCIsIDEpKSB7CgkJCQlJbm9kZTJbaV0uaV9ubGlua3MgPSBpbm9kZV9jb3VudFtpXTsKCQkJCWNoYW5nZWQgPSAxOwoJCQl9CgkJfQoJfQoJZm9yIChpID0gRklSU1RaT05FOyBpIDwgWk9ORVM7IGkrKykgewoJCWlmICh6b25lX2luX3VzZSAoaSkgPT0gem9uZV9jb3VudFtpXSkKCQkJY29udGludWU7CgkJaWYgKCF6b25lX2NvdW50W2ldKSB7CgkJCWlmIChiYWRfem9uZSAoaSkpCgkJCQljb250aW51ZTsKCQkJcHJpbnRmICgiWm9uZSAlZDogbWFya2VkIGluIHVzZSwgbm8gZmlsZSB1c2VzIGl0LiIsIGkpOwoJCQlpZiAoYXNrICgiVW5tYXJrIiwgMSkpCgkJCQl1bm1hcmtfem9uZSAoaSk7CgkJCWNvbnRpbnVlOwoJCX0KCQlwcmludGYgKCJab25lICVkOiAlc2luIHVzZSwgY291bnRlZD0lZFxuIiwKCQkJaSwgem9uZV9pbl91c2UgKGkpID8gIiIgOiAibm90ICIsIHpvbmVfY291bnRbaV0pOwoJfQp9CiNlbmRpZgoKc3RhdGljIHZvaWQgY2hlY2sodm9pZCkKewoJbWVtc2V0KGlub2RlX2NvdW50LDAsKElOT0RFUyArIDEpICogc2l6ZW9mKCppbm9kZV9jb3VudCkpOwoJbWVtc2V0KHpvbmVfY291bnQsMCxaT05FUypzaXplb2YoKnpvbmVfY291bnQpKTsKCWNoZWNrX3pvbmVzKFJPT1RfSU5PKTsKCXJlY3Vyc2l2ZV9jaGVjayhST09UX0lOTyk7CgljaGVja19jb3VudHMoKTsKfQoKI2lmZGVmIEhBVkVfTUlOSVgyCnN0YXRpYyB2b2lkCmNoZWNrMiAodm9pZCkKewoJbWVtc2V0IChpbm9kZV9jb3VudCwgMCwgKElOT0RFUyArIDEpICogc2l6ZW9mICgqaW5vZGVfY291bnQpKTsKCW1lbXNldCAoem9uZV9jb3VudCwgMCwgWk9ORVMgKiBzaXplb2YgKCp6b25lX2NvdW50KSk7CgljaGVja196b25lczIgKFJPT1RfSU5PKTsKCXJlY3Vyc2l2ZV9jaGVjazIgKFJPT1RfSU5PKTsKCWNoZWNrX2NvdW50czIgKCk7Cn0KI2VuZGlmCgpleHRlcm4gaW50IApmc2NrX21pbml4X21haW4oaW50IGFyZ2MsIGNoYXIgKiogYXJndikKewoJc3RydWN0IHRlcm1pb3MgdG1wOwoJaW50IGNvdW50OwoJaW50IHJldGNvZGUgPSAwOwoKCWlmIChhcmdjICYmICphcmd2KQoJCXByb2dyYW1fbmFtZSA9ICphcmd2OwoJaWYgKElOT0RFX1NJWkUgKiBNSU5JWF9JTk9ERVNfUEVSX0JMT0NLICE9IEJMT0NLX1NJWkUpCgkJZGllKCJiYWQgaW5vZGUgc2l6ZSIpOwojaWZkZWYgSEFWRV9NSU5JWDIKCWlmIChJTk9ERV9TSVpFMiAqIE1JTklYMl9JTk9ERVNfUEVSX0JMT0NLICE9IEJMT0NLX1NJWkUpCgkJZGllKCJiYWQgdjIgaW5vZGUgc2l6ZSIpOwojZW5kaWYKCXdoaWxlIChhcmdjLS0gPiAxKSB7CgkJYXJndisrOwoJCWlmIChhcmd2WzBdWzBdICE9ICctJykgewoJCQlpZiAoZGV2aWNlX25hbWUpCgkJCQlzaG93X3VzYWdlKCk7CgkJCWVsc2UKCQkJCWRldmljZV9uYW1lID0gYXJndlswXTsKCQl9IGVsc2Ugd2hpbGUgKCorK2FyZ3ZbMF0pCgkJCXN3aXRjaCAoYXJndlswXVswXSkgewoJCQkJY2FzZSAnbCc6IGxpc3Q9MTsgYnJlYWs7CgkJCQljYXNlICdhJzogYXV0b21hdGljPTE7IHJlcGFpcj0xOyBicmVhazsKCQkJCWNhc2UgJ3InOiBhdXRvbWF0aWM9MDsgcmVwYWlyPTE7IGJyZWFrOwoJCQkJY2FzZSAndic6IHZlcmJvc2U9MTsgYnJlYWs7CgkJCQljYXNlICdzJzogc2hvdz0xOyBicmVhazsKCQkJCWNhc2UgJ20nOiB3YXJuX21vZGU9MTsgYnJlYWs7CgkJCQljYXNlICdmJzogZm9yY2U9MTsgYnJlYWs7CgkJCQlkZWZhdWx0OiBzaG93X3VzYWdlKCk7CgkJCX0KCX0KCWlmICghZGV2aWNlX25hbWUpCgkJc2hvd191c2FnZSgpOwoJY2hlY2tfbW91bnQoKTsJCS8qIHRyeWluZyB0byBjaGVjayBhIG1vdW50ZWQgZmlsZXN5c3RlbT8gKi8KCWlmIChyZXBhaXIgJiYgIWF1dG9tYXRpYykgewoJCWlmICghaXNhdHR5KDApIHx8ICFpc2F0dHkoMSkpCgkJCWRpZSgibmVlZCB0ZXJtaW5hbCBmb3IgaW50ZXJhY3RpdmUgcmVwYWlycyIpOwoJfQoJSU4gPSBvcGVuKGRldmljZV9uYW1lLHJlcGFpcj9PX1JEV1I6T19SRE9OTFkpOwoJaWYgKElOIDwgMCkKCQlkaWUoInVuYWJsZSB0byBvcGVuICclcyciKTsKCWZvciAoY291bnQ9MCA7IGNvdW50PDMgOyBjb3VudCsrKQoJCXN5bmMoKTsKCXJlYWRfc3VwZXJibG9jaygpOwoKCS8qCgkgKiBEZXRlcm1pbmUgd2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIGNvbnRpbnVlIHdpdGggdGhlIGNoZWNraW5nLgoJICogVGhpcyBpcyBiYXNlZCBvbiB0aGUgc3RhdHVzIG9mIHRoZSBmaWxlc3lzdGVtIHZhbGlkIGFuZCBlcnJvcgoJICogZmxhZ3MgYW5kIHdoZXRoZXIgb3Igbm90IHRoZSAtZiBzd2l0Y2ggd2FzIHNwZWNpZmllZCBvbiB0aGUgCgkgKiBjb21tYW5kIGxpbmUuCgkgKi8KCXByaW50ZigiJXMsICVzXG4iLCBwcm9ncmFtX25hbWUsIHByb2dyYW1fdmVyc2lvbik7CglpZiAoICEoU3VwZXIuc19zdGF0ZSAmIE1JTklYX0VSUk9SX0ZTKSAmJiAKCSAgICAgIChTdXBlci5zX3N0YXRlICYgTUlOSVhfVkFMSURfRlMpICYmIAoJICAgICAgIWZvcmNlICkgewoJCWlmIChyZXBhaXIpCgkJCXByaW50ZigiJXMgaXMgY2xlYW4sIG5vIGNoZWNrLlxuIiwgZGV2aWNlX25hbWUpOwoJCXJldHVybiByZXRjb2RlOwoJfQoJZWxzZSBpZiAoZm9yY2UpCgkJcHJpbnRmKCJGb3JjaW5nIGZpbGVzeXN0ZW0gY2hlY2sgb24gJXMuXG4iLCBkZXZpY2VfbmFtZSk7CgllbHNlIGlmIChyZXBhaXIpCgkJcHJpbnRmKCJGaWxlc3lzdGVtIG9uICVzIGlzIGRpcnR5LCBuZWVkcyBjaGVja2luZy5cbiIsXAoJCQlkZXZpY2VfbmFtZSk7CgoJcmVhZF90YWJsZXMoKTsKCglpZiAocmVwYWlyICYmICFhdXRvbWF0aWMpIHsKCQl0Y2dldGF0dHIoMCwmdGVybWlvcyk7CgkJdG1wID0gdGVybWlvczsKCQl0bXAuY19sZmxhZyAmPSB+KElDQU5PTnxFQ0hPKTsKCQl0Y3NldGF0dHIoMCxUQ1NBTk9XLCZ0bXApOwoJCXRlcm1pb3Nfc2V0ID0gMTsKCX0KCiNpZiBIQVZFX01JTklYMgoJaWYgKHZlcnNpb24yKSB7CgkJY2hlY2tfcm9vdDIgKCk7CgkJY2hlY2syICgpOwoJfSBlbHNlIAojZW5kaWYKCSAgewoJCWNoZWNrX3Jvb3QoKTsKCQljaGVjaygpOwoJfQoJaWYgKHZlcmJvc2UpIHsKCQlpbnQgaSwgZnJlZTsKCgkJZm9yIChpPTEsZnJlZT0wIDsgaSA8PSBJTk9ERVMgOyBpKyspCgkJCWlmICghaW5vZGVfaW5fdXNlKGkpKQoJCQkJZnJlZSsrOwoJCXByaW50ZigiXG4lNmxkIGlub2RlcyB1c2VkICglbGQlJSlcbiIsKElOT0RFUy1mcmVlKSwKCQkJMTAwKihJTk9ERVMtZnJlZSkvSU5PREVTKTsKCQlmb3IgKGk9RklSU1RaT05FLGZyZWU9MCA7IGkgPCBaT05FUyA7IGkrKykKCQkJaWYgKCF6b25lX2luX3VzZShpKSkKCQkJCWZyZWUrKzsKCQlwcmludGYoIiU2bGQgem9uZXMgdXNlZCAoJWxkJSUpXG4iLChaT05FUy1mcmVlKSwKCQkJMTAwKihaT05FUy1mcmVlKS9aT05FUyk7CgkJcHJpbnRmKCJcbiU2ZCByZWd1bGFyIGZpbGVzXG4iCgkJIiU2ZCBkaXJlY3Rvcmllc1xuIgoJCSIlNmQgY2hhcmFjdGVyIGRldmljZSBmaWxlc1xuIgoJCSIlNmQgYmxvY2sgZGV2aWNlIGZpbGVzXG4iCgkJIiU2ZCBsaW5rc1xuIgoJCSIlNmQgc3ltYm9saWMgbGlua3NcbiIKCQkiLS0tLS0tXG4iCgkJIiU2ZCBmaWxlc1xuIiwKCQlyZWd1bGFyLGRpcmVjdG9yeSxjaGFyZGV2LGJsb2NrZGV2LAoJCWxpbmtzLTIqZGlyZWN0b3J5KzEsc3ltbGlua3MsdG90YWwtMipkaXJlY3RvcnkrMSk7Cgl9CglpZiAoY2hhbmdlZCkgewoJCXdyaXRlX3RhYmxlcygpOwoJCXByaW50ZigJIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKCQkJIkZJTEUgU1lTVEVNIEhBUyBCRUVOIENIQU5HRURcbiIKCQkJIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwoJCWZvciAoY291bnQ9MCA7IGNvdW50PDMgOyBjb3VudCsrKQoJCQlzeW5jKCk7Cgl9CgllbHNlIGlmICggcmVwYWlyICkKCQl3cml0ZV9zdXBlcl9ibG9jaygpOwoJCglpZiAocmVwYWlyICYmICFhdXRvbWF0aWMpCgkJdGNzZXRhdHRyKDAsVENTQU5PVywmdGVybWlvcyk7CgoJaWYgKGNoYW5nZWQpCgkgICAgICByZXRjb2RlICs9IDM7CglpZiAoZXJyb3JzX3VuY29ycmVjdGVkKQoJICAgICAgcmV0Y29kZSArPSA0OwoJcmV0dXJuIHJldGNvZGU7Cn0K