Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqIGZzY2suYyAtIGEgZmlsZSBzeXN0ZW0gY29uc2lzdGVuY3kgY2hlY2tlciBmb3IgTGludXguCiAqCiAqIChDKSAxOTkxLCAxOTkyIExpbnVzIFRvcnZhbGRzLiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQKICogYXMgcGVyIHRoZSBHTlUgY29weWxlZnQuCiAqLwoKLyoKICogMDkuMTEuOTEgIC0gIG1hZGUgdGhlIGZpcnN0IHJ1ZGltZW50YXJ5IGZ1bmN0aW9ucwogKgogKiAxMC4xMS45MSAgLSAgdXBkYXRlZCwgZG9lcyBjaGVja2luZywgbm8gcmVwYWlycyB5ZXQuCiAqCQlTZW50IG91dCB0byB0aGUgbWFpbGluZy1saXN0IGZvciB0ZXN0aW5nLgogKgogKiAxNC4xMS45MSAgLQlUZXN0aW5nIHNlZW1zIHRvIGhhdmUgZ29uZSB3ZWxsLiBBZGRlZCBzb21lCiAqCQljb3JyZWN0aW9uLWNvZGUsIGFuZCBjaGFuZ2VkIHNvbWUgZnVuY3Rpb25zLgogKgogKiAxNS4xMS45MSAgLSAgTW9yZSBjb3JyZWN0aW9uIGNvZGUuIEhvcGVmdWxseSBpdCBub3RpY2VzIG1vc3QKICoJCWNhc2VzIG5vdywgYW5kIHRyaWVzIHRvIGRvIHNvbWV0aGluZyBhYm91dCB0aGVtLgogKgogKiAxNi4xMS45MSAgLSAgTW9yZSBjb3JyZWN0aW9ucyAodGhhbmtzIHRvIE1pa2EgSmFsYXZhKS4gTW9zdAogKgkJdGhpbmdzIHNlZW0gdG8gd29yayBub3cuIFllYWgsIHN1cmUuCiAqCiAqCiAqIDE5LjA0LjkyICAtCUhhZCB0byBzdGFydCBvdmVyIGFnYWluIGZyb20gdGhpcyBvbGQgdmVyc2lvbiwgYXMgYQogKgkJa2VybmVsIGJ1ZyBhdGUgbXkgZW5oYW5jZWQgZnNjayBpbiBmZWJydWFyeS4KICoKICogMjguMDIuOTMgIC0JYWRkZWQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IGRpcmVjdG9yeSBlbnRyeSBzaXplcy4uCiAqCiAqIFNhdCBNYXIgIDYgMTg6NTk6NDIgMTk5MywgZmFpdGhAY3MudW5jLmVkdTogT3V0cHV0IG5hbWVsZW4gd2l0aAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLWJsb2NrIGluZm9ybWF0aW9uCiAqCiAqIFNhdCBPY3QgIDkgMTE6MTc6MTEgMTk5MywgZmFpdGhAY3MudW5jLmVkdTogbWFrZSBleGl0IHN0YXR1cyBjb25mb3JtCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhhdCByZXF1aXJlZCBieSBmc3V0aWwKICoKICogTW9uIEphbiAgMyAxMTowNjo1MiAxOTk0IC0gRHIuIFdldHRzdGVpbiAoZ3JlZyV3aW5kLnV1Y3BAcGxhaW5zLm5vZGFrLmVkdSkKICoJCQkgICAgICBBZGRlZCBzdXBwb3J0IGZvciBmaWxlIHN5c3RlbSB2YWxpZCBmbGFnLiAgQWxzbwogKgkJCSAgICAgIGFkZGVkIHByb2dyYW1fdmVyc2lvbiB2YXJpYWJsZSBhbmQgb3V0cHV0IG9mCiAqCQkJICAgICAgcHJvZ3JhbSBuYW1lIGFuZCB2ZXJzaW9uIG51bWJlciB3aGVuIHByb2dyYW0KICoJCQkgICAgICBpcyBleGVjdXRlZC4KICoKICogMzAuMTAuOTQgLSBhZGRlZCBzdXBwb3J0IGZvciB2MiBmaWxlc3lzdGVtCiAqICAgICAgICAgICAgKEFuZHJlYXMgU2Nod2FiLCBzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGUpCiAqCiAqIDEwLjEyLjk0ICAtICBhZGRlZCB0ZXN0IHRvIHByZXZlbnQgY2hlY2tpbmcgb2YgbW91bnRlZCBmcyBhZGFwdGVkCiAqICAgICAgICAgICAgICBmcm9tIFRoZW9kb3JlIFRzJ28ncyAodHl0c29AYXRoZW5hLm1pdC5lZHUpIGUyZnNjawogKiAgICAgICAgICAgICAgcHJvZ3JhbS4gIChEYW5pZWwgUXVpbmxhbiwgcXVpbmxhbkB5Z2dkcmFzaWwuY29tKQogKgogKiAwMS4wNy45NiAgLSBGaXhlZCB0aGUgdjIgZnMgc3R1ZmYgdG8gdXNlIHRoZSByaWdodCAjZGVmaW5lcyBhbmQgc3VjaAogKgkgICAgICAgZm9yIG1vZGVybiBsaWJjcyAoamFubEBtYXRoLnVpby5ubywgTmljb2xhaSBMYW5nZmVsZHQpCiAqCiAqIDAyLjA3Ljk2ICAtIEFkZGVkIEMgYml0IGZpZGRsaW5nIHJvdXRpbmVzIGZyb20gcm1rQGVjcy5zb3Rvbi5hYy51awogKiAgICAgICAgICAgICAoUnVzc2VsbCBLaW5nKS4gIEhlIG1hZGUgdGhlbSBmb3IgQVJNLiAgSXQgd291bGQgc2VlbQogKgkgICAgICAgdGhhdCB0aGUgQVJNIGlzIHBvd2VyZnVsIGVub3VnaCB0byBkbyB0aGlzIGluIEMgd2hlcmVhcwogKiAgICAgICAgICAgICBpMzg2IGFuZCBtNjRrIG11c3QgdXNlIGFzc2VtYmx5IHRvIGdldCBpdCBmYXN0ID46LSkKICoJICAgICAgIFRoaXMgc2hvdWxkIG1ha2UgbWluaXggZnNjayBzeXN0ZW0taW5kZXBlbmRlbnQuCiAqCSAgICAgICAoamFubEBtYXRoLnVpby5ubywgTmljb2xhaSBMYW5nZmVsZHQpCiAqCiAqIDA0LjExLjk2ICAtIEFkZGVkIG1pbm9yIGZpeGVzIGZyb20gQW5kcmVhcyBTY2h3YWIgdG8gYXZvaWQgY29tcGlsZXIKICogICAgICAgICAgICAgd2FybmluZ3MuICBBZGRlZCBtYzY4ayBiaXRvcHMgZnJvbQogKgkgICAgICAgSm9lcmcgRG9yY2hhaW4gPGRvcmNoYWluQG1waS1zYi5tcGcuZGU+LgogKgogKiAwNi4xMS45NiAgLSBBZGRlZCB2MiBjb2RlIHN1Ym1pdHRlZCBieSBKb2VyZyBEb3JjaGFpbiwgYnV0IHdyaXR0ZW4gYnkKICogICAgICAgICAgICAgQW5kcmVhcyBTY2h3YWIuCiAqCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BtaXNpZWsuZXUub3JnPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqCiAqIEkndmUgaGFkIG5vIHRpbWUgdG8gYWRkIGNvbW1lbnRzIC0gaG9wZWZ1bGx5IHRoZSBmdW5jdGlvbiBuYW1lcwogKiBhcmUgY29tbWVudHMgZW5vdWdoLiBBcyB3aXRoIGFsbCBmaWxlIHN5c3RlbSBjaGVja2VycywgdGhpcyBhc3N1bWVzCiAqIHRoZSBmaWxlIHN5c3RlbSBpcyBxdWllc2NlbnQgLSBkb24ndCB1c2UgaXQgb24gYSBtb3VudGVkIGRldmljZQogKiB1bmxlc3MgeW91IGNhbiBiZSBzdXJlIG5vYm9keSBpcyB3cml0aW5nIHRvIGl0IChhbmQgcmVtZW1iZXIgdGhhdCB0aGUKICoga2VybmVsIGNhbiB3cml0ZSB0byBpdCB3aGVuIGl0IHNlYXJjaGVzIGZvciBmaWxlcykuCiAqCiAqIFVzYWdlOiBmc2NrIFstbGFydnNtXSBkZXZpY2UKICoJLWwgZm9yIGEgbGlzdGluZyBvZiBhbGwgdGhlIGZpbGVuYW1lcwogKgktYSBmb3IgYXV0b21hdGljIHJlcGFpcnMgKG5vdCBpbXBsZW1lbnRlZCkKICoJLXIgZm9yIHJlcGFpcnMgKGludGVyYWN0aXZlKSAobm90IGltcGxlbWVudGVkKQogKgktdiBmb3IgdmVyYm9zZSAodGVsbHMgaG93IG1hbnkgZmlsZXMpCiAqCS1zIGZvciBzdXBlci1ibG9jayBpbmZvCiAqCS1tIGZvciBtaW5peC1saWtlICJtb2RlIG5vdCBjbGVhcmVkIiB3YXJuaW5ncwogKgktZiBmb3JjZSBmaWxlc3lzdGVtIGNoZWNrIGV2ZW4gaWYgZmlsZXN5c3RlbSBtYXJrZWQgYXMgdmFsaWQKICoKICogVGhlIGRldmljZSBtYXkgYmUgYSBibG9jayBkZXZpY2Ugb3IgYSBpbWFnZSBvZiBvbmUsIGJ1dCB0aGlzIGlzbid0CiAqIGVuZm9yY2VkIChidXQgaXQncyBub3QgbXVjaCBmdW4gb24gYSBjaGFyYWN0ZXIgZGV2aWNlIDotKS4KICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHRlcm1pb3MuaD4KI2luY2x1ZGUgPG1udGVudC5oPgojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNpbmNsdWRlICJidXN5Ym94LmgiCgojZGVmaW5lIEJMT0NLX1NJWkVfQklUUyAxMAojZGVmaW5lIEJMT0NLX1NJWkUgKDE8PEJMT0NLX1NJWkVfQklUUykKCi8qCiAqIFRoaXMgaXMgdGhlIG9yaWdpbmFsIG1pbml4IGlub2RlIGxheW91dCBvbiBkaXNrLgogKiBOb3RlIHRoZSA4LWJpdCBnaWQgYW5kIGF0aW1lIGFuZCBjdGltZS4KICovCnN0cnVjdCBtaW5peF9pbm9kZSB7Cgl1aW50MTZfdCBpX21vZGU7Cgl1aW50MTZfdCBpX3VpZDsKCXVpbnQzMl90IGlfc2l6ZTsKCXVpbnQzMl90IGlfdGltZTsKCXVpbnQ4X3QgIGlfZ2lkOwoJdWludDhfdCAgaV9ubGlua3M7Cgl1aW50MTZfdCBpX3pvbmVbOV07Cn07CgovKgogKiBUaGUgbmV3IG1pbml4IGlub2RlIGhhcyBhbGwgdGhlIHRpbWUgZW50cmllcywgYXMgd2VsbCBhcwogKiBsb25nIGJsb2NrIG51bWJlcnMgYW5kIGEgdGhpcmQgaW5kaXJlY3QgYmxvY2sgKDcrMSsxKzEKICogaW5zdGVhZCBvZiA3KzErMSkuIEFsc28sIHNvbWUgcHJldmlvdXNseSA4LWJpdCB2YWx1ZXMgYXJlCiAqIG5vdyAxNi1iaXQuIFRoZSBpbm9kZSBpcyBub3cgNjQgYnl0ZXMgaW5zdGVhZCBvZiAzMi4KICovCnN0cnVjdCBtaW5peDJfaW5vZGUgewoJdWludDE2X3QgaV9tb2RlOwoJdWludDE2X3QgaV9ubGlua3M7Cgl1aW50MTZfdCBpX3VpZDsKCXVpbnQxNl90IGlfZ2lkOwoJdWludDMyX3QgaV9zaXplOwoJdWludDMyX3QgaV9hdGltZTsKCXVpbnQzMl90IGlfbXRpbWU7Cgl1aW50MzJfdCBpX2N0aW1lOwoJdWludDMyX3QgaV96b25lWzEwXTsKfTsKCmVudW0gewoJTUlOSVhfUk9PVF9JTk8gPSAxLAoJTUlOSVhfTElOS19NQVggPSAyNTAsCglNSU5JWDJfTElOS19NQVggPSA2NTUzMCwKCglNSU5JWF9JX01BUF9TTE9UUyA9IDgsCglNSU5JWF9aX01BUF9TTE9UUyA9IDY0LAoJTUlOSVhfU1VQRVJfTUFHSUMgPSAweDEzN0YsCQkvKiBvcmlnaW5hbCBtaW5peCBmcyAqLwoJTUlOSVhfU1VQRVJfTUFHSUMyID0gMHgxMzhGLAkJLyogbWluaXggZnMsIDMwIGNoYXIgbmFtZXMgKi8KCU1JTklYMl9TVVBFUl9NQUdJQyA9IDB4MjQ2OCwJCS8qIG1pbml4IFYyIGZzICovCglNSU5JWDJfU1VQRVJfTUFHSUMyID0gMHgyNDc4LAkJLyogbWluaXggVjIgZnMsIDMwIGNoYXIgbmFtZXMgKi8KCU1JTklYX1ZBTElEX0ZTID0gMHgwMDAxLAkJLyogQ2xlYW4gZnMuICovCglNSU5JWF9FUlJPUl9GUyA9IDB4MDAwMiwJCS8qIGZzIGhhcyBlcnJvcnMuICovCgoJTUlOSVhfSU5PREVTX1BFUl9CTE9DSyA9ICgoQkxPQ0tfU0laRSkvKHNpemVvZiAoc3RydWN0IG1pbml4X2lub2RlKSkpLAoJTUlOSVgyX0lOT0RFU19QRVJfQkxPQ0sgPSAoKEJMT0NLX1NJWkUpLyhzaXplb2YgKHN0cnVjdCBtaW5peDJfaW5vZGUpKSksCgoJTUlOSVhfVjEgPSAweDAwMDEsCQkvKiBvcmlnaW5hbCBtaW5peCBmcyAqLwoJTUlOSVhfVjIgPSAweDAwMDIgCQkvKiBtaW5peCBWMiBmcyAqLwp9OwoKI2RlZmluZSBJTk9ERV9WRVJTSU9OKGlub2RlKQlpbm9kZS0+aV9zYi0+dS5taW5peF9zYi5zX3ZlcnNpb24KCi8qCiAqIG1pbml4IHN1cGVyLWJsb2NrIGRhdGEgb24gZGlzawogKi8Kc3RydWN0IG1pbml4X3N1cGVyX2Jsb2NrIHsKCXVpbnQxNl90IHNfbmlub2RlczsKCXVpbnQxNl90IHNfbnpvbmVzOwoJdWludDE2X3Qgc19pbWFwX2Jsb2NrczsKCXVpbnQxNl90IHNfem1hcF9ibG9ja3M7Cgl1aW50MTZfdCBzX2ZpcnN0ZGF0YXpvbmU7Cgl1aW50MTZfdCBzX2xvZ196b25lX3NpemU7Cgl1aW50MzJfdCBzX21heF9zaXplOwoJdWludDE2X3Qgc19tYWdpYzsKCXVpbnQxNl90IHNfc3RhdGU7Cgl1aW50MzJfdCBzX3pvbmVzOwp9OwoKc3RydWN0IG1pbml4X2Rpcl9lbnRyeSB7Cgl1aW50MTZfdCBpbm9kZTsKCWNoYXIgbmFtZVswXTsKfTsKCgojZGVmaW5lIE5BTUVfTUFYICAgICAgICAgMjU1ICAgLyogIyBjaGFycyBpbiBhIGZpbGUgbmFtZSAqLwoKI2RlZmluZSBNSU5JWF9JTk9ERVNfUEVSX0JMT0NLICgoQkxPQ0tfU0laRSkvKHNpemVvZiAoc3RydWN0IG1pbml4X2lub2RlKSkpCgojaWZuZGVmIEJMS0dFVFNJWkUKI2RlZmluZSBCTEtHRVRTSVpFIF9JTygweDEyLDk2KSAgICAvKiByZXR1cm4gZGV2aWNlIHNpemUgKi8KI2VuZGlmCgojaWZuZGVmIF9fbGludXhfXwojZGVmaW5lIHZvbGF0aWxlCiNlbmRpZgoKZW51bSB7IFJPT1RfSU5PID0gMSB9OwoKI2RlZmluZSBVUFBFUihzaXplLG4pICgoc2l6ZSsoKG4pLTEpKS8obikpCiNkZWZpbmUgSU5PREVfU0laRSAoc2l6ZW9mKHN0cnVjdCBtaW5peF9pbm9kZSkpCiNpZmRlZiBDT05GSUdfRkVBVFVSRV9NSU5JWDIKI2RlZmluZSBJTk9ERV9TSVpFMiAoc2l6ZW9mKHN0cnVjdCBtaW5peDJfaW5vZGUpKQojZGVmaW5lIElOT0RFX0JMT0NLUyBVUFBFUihJTk9ERVMsICh2ZXJzaW9uMiA/IE1JTklYMl9JTk9ERVNfUEVSX0JMT0NLIFwKCQkJCSAgICA6IE1JTklYX0lOT0RFU19QRVJfQkxPQ0spKQojZWxzZQojZGVmaW5lIElOT0RFX0JMT0NLUyBVUFBFUihJTk9ERVMsIChNSU5JWF9JTk9ERVNfUEVSX0JMT0NLKSkKI2VuZGlmCiNkZWZpbmUgSU5PREVfQlVGRkVSX1NJWkUgKElOT0RFX0JMT0NLUyAqIEJMT0NLX1NJWkUpCgojZGVmaW5lIEJJVFNfUEVSX0JMT0NLIChCTE9DS19TSVpFPDwzKQoKc3RhdGljIGNoYXIgKnByb2dyYW1fdmVyc2lvbiA9ICIxLjIgLSAxMS8xMS85NiI7CnN0YXRpYyBjaGFyICpkZXZpY2VfbmFtZSA9IE5VTEw7CnN0YXRpYyBpbnQgSU47CnN0YXRpYyBpbnQgcmVwYWlyID0gMCwgYXV0b21hdGljID0gMCwgdmVyYm9zZSA9IDAsIGxpc3QgPSAwLCBzaG93ID0KCTAsIHdhcm5fbW9kZSA9IDAsIGZvcmNlID0gMDsKc3RhdGljIGludCBkaXJlY3RvcnkgPSAwLCByZWd1bGFyID0gMCwgYmxvY2tkZXYgPSAwLCBjaGFyZGV2ID0gMCwgbGlua3MgPQoJMCwgc3ltbGlua3MgPSAwLCB0b3RhbCA9IDA7CgpzdGF0aWMgaW50IGNoYW5nZWQgPSAwOwkJCS8qIGZsYWdzIGlmIHRoZSBmaWxlc3lzdGVtIGhhcyBiZWVuIGNoYW5nZWQgKi8Kc3RhdGljIGludCBlcnJvcnNfdW5jb3JyZWN0ZWQgPSAwOwkvKiBmbGFnIGlmIHNvbWUgZXJyb3Igd2FzIG5vdCBjb3JyZWN0ZWQgKi8Kc3RhdGljIGludCBkaXJzaXplID0gMTY7CnN0YXRpYyBpbnQgbmFtZWxlbiA9IDE0OwpzdGF0aWMgaW50IHZlcnNpb24yID0gMDsKc3RhdGljIHN0cnVjdCB0ZXJtaW9zIHRlcm1pb3M7CnN0YXRpYyBpbnQgdGVybWlvc19zZXQgPSAwOwoKLyogRmlsZS1uYW1lIGRhdGEgKi8KZW51bSB7IE1BWF9ERVBUSCA9IDMyIH07CnN0YXRpYyBpbnQgbmFtZV9kZXB0aCA9IDA7Ci8vIHN0YXRpYyBjaGFyIG5hbWVfbGlzdFtNQVhfREVQVEhdW0JVRlNJWiArIDFdOwpzdGF0aWMgY2hhciAqKm5hbWVfbGlzdCA9IE5VTEw7CgpzdGF0aWMgY2hhciAqaW5vZGVfYnVmZmVyID0gTlVMTDsKCiNkZWZpbmUgSW5vZGUgKCgoc3RydWN0IG1pbml4X2lub2RlICopIGlub2RlX2J1ZmZlciktMSkKI2RlZmluZSBJbm9kZTIgKCgoc3RydWN0IG1pbml4Ml9pbm9kZSAqKSBpbm9kZV9idWZmZXIpLTEpCnN0YXRpYyBjaGFyIHN1cGVyX2Jsb2NrX2J1ZmZlcltCTE9DS19TSVpFXTsKCiNkZWZpbmUgU3VwZXIgKCooc3RydWN0IG1pbml4X3N1cGVyX2Jsb2NrICopc3VwZXJfYmxvY2tfYnVmZmVyKQojZGVmaW5lIElOT0RFUyAoKHVuc2lnbmVkIGxvbmcpU3VwZXIuc19uaW5vZGVzKQojaWZkZWYgQ09ORklHX0ZFQVRVUkVfTUlOSVgyCiNkZWZpbmUgWk9ORVMgKCh1bnNpZ25lZCBsb25nKSh2ZXJzaW9uMiA/IFN1cGVyLnNfem9uZXMgOiBTdXBlci5zX256b25lcykpCiNlbHNlCiNkZWZpbmUgWk9ORVMgKCh1bnNpZ25lZCBsb25nKShTdXBlci5zX256b25lcykpCiNlbmRpZgojZGVmaW5lIElNQVBTICgodW5zaWduZWQgbG9uZylTdXBlci5zX2ltYXBfYmxvY2tzKQojZGVmaW5lIFpNQVBTICgodW5zaWduZWQgbG9uZylTdXBlci5zX3ptYXBfYmxvY2tzKQojZGVmaW5lIEZJUlNUWk9ORSAoKHVuc2lnbmVkIGxvbmcpU3VwZXIuc19maXJzdGRhdGF6b25lKQojZGVmaW5lIFpPTkVTSVpFICgodW5zaWduZWQgbG9uZylTdXBlci5zX2xvZ196b25lX3NpemUpCiNkZWZpbmUgTUFYU0laRSAoKHVuc2lnbmVkIGxvbmcpU3VwZXIuc19tYXhfc2l6ZSkKI2RlZmluZSBNQUdJQyAoU3VwZXIuc19tYWdpYykKI2RlZmluZSBOT1JNX0ZJUlNUWk9ORSAoMitJTUFQUytaTUFQUytJTk9ERV9CTE9DS1MpCgpzdGF0aWMgY2hhciAqaW5vZGVfbWFwOwpzdGF0aWMgY2hhciAqem9uZV9tYXA7CgpzdGF0aWMgdW5zaWduZWQgY2hhciAqaW5vZGVfY291bnQgPSBOVUxMOwpzdGF0aWMgdW5zaWduZWQgY2hhciAqem9uZV9jb3VudCA9IE5VTEw7CgpzdGF0aWMgdm9pZCByZWN1cnNpdmVfY2hlY2sodW5zaWduZWQgaW50IGlubyk7CiNpZmRlZiBDT05GSUdfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHZvaWQgcmVjdXJzaXZlX2NoZWNrMih1bnNpZ25lZCBpbnQgaW5vKTsKI2VuZGlmCgpzdGF0aWMgaW5saW5lIGludCBiaXQoY2hhciAqIGEsdW5zaWduZWQgaW50IGkpCnsKCSAgcmV0dXJuIChhW2kgPj4gM10gJiAoMTw8KGkgJiA3KSkpICE9IDA7Cn0KI2RlZmluZSBpbm9kZV9pbl91c2UoeCkgKGJpdChpbm9kZV9tYXAsKHgpKSkKI2RlZmluZSB6b25lX2luX3VzZSh4KSAoYml0KHpvbmVfbWFwLCh4KS1GSVJTVFpPTkUrMSkpCgojZGVmaW5lIG1hcmtfaW5vZGUoeCkgKHNldGJpdChpbm9kZV9tYXAsKHgpKSxjaGFuZ2VkPTEpCiNkZWZpbmUgdW5tYXJrX2lub2RlKHgpIChjbHJiaXQoaW5vZGVfbWFwLCh4KSksY2hhbmdlZD0xKQoKI2RlZmluZSBtYXJrX3pvbmUoeCkgKHNldGJpdCh6b25lX21hcCwoeCktRklSU1RaT05FKzEpLGNoYW5nZWQ9MSkKI2RlZmluZSB1bm1hcmtfem9uZSh4KSAoY2xyYml0KHpvbmVfbWFwLCh4KS1GSVJTVFpPTkUrMSksY2hhbmdlZD0xKQoKc3RhdGljIHZvaWQgbGVhdmUoaW50KSBBVFRSSUJVVEVfTk9SRVRVUk47CnN0YXRpYyB2b2lkIGxlYXZlKGludCBzdGF0dXMpCnsKCWlmICh0ZXJtaW9zX3NldCkKCQl0Y3NldGF0dHIoMCwgVENTQU5PVywgJnRlcm1pb3MpOwoJZXhpdChzdGF0dXMpOwp9CgpzdGF0aWMgdm9pZCBkaWUoY29uc3QgY2hhciAqc3RyKQp7CgliYl9lcnJvcl9tc2coIiVzIiwgc3RyKTsKCWxlYXZlKDgpOwp9CgovKgogKiBUaGlzIHNpbXBseSBnb2VzIHRocm91Z2ggdGhlIGZpbGUtbmFtZSBkYXRhIGFuZCBwcmludHMgb3V0IHRoZQogKiBjdXJyZW50IGZpbGUuCiAqLwpzdGF0aWMgdm9pZCBwcmludF9jdXJyZW50X25hbWUodm9pZCkKewoJaW50IGkgPSAwOwoKCXdoaWxlIChpIDwgbmFtZV9kZXB0aCkKCQlwcmludGYoIi8lLipzIiwgbmFtZWxlbiwgbmFtZV9saXN0W2krK10pOwoJaWYgKGkgPT0gMCkKCQlwcmludGYoIi8iKTsKfQoKc3RhdGljIGludCBhc2soY29uc3QgY2hhciAqc3RyaW5nLCBpbnQgZGVmKQp7CglpbnQgYzsKCglpZiAoIXJlcGFpcikgewoJCXByaW50ZigiXG4iKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCXJldHVybiAwOwoJfQoJaWYgKGF1dG9tYXRpYykgewoJCXByaW50ZigiXG4iKTsKCQlpZiAoIWRlZikKCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQlyZXR1cm4gZGVmOwoJfQoJcHJpbnRmKGRlZiA/ICIlcyAoeS9uKT8gIiA6ICIlcyAobi95KT8gIiwgc3RyaW5nKTsKCWZvciAoOzspIHsKCQlmZmx1c2goc3Rkb3V0KTsKCQlpZiAoKGMgPSBnZXRjaGFyKCkpID09IEVPRikgewoJCQlpZiAoIWRlZikKCQkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJCXJldHVybiBkZWY7CgkJfQoJCWMgPSB0b3VwcGVyKGMpOwoJCWlmIChjID09ICdZJykgewoJCQlkZWYgPSAxOwoJCQlicmVhazsKCQl9IGVsc2UgaWYgKGMgPT0gJ04nKSB7CgkJCWRlZiA9IDA7CgkJCWJyZWFrOwoJCX0gZWxzZSBpZiAoYyA9PSAnICcgfHwgYyA9PSAnXG4nKQoJCQlicmVhazsKCX0KCWlmIChkZWYpCgkJcHJpbnRmKCJ5XG4iKTsKCWVsc2UgewoJCXByaW50ZigiblxuIik7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCXJldHVybiBkZWY7Cn0KCi8qCiAqIE1ha2UgY2VydGFpbiB0aGF0IHdlIGFyZW4ndCBjaGVja2luZyBhIGZpbGVzeXN0ZW0gdGhhdCBpcyBvbiBhCiAqIG1vdW50ZWQgcGFydGl0aW9uLiAgQ29kZSBhZGFwdGVkIGZyb20gZTJmc2NrLCBDb3B5cmlnaHQgKEMpIDE5OTMsCiAqIDE5OTQgVGhlb2RvcmUgVHMnby4gIEFsc28gbGljZW5zZWQgdW5kZXIgR1BMLgogKi8Kc3RhdGljIHZvaWQgY2hlY2tfbW91bnQodm9pZCkKewoJRklMRSAqZjsKCXN0cnVjdCBtbnRlbnQgKm1udDsKCWludCBjb250OwoJaW50IGZkOwoKCWlmICgoZiA9IHNldG1udGVudChNT1VOVEVELCAiciIpKSA9PSBOVUxMKQoJCXJldHVybjsKCXdoaWxlICgobW50ID0gZ2V0bW50ZW50KGYpKSAhPSBOVUxMKQoJCWlmIChzdHJjbXAoZGV2aWNlX25hbWUsIG1udC0+bW50X2ZzbmFtZSkgPT0gMCkKCQkJYnJlYWs7CgllbmRtbnRlbnQoZik7CglpZiAoIW1udCkKCQlyZXR1cm47CgoJLyoKCSAqIElmIHRoZSByb290IGlzIG1vdW50ZWQgcmVhZC1vbmx5LCB0aGVuIC9ldGMvbXRhYiBpcwoJICogcHJvYmFibHkgbm90IGNvcnJlY3Q7IHNvIHdlIHdvbid0IGlzc3VlIGEgd2FybmluZyBiYXNlZCBvbgoJICogaXQuCgkgKi8KCWZkID0gb3BlbihNT1VOVEVELCBPX1JEV1IpOwoJaWYgKGZkIDwgMCAmJiBlcnJubyA9PSBFUk9GUykKCQlyZXR1cm47CgllbHNlCgkJY2xvc2UoZmQpOwoKCXByaW50ZigiJXMgaXMgbW91bnRlZC4JICIsIGRldmljZV9uYW1lKTsKCWlmIChpc2F0dHkoMCkgJiYgaXNhdHR5KDEpKQoJCWNvbnQgPSBhc2soIkRvIHlvdSByZWFsbHkgd2FudCB0byBjb250aW51ZSIsIDApOwoJZWxzZQoJCWNvbnQgPSAwOwoJaWYgKCFjb250KSB7CgkJcHJpbnRmKCJjaGVjayBhYm9ydGVkLlxuIik7CgkJZXhpdCgwKTsKCX0KCXJldHVybjsKfQoKLyoKICogY2hlY2tfem9uZV9uciBjaGVja3MgdG8gc2VlIHRoYXQgKm5yIGlzIGEgdmFsaWQgem9uZSBuci4gSWYgaXQKICogaXNuJ3QsIGl0IHdpbGwgcG9zc2libHkgYmUgcmVwYWlyZWQuIENoZWNrX3pvbmVfbnIgc2V0cyAqY29ycmVjdGVkCiAqIGlmIGFuIGVycm9yIHdhcyBjb3JyZWN0ZWQsIGFuZCByZXR1cm5zIHRoZSB6b25lICgwIGZvciBubyB6b25lCiAqIG9yIGEgYmFkIHpvbmUtbnVtYmVyKS4KICovCnN0YXRpYyBpbnQgY2hlY2tfem9uZV9ucih1bnNpZ25lZCBzaG9ydCAqbnIsIGludCAqY29ycmVjdGVkKQp7CglpZiAoISpucikKCQlyZXR1cm4gMDsKCWlmICgqbnIgPCBGSVJTVFpPTkUpCgkJcHJpbnRmKCJab25lIG5yIDwgRklSU1RaT05FIGluIGZpbGUgYCIpOwoJZWxzZSBpZiAoKm5yID49IFpPTkVTKQoJCXByaW50ZigiWm9uZSBuciA+PSBaT05FUyBpbiBmaWxlIGAiKTsKCWVsc2UKCQlyZXR1cm4gKm5yOwoJcHJpbnRfY3VycmVudF9uYW1lKCk7CglwcmludGYoIicuIik7CglpZiAoYXNrKCJSZW1vdmUgYmxvY2siLCAxKSkgewoJCSpuciA9IDA7CgkJKmNvcnJlY3RlZCA9IDE7Cgl9CglyZXR1cm4gMDsKfQoKI2lmZGVmIENPTkZJR19GRUFUVVJFX01JTklYMgpzdGF0aWMgaW50IGNoZWNrX3pvbmVfbnIyKHVuc2lnbmVkIGludCAqbnIsIGludCAqY29ycmVjdGVkKQp7CglpZiAoISpucikKCQlyZXR1cm4gMDsKCWlmICgqbnIgPCBGSVJTVFpPTkUpCgkJcHJpbnRmKCJab25lIG5yIDwgRklSU1RaT05FIGluIGZpbGUgYCIpOwoJZWxzZSBpZiAoKm5yID49IFpPTkVTKQoJCXByaW50ZigiWm9uZSBuciA+PSBaT05FUyBpbiBmaWxlIGAiKTsKCWVsc2UKCQlyZXR1cm4gKm5yOwoJcHJpbnRfY3VycmVudF9uYW1lKCk7CglwcmludGYoIicuIik7CglpZiAoYXNrKCJSZW1vdmUgYmxvY2siLCAxKSkgewoJCSpuciA9IDA7CgkJKmNvcnJlY3RlZCA9IDE7Cgl9CglyZXR1cm4gMDsKfQojZW5kaWYKCi8qCiAqIHJlYWQtYmxvY2sgcmVhZHMgYmxvY2sgbnIgaW50byB0aGUgYnVmZmVyIGF0IGFkZHIuCiAqLwpzdGF0aWMgdm9pZCByZWFkX2Jsb2NrKHVuc2lnbmVkIGludCBuciwgY2hhciAqYWRkcikKewoJaWYgKCFucikgewoJCW1lbXNldChhZGRyLCAwLCBCTE9DS19TSVpFKTsKCQlyZXR1cm47Cgl9CglpZiAoQkxPQ0tfU0laRSAqIG5yICE9IGxzZWVrKElOLCBCTE9DS19TSVpFICogbnIsIFNFRUtfU0VUKSkgewoJCXByaW50ZigiUmVhZCBlcnJvcjogdW5hYmxlIHRvIHNlZWsgdG8gYmxvY2sgaW4gZmlsZSAnIik7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCInXG4iKTsKCQltZW1zZXQoYWRkciwgMCwgQkxPQ0tfU0laRSk7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0gZWxzZSBpZiAoQkxPQ0tfU0laRSAhPSByZWFkKElOLCBhZGRyLCBCTE9DS19TSVpFKSkgewoJCXByaW50ZigiUmVhZCBlcnJvcjogYmFkIGJsb2NrIGluIGZpbGUgJyIpOwoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiJ1xuIik7CgkJbWVtc2V0KGFkZHIsIDAsIEJMT0NLX1NJWkUpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9Cn0KCi8qCiAqIHdyaXRlX2Jsb2NrIHdyaXRlcyBibG9jayBuciB0byBkaXNrLgogKi8Kc3RhdGljIHZvaWQgd3JpdGVfYmxvY2sodW5zaWduZWQgaW50IG5yLCBjaGFyICphZGRyKQp7CglpZiAoIW5yKQoJCXJldHVybjsKCWlmIChuciA8IEZJUlNUWk9ORSB8fCBuciA+PSBaT05FUykgewoJCXByaW50ZigiSW50ZXJuYWwgZXJyb3I6IHRyeWluZyB0byB3cml0ZSBiYWQgYmxvY2tcbiIKCQkJICAgIldyaXRlIHJlcXVlc3QgaWdub3JlZFxuIik7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQlyZXR1cm47Cgl9CglpZiAoQkxPQ0tfU0laRSAqIG5yICE9IGxzZWVrKElOLCBCTE9DS19TSVpFICogbnIsIFNFRUtfU0VUKSkKCQlkaWUoInNlZWsgZmFpbGVkIGluIHdyaXRlX2Jsb2NrIik7CglpZiAoQkxPQ0tfU0laRSAhPSB3cml0ZShJTiwgYWRkciwgQkxPQ0tfU0laRSkpIHsKCQlwcmludGYoIldyaXRlIGVycm9yOiBiYWQgYmxvY2sgaW4gZmlsZSAnIik7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCInXG4iKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQp9CgovKgogKiBtYXAtYmxvY2sgY2FsY3VsYXRlcyB0aGUgYWJzb2x1dGUgYmxvY2sgbnIgb2YgYSBibG9jayBpbiBhIGZpbGUuCiAqIEl0IHNldHMgJ2NoYW5nZWQnIGlmIHRoZSBpbm9kZSBoYXMgbmVlZGVkIGNoYW5naW5nLCBhbmQgcmUtd3JpdGVzCiAqIGFueSBpbmRpcmVjdCBibG9ja3Mgd2l0aCBlcnJvcnMuCiAqLwpzdGF0aWMgaW50IG1hcF9ibG9jayhzdHJ1Y3QgbWluaXhfaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBpbnQgYmxrbnIpCnsKCXVuc2lnbmVkIHNob3J0IGluZFtCTE9DS19TSVpFID4+IDFdOwoJdW5zaWduZWQgc2hvcnQgZGluZFtCTE9DS19TSVpFID4+IDFdOwoJaW50IGJsa19jaGcsIGJsb2NrLCByZXN1bHQ7CgoJaWYgKGJsa25yIDwgNykKCQlyZXR1cm4gY2hlY2tfem9uZV9ucihpbm9kZS0+aV96b25lICsgYmxrbnIsICZjaGFuZ2VkKTsKCWJsa25yIC09IDc7CglpZiAoYmxrbnIgPCA1MTIpIHsKCQlibG9jayA9IGNoZWNrX3pvbmVfbnIoaW5vZGUtPmlfem9uZSArIDcsICZjaGFuZ2VkKTsKCQlyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJCWJsa19jaGcgPSAwOwoJCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIoYmxrbnIgKyBpbmQsICZibGtfY2hnKTsKCQlpZiAoYmxrX2NoZykKCQkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CgkJcmV0dXJuIHJlc3VsdDsKCX0KCWJsa25yIC09IDUxMjsKCWJsb2NrID0gY2hlY2tfem9uZV9ucihpbm9kZS0+aV96b25lICsgOCwgJmNoYW5nZWQpOwoJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgZGluZCk7CglibGtfY2hnID0gMDsKCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIoZGluZCArIChibGtuciAvIDUxMiksICZibGtfY2hnKTsKCWlmIChibGtfY2hnKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBkaW5kKTsKCWJsb2NrID0gcmVzdWx0OwoJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCWJsa19jaGcgPSAwOwoJcmVzdWx0ID0gY2hlY2tfem9uZV9ucihpbmQgKyAoYmxrbnIgJSA1MTIpLCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCXJldHVybiByZXN1bHQ7Cn0KCiNpZmRlZiBDT05GSUdfRkVBVFVSRV9NSU5JWDIKc3RhdGljIGludCBtYXBfYmxvY2syKHN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBpbnQgYmxrbnIpCnsKCXVuc2lnbmVkIGludCBpbmRbQkxPQ0tfU0laRSA+PiAyXTsKCXVuc2lnbmVkIGludCBkaW5kW0JMT0NLX1NJWkUgPj4gMl07Cgl1bnNpZ25lZCBpbnQgdGluZFtCTE9DS19TSVpFID4+IDJdOwoJaW50IGJsa19jaGcsIGJsb2NrLCByZXN1bHQ7CgoJaWYgKGJsa25yIDwgNykKCQlyZXR1cm4gY2hlY2tfem9uZV9ucjIoaW5vZGUtPmlfem9uZSArIGJsa25yLCAmY2hhbmdlZCk7CglibGtuciAtPSA3OwoJaWYgKGJsa25yIDwgMjU2KSB7CgkJYmxvY2sgPSBjaGVja196b25lX25yMihpbm9kZS0+aV96b25lICsgNywgJmNoYW5nZWQpOwoJCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CgkJYmxrX2NoZyA9IDA7CgkJcmVzdWx0ID0gY2hlY2tfem9uZV9ucjIoYmxrbnIgKyBpbmQsICZibGtfY2hnKTsKCQlpZiAoYmxrX2NoZykKCQkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CgkJcmV0dXJuIHJlc3VsdDsKCX0KCWJsa25yIC09IDI1NjsKCWlmIChibGtuciA+PSAyNTYgKiAyNTYpIHsKCQlibG9jayA9IGNoZWNrX3pvbmVfbnIyKGlub2RlLT5pX3pvbmUgKyA4LCAmY2hhbmdlZCk7CgkJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgZGluZCk7CgkJYmxrX2NoZyA9IDA7CgkJcmVzdWx0ID0gY2hlY2tfem9uZV9ucjIoZGluZCArIGJsa25yIC8gMjU2LCAmYmxrX2NoZyk7CgkJaWYgKGJsa19jaGcpCgkJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBkaW5kKTsKCQlibG9jayA9IHJlc3VsdDsKCQlyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJCWJsa19jaGcgPSAwOwoJCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKGluZCArIGJsa25yICUgMjU2LCAmYmxrX2NoZyk7CgkJaWYgKGJsa19jaGcpCgkJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJCXJldHVybiByZXN1bHQ7Cgl9CglibGtuciAtPSAyNTYgKiAyNTY7CglibG9jayA9IGNoZWNrX3pvbmVfbnIyKGlub2RlLT5pX3pvbmUgKyA5LCAmY2hhbmdlZCk7CglyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSB0aW5kKTsKCWJsa19jaGcgPSAwOwoJcmVzdWx0ID0gY2hlY2tfem9uZV9ucjIodGluZCArIGJsa25yIC8gKDI1NiAqIDI1NiksICZibGtfY2hnKTsKCWlmIChibGtfY2hnKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSB0aW5kKTsKCWJsb2NrID0gcmVzdWx0OwoJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgZGluZCk7CglibGtfY2hnID0gMDsKCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKGRpbmQgKyAoYmxrbnIgLyAyNTYpICUgMjU2LCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgZGluZCk7CglibG9jayA9IHJlc3VsdDsKCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CglibGtfY2hnID0gMDsKCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKGluZCArIGJsa25yICUgMjU2LCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCXJldHVybiByZXN1bHQ7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCB3cml0ZV9zdXBlcl9ibG9jayh2b2lkKQp7CgkvKgoJICogU2V0IHRoZSBzdGF0ZSBvZiB0aGUgZmlsZXN5c3RlbSBiYXNlZCBvbiB3aGV0aGVyIG9yIG5vdCB0aGVyZQoJICogYXJlIHVuY29ycmVjdGVkIGVycm9ycy4gIFRoZSBmaWxlc3lzdGVtIHZhbGlkIGZsYWcgaXMKCSAqIHVuY29uZGl0aW9uYWxseSBzZXQgaWYgd2UgZ2V0IHRoaXMgZmFyLgoJICovCglTdXBlci5zX3N0YXRlIHw9IE1JTklYX1ZBTElEX0ZTOwoJaWYgKGVycm9yc191bmNvcnJlY3RlZCkKCQlTdXBlci5zX3N0YXRlIHw9IE1JTklYX0VSUk9SX0ZTOwoJZWxzZQoJCVN1cGVyLnNfc3RhdGUgJj0gfk1JTklYX0VSUk9SX0ZTOwoKCWlmIChCTE9DS19TSVpFICE9IGxzZWVrKElOLCBCTE9DS19TSVpFLCBTRUVLX1NFVCkpCgkJZGllKCJzZWVrIGZhaWxlZCBpbiB3cml0ZV9zdXBlcl9ibG9jayIpOwoJaWYgKEJMT0NLX1NJWkUgIT0gd3JpdGUoSU4sIHN1cGVyX2Jsb2NrX2J1ZmZlciwgQkxPQ0tfU0laRSkpCgkJZGllKCJ1bmFibGUgdG8gd3JpdGUgc3VwZXItYmxvY2siKTsKCglyZXR1cm47Cn0KCnN0YXRpYyB2b2lkIHdyaXRlX3RhYmxlcyh2b2lkKQp7Cgl3cml0ZV9zdXBlcl9ibG9jaygpOwoKCWlmIChJTUFQUyAqIEJMT0NLX1NJWkUgIT0gd3JpdGUoSU4sIGlub2RlX21hcCwgSU1BUFMgKiBCTE9DS19TSVpFKSkKCQlkaWUoIlVuYWJsZSB0byB3cml0ZSBpbm9kZSBtYXAiKTsKCWlmIChaTUFQUyAqIEJMT0NLX1NJWkUgIT0gd3JpdGUoSU4sIHpvbmVfbWFwLCBaTUFQUyAqIEJMT0NLX1NJWkUpKQoJCWRpZSgiVW5hYmxlIHRvIHdyaXRlIHpvbmUgbWFwIik7CglpZiAoSU5PREVfQlVGRkVSX1NJWkUgIT0gd3JpdGUoSU4sIGlub2RlX2J1ZmZlciwgSU5PREVfQlVGRkVSX1NJWkUpKQoJCWRpZSgiVW5hYmxlIHRvIHdyaXRlIGlub2RlcyIpOwp9CgpzdGF0aWMgdm9pZCBnZXRfZGlyc2l6ZSh2b2lkKQp7CglpbnQgYmxvY2s7CgljaGFyIGJsa1tCTE9DS19TSVpFXTsKCWludCBzaXplOwoKI2lmZGVmIENPTkZJR19GRUFUVVJFX01JTklYMgoJaWYgKHZlcnNpb24yKQoJCWJsb2NrID0gSW5vZGUyW1JPT1RfSU5PXS5pX3pvbmVbMF07CgllbHNlCiNlbmRpZgoJCWJsb2NrID0gSW5vZGVbUk9PVF9JTk9dLmlfem9uZVswXTsKCXJlYWRfYmxvY2soYmxvY2ssIGJsayk7Cglmb3IgKHNpemUgPSAxNjsgc2l6ZSA8IEJMT0NLX1NJWkU7IHNpemUgPDw9IDEpIHsKCQlpZiAoc3RyY21wKGJsayArIHNpemUgKyAyLCAiLi4iKSA9PSAwKSB7CgkJCWRpcnNpemUgPSBzaXplOwoJCQluYW1lbGVuID0gc2l6ZSAtIDI7CgkJCXJldHVybjsKCQl9Cgl9CgkvKiB1c2UgZGVmYXVsdHMgKi8KfQoKc3RhdGljIHZvaWQgcmVhZF9zdXBlcmJsb2NrKHZvaWQpCnsKCWlmIChCTE9DS19TSVpFICE9IGxzZWVrKElOLCBCTE9DS19TSVpFLCBTRUVLX1NFVCkpCgkJZGllKCJzZWVrIGZhaWxlZCIpOwoJaWYgKEJMT0NLX1NJWkUgIT0gcmVhZChJTiwgc3VwZXJfYmxvY2tfYnVmZmVyLCBCTE9DS19TSVpFKSkKCQlkaWUoInVuYWJsZSB0byByZWFkIHN1cGVyIGJsb2NrIik7CglpZiAoTUFHSUMgPT0gTUlOSVhfU1VQRVJfTUFHSUMpIHsKCQluYW1lbGVuID0gMTQ7CgkJZGlyc2l6ZSA9IDE2OwoJCXZlcnNpb24yID0gMDsKCX0gZWxzZSBpZiAoTUFHSUMgPT0gTUlOSVhfU1VQRVJfTUFHSUMyKSB7CgkJbmFtZWxlbiA9IDMwOwoJCWRpcnNpemUgPSAzMjsKCQl2ZXJzaW9uMiA9IDA7CiNpZmRlZiBDT05GSUdfRkVBVFVSRV9NSU5JWDIKCX0gZWxzZSBpZiAoTUFHSUMgPT0gTUlOSVgyX1NVUEVSX01BR0lDKSB7CgkJbmFtZWxlbiA9IDE0OwoJCWRpcnNpemUgPSAxNjsKCQl2ZXJzaW9uMiA9IDE7Cgl9IGVsc2UgaWYgKE1BR0lDID09IE1JTklYMl9TVVBFUl9NQUdJQzIpIHsKCQluYW1lbGVuID0gMzA7CgkJZGlyc2l6ZSA9IDMyOwoJCXZlcnNpb24yID0gMTsKI2VuZGlmCgl9IGVsc2UKCQlkaWUoImJhZCBtYWdpYyBudW1iZXIgaW4gc3VwZXItYmxvY2siKTsKCWlmIChaT05FU0laRSAhPSAwIHx8IEJMT0NLX1NJWkUgIT0gMTAyNCkKCQlkaWUoIk9ubHkgMWsgYmxvY2tzL3pvbmVzIHN1cHBvcnRlZCIpOwoJaWYgKElNQVBTICogQkxPQ0tfU0laRSAqIDggPCBJTk9ERVMgKyAxKQoJCWRpZSgiYmFkIHNfaW1hcF9ibG9ja3MgZmllbGQgaW4gc3VwZXItYmxvY2siKTsKCWlmIChaTUFQUyAqIEJMT0NLX1NJWkUgKiA4IDwgWk9ORVMgLSBGSVJTVFpPTkUgKyAxKQoJCWRpZSgiYmFkIHNfem1hcF9ibG9ja3MgZmllbGQgaW4gc3VwZXItYmxvY2siKTsKfQoKc3RhdGljIHZvaWQgcmVhZF90YWJsZXModm9pZCkKewoJaW5vZGVfbWFwID0geG1hbGxvYyhJTUFQUyAqIEJMT0NLX1NJWkUpOwoJem9uZV9tYXAgPSB4bWFsbG9jKFpNQVBTICogQkxPQ0tfU0laRSk7CgltZW1zZXQoaW5vZGVfbWFwLCAwLCBzaXplb2YoaW5vZGVfbWFwKSk7CgltZW1zZXQoem9uZV9tYXAsIDAsIHNpemVvZih6b25lX21hcCkpOwoJaW5vZGVfYnVmZmVyID0geG1hbGxvYyhJTk9ERV9CVUZGRVJfU0laRSk7Cglpbm9kZV9jb3VudCA9IHhtYWxsb2MoSU5PREVTICsgMSk7Cgl6b25lX2NvdW50ID0geG1hbGxvYyhaT05FUyk7CglpZiAoSU1BUFMgKiBCTE9DS19TSVpFICE9IHJlYWQoSU4sIGlub2RlX21hcCwgSU1BUFMgKiBCTE9DS19TSVpFKSkKCQlkaWUoIlVuYWJsZSB0byByZWFkIGlub2RlIG1hcCIpOwoJaWYgKFpNQVBTICogQkxPQ0tfU0laRSAhPSByZWFkKElOLCB6b25lX21hcCwgWk1BUFMgKiBCTE9DS19TSVpFKSkKCQlkaWUoIlVuYWJsZSB0byByZWFkIHpvbmUgbWFwIik7CglpZiAoSU5PREVfQlVGRkVSX1NJWkUgIT0gcmVhZChJTiwgaW5vZGVfYnVmZmVyLCBJTk9ERV9CVUZGRVJfU0laRSkpCgkJZGllKCJVbmFibGUgdG8gcmVhZCBpbm9kZXMiKTsKCWlmIChOT1JNX0ZJUlNUWk9ORSAhPSBGSVJTVFpPTkUpIHsKCQlwcmludGYoIldhcm5pbmc6IEZpcnN0em9uZSAhPSBOb3JtX2ZpcnN0em9uZVxuIik7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCWdldF9kaXJzaXplKCk7CglpZiAoc2hvdykgewoJCXByaW50ZigiJWxkIGlub2Rlc1xuIiwgSU5PREVTKTsKCQlwcmludGYoIiVsZCBibG9ja3NcbiIsIFpPTkVTKTsKCQlwcmludGYoIkZpcnN0ZGF0YXpvbmU9JWxkICglbGQpXG4iLCBGSVJTVFpPTkUsIE5PUk1fRklSU1RaT05FKTsKCQlwcmludGYoIlpvbmVzaXplPSVkXG4iLCBCTE9DS19TSVpFIDw8IFpPTkVTSVpFKTsKCQlwcmludGYoIk1heHNpemU9JWxkXG4iLCBNQVhTSVpFKTsKCQlwcmludGYoIkZpbGVzeXN0ZW0gc3RhdGU9JWRcbiIsIFN1cGVyLnNfc3RhdGUpOwoJCXByaW50ZigibmFtZWxlbj0lZFxuXG4iLCBuYW1lbGVuKTsKCX0KfQoKc3RhdGljIHN0cnVjdCBtaW5peF9pbm9kZSAqZ2V0X2lub2RlKHVuc2lnbmVkIGludCBucikKewoJc3RydWN0IG1pbml4X2lub2RlICppbm9kZTsKCglpZiAoIW5yIHx8IG5yID4gSU5PREVTKQoJCXJldHVybiBOVUxMOwoJdG90YWwrKzsKCWlub2RlID0gSW5vZGUgKyBucjsKCWlmICghaW5vZGVfY291bnRbbnJdKSB7CgkJaWYgKCFpbm9kZV9pbl91c2UobnIpKSB7CgkJCXByaW50ZigiSW5vZGUgJWQgbWFya2VkIG5vdCB1c2VkLCBidXQgdXNlZCBmb3IgZmlsZSAnIiwgbnIpOwoJCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQkJcHJpbnRmKCInXG4iKTsKCQkJaWYgKHJlcGFpcikgewoJCQkJaWYgKGFzaygiTWFyayBpbiB1c2UiLCAxKSkKCQkJCQltYXJrX2lub2RlKG5yKTsKCQkJfSBlbHNlIHsKCQkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJCX0KCQl9CgkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCgkJCWRpcmVjdG9yeSsrOwoJCWVsc2UgaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCgkJCXJlZ3VsYXIrKzsKCQllbHNlIGlmIChTX0lTQ0hSKGlub2RlLT5pX21vZGUpKQoJCQljaGFyZGV2Kys7CgkJZWxzZSBpZiAoU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkKCQkJYmxvY2tkZXYrKzsKCQllbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKQoJCQlzeW1saW5rcysrOwoJCWVsc2UgaWYgKFNfSVNTT0NLKGlub2RlLT5pX21vZGUpKTsKCQllbHNlIGlmIChTX0lTRklGTyhpbm9kZS0+aV9tb2RlKSk7CgkJZWxzZSB7CgkJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCQlwcmludGYoIiBoYXMgbW9kZSAlMDVvXG4iLCBpbm9kZS0+aV9tb2RlKTsKCQl9CgoJfSBlbHNlCgkJbGlua3MrKzsKCWlmICghKytpbm9kZV9jb3VudFtucl0pIHsKCQlwcmludGYoIldhcm5pbmc6IGlub2RlIGNvdW50IHRvbyBiaWcuXG4iKTsKCQlpbm9kZV9jb3VudFtucl0tLTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQoJcmV0dXJuIGlub2RlOwp9CgojaWZkZWYgQ09ORklHX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyBzdHJ1Y3QgbWluaXgyX2lub2RlICpnZXRfaW5vZGUyKHVuc2lnbmVkIGludCBucikKewoJc3RydWN0IG1pbml4Ml9pbm9kZSAqaW5vZGU7CgoJaWYgKCFuciB8fCBuciA+IElOT0RFUykKCQlyZXR1cm4gTlVMTDsKCXRvdGFsKys7Cglpbm9kZSA9IElub2RlMiArIG5yOwoJaWYgKCFpbm9kZV9jb3VudFtucl0pIHsKCQlpZiAoIWlub2RlX2luX3VzZShucikpIHsKCQkJcHJpbnRmKCJJbm9kZSAlZCBtYXJrZWQgbm90IHVzZWQsIGJ1dCB1c2VkIGZvciBmaWxlICciLCBucik7CgkJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCQlwcmludGYoIidcbiIpOwoJCQlpZiAocmVwYWlyKSB7CgkJCQlpZiAoYXNrKCJNYXJrIGluIHVzZSIsIDEpKQoJCQkJCW1hcmtfaW5vZGUobnIpOwoJCQkJZWxzZQoJCQkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJCX0KCQl9CgkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCgkJCWRpcmVjdG9yeSsrOwoJCWVsc2UgaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCgkJCXJlZ3VsYXIrKzsKCQllbHNlIGlmIChTX0lTQ0hSKGlub2RlLT5pX21vZGUpKQoJCQljaGFyZGV2Kys7CgkJZWxzZSBpZiAoU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkKCQkJYmxvY2tkZXYrKzsKCQllbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKQoJCQlzeW1saW5rcysrOwoJCWVsc2UgaWYgKFNfSVNTT0NLKGlub2RlLT5pX21vZGUpKTsKCQllbHNlIGlmIChTX0lTRklGTyhpbm9kZS0+aV9tb2RlKSk7CgkJZWxzZSB7CgkJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCQlwcmludGYoIiBoYXMgbW9kZSAlMDVvXG4iLCBpbm9kZS0+aV9tb2RlKTsKCQl9Cgl9IGVsc2UKCQlsaW5rcysrOwoJaWYgKCErK2lub2RlX2NvdW50W25yXSkgewoJCXByaW50ZigiV2FybmluZzogaW5vZGUgY291bnQgdG9vIGJpZy5cbiIpOwoJCWlub2RlX2NvdW50W25yXS0tOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9CglyZXR1cm4gaW5vZGU7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBjaGVja19yb290KHZvaWQpCnsKCXN0cnVjdCBtaW5peF9pbm9kZSAqaW5vZGUgPSBJbm9kZSArIFJPT1RfSU5POwoKCWlmICghaW5vZGUgfHwgIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCgkJZGllKCJyb290IGlub2RlIGlzbid0IGEgZGlyZWN0b3J5Iik7Cn0KCiNpZmRlZiBDT05GSUdfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHZvaWQgY2hlY2tfcm9vdDIodm9pZCkKewoJc3RydWN0IG1pbml4Ml9pbm9kZSAqaW5vZGUgPSBJbm9kZTIgKyBST09UX0lOTzsKCglpZiAoIWlub2RlIHx8ICFTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCWRpZSgicm9vdCBpbm9kZSBpc24ndCBhIGRpcmVjdG9yeSIpOwp9CiNlbmRpZgoKc3RhdGljIGludCBhZGRfem9uZSh1bnNpZ25lZCBzaG9ydCAqem5yLCBpbnQgKmNvcnJlY3RlZCkKewoJaW50IHJlc3VsdDsKCWludCBibG9jazsKCglyZXN1bHQgPSAwOwoJYmxvY2sgPSBjaGVja196b25lX25yKHpuciwgY29ycmVjdGVkKTsKCWlmICghYmxvY2spCgkJcmV0dXJuIDA7CglpZiAoem9uZV9jb3VudFtibG9ja10pIHsKCQlwcmludGYoIkJsb2NrIGhhcyBiZWVuIHVzZWQgYmVmb3JlLiBOb3cgaW4gZmlsZSBgIik7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCInLiIpOwoJCWlmIChhc2soIkNsZWFyIiwgMSkpIHsKCQkJKnpuciA9IDA7CgkJCWJsb2NrID0gMDsKCQkJKmNvcnJlY3RlZCA9IDE7CgkJfQoJfQoJaWYgKCFibG9jaykKCQlyZXR1cm4gMDsKCWlmICghem9uZV9pbl91c2UoYmxvY2spKSB7CgkJcHJpbnRmKCJCbG9jayAlZCBpbiBmaWxlIGAiLCBibG9jayk7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCInIGlzIG1hcmtlZCBub3QgaW4gdXNlLiIpOwoJCWlmIChhc2soIkNvcnJlY3QiLCAxKSkKCQkJbWFya196b25lKGJsb2NrKTsKCX0KCWlmICghKyt6b25lX2NvdW50W2Jsb2NrXSkKCQl6b25lX2NvdW50W2Jsb2NrXS0tOwoJcmV0dXJuIGJsb2NrOwp9CgojaWZkZWYgQ09ORklHX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyBpbnQgYWRkX3pvbmUyKHVuc2lnbmVkIGludCAqem5yLCBpbnQgKmNvcnJlY3RlZCkKewoJaW50IHJlc3VsdDsKCWludCBibG9jazsKCglyZXN1bHQgPSAwOwoJYmxvY2sgPSBjaGVja196b25lX25yMih6bnIsIGNvcnJlY3RlZCk7CglpZiAoIWJsb2NrKQoJCXJldHVybiAwOwoJaWYgKHpvbmVfY291bnRbYmxvY2tdKSB7CgkJcHJpbnRmKCJCbG9jayBoYXMgYmVlbiB1c2VkIGJlZm9yZS4gTm93IGluIGZpbGUgYCIpOwoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiJy4iKTsKCQlpZiAoYXNrKCJDbGVhciIsIDEpKSB7CgkJCSp6bnIgPSAwOwoJCQlibG9jayA9IDA7CgkJCSpjb3JyZWN0ZWQgPSAxOwoJCX0KCX0KCWlmICghYmxvY2spCgkJcmV0dXJuIDA7CglpZiAoIXpvbmVfaW5fdXNlKGJsb2NrKSkgewoJCXByaW50ZigiQmxvY2sgJWQgaW4gZmlsZSBgIiwgYmxvY2spOwoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiJyBpcyBtYXJrZWQgbm90IGluIHVzZS4iKTsKCQlpZiAoYXNrKCJDb3JyZWN0IiwgMSkpCgkJCW1hcmtfem9uZShibG9jayk7Cgl9CglpZiAoISsrem9uZV9jb3VudFtibG9ja10pCgkJem9uZV9jb3VudFtibG9ja10tLTsKCXJldHVybiBibG9jazsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGFkZF96b25lX2luZCh1bnNpZ25lZCBzaG9ydCAqem5yLCBpbnQgKmNvcnJlY3RlZCkKewoJc3RhdGljIGNoYXIgYmxrW0JMT0NLX1NJWkVdOwoJaW50IGksIGNoZ19ibGsgPSAwOwoJaW50IGJsb2NrOwoKCWJsb2NrID0gYWRkX3pvbmUoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm47CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJZm9yIChpID0gMDsgaSA8IChCTE9DS19TSVpFID4+IDEpOyBpKyspCgkJYWRkX3pvbmUoaSArICh1bnNpZ25lZCBzaG9ydCAqKSBibGssICZjaGdfYmxrKTsKCWlmIChjaGdfYmxrKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCBibGspOwp9CgojaWZkZWYgQ09ORklHX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIGFkZF96b25lX2luZDIodW5zaWduZWQgaW50ICp6bnIsIGludCAqY29ycmVjdGVkKQp7CglzdGF0aWMgY2hhciBibGtbQkxPQ0tfU0laRV07CglpbnQgaSwgY2hnX2JsayA9IDA7CglpbnQgYmxvY2s7CgoJYmxvY2sgPSBhZGRfem9uZTIoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm47CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJZm9yIChpID0gMDsgaSA8IEJMT0NLX1NJWkUgPj4gMjsgaSsrKQoJCWFkZF96b25lMihpICsgKHVuc2lnbmVkIGludCAqKSBibGssICZjaGdfYmxrKTsKCWlmIChjaGdfYmxrKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCBibGspOwp9CiNlbmRpZgoKc3RhdGljIHZvaWQgYWRkX3pvbmVfZGluZCh1bnNpZ25lZCBzaG9ydCAqem5yLCBpbnQgKmNvcnJlY3RlZCkKewoJc3RhdGljIGNoYXIgYmxrW0JMT0NLX1NJWkVdOwoJaW50IGksIGJsa19jaGcgPSAwOwoJaW50IGJsb2NrOwoKCWJsb2NrID0gYWRkX3pvbmUoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm47CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJZm9yIChpID0gMDsgaSA8IChCTE9DS19TSVpFID4+IDEpOyBpKyspCgkJYWRkX3pvbmVfaW5kKGkgKyAodW5zaWduZWQgc2hvcnQgKikgYmxrLCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgYmxrKTsKfQoKI2lmZGVmIENPTkZJR19GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCBhZGRfem9uZV9kaW5kMih1bnNpZ25lZCBpbnQgKnpuciwgaW50ICpjb3JyZWN0ZWQpCnsKCXN0YXRpYyBjaGFyIGJsa1tCTE9DS19TSVpFXTsKCWludCBpLCBibGtfY2hnID0gMDsKCWludCBibG9jazsKCglibG9jayA9IGFkZF96b25lMih6bnIsIGNvcnJlY3RlZCk7CglpZiAoIWJsb2NrKQoJCXJldHVybjsKCXJlYWRfYmxvY2soYmxvY2ssIGJsayk7Cglmb3IgKGkgPSAwOyBpIDwgQkxPQ0tfU0laRSA+PiAyOyBpKyspCgkJYWRkX3pvbmVfaW5kMihpICsgKHVuc2lnbmVkIGludCAqKSBibGssICZibGtfY2hnKTsKCWlmIChibGtfY2hnKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCBibGspOwp9CgpzdGF0aWMgdm9pZCBhZGRfem9uZV90aW5kMih1bnNpZ25lZCBpbnQgKnpuciwgaW50ICpjb3JyZWN0ZWQpCnsKCXN0YXRpYyBjaGFyIGJsa1tCTE9DS19TSVpFXTsKCWludCBpLCBibGtfY2hnID0gMDsKCWludCBibG9jazsKCglibG9jayA9IGFkZF96b25lMih6bnIsIGNvcnJlY3RlZCk7CglpZiAoIWJsb2NrKQoJCXJldHVybjsKCXJlYWRfYmxvY2soYmxvY2ssIGJsayk7Cglmb3IgKGkgPSAwOyBpIDwgQkxPQ0tfU0laRSA+PiAyOyBpKyspCgkJYWRkX3pvbmVfZGluZDIoaSArICh1bnNpZ25lZCBpbnQgKikgYmxrLCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgYmxrKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGNoZWNrX3pvbmVzKHVuc2lnbmVkIGludCBpKQp7CglzdHJ1Y3QgbWluaXhfaW5vZGUgKmlub2RlOwoKCWlmICghaSB8fCBpID4gSU5PREVTKQoJCXJldHVybjsKCWlmIChpbm9kZV9jb3VudFtpXSA+IDEpCQkvKiBoYXZlIHdlIGNvdW50ZWQgdGhpcyBmaWxlIGFscmVhZHk/ICovCgkJcmV0dXJuOwoJaW5vZGUgPSBJbm9kZSArIGk7CglpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYKCQkhU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgcmV0dXJuOwoJZm9yIChpID0gMDsgaSA8IDc7IGkrKykKCQlhZGRfem9uZShpICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwoJYWRkX3pvbmVfaW5kKDcgKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7CglhZGRfem9uZV9kaW5kKDggKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7Cn0KCiNpZmRlZiBDT05GSUdfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHZvaWQgY2hlY2tfem9uZXMyKHVuc2lnbmVkIGludCBpKQp7CglzdHJ1Y3QgbWluaXgyX2lub2RlICppbm9kZTsKCglpZiAoIWkgfHwgaSA+IElOT0RFUykKCQlyZXR1cm47CglpZiAoaW5vZGVfY291bnRbaV0gPiAxKQkJLyogaGF2ZSB3ZSBjb3VudGVkIHRoaXMgZmlsZSBhbHJlYWR5PyAqLwoJCXJldHVybjsKCWlub2RlID0gSW5vZGUyICsgaTsKCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJiAhU19JU1JFRyhpbm9kZS0+aV9tb2RlKQoJCSYmICFTX0lTTE5LKGlub2RlLT5pX21vZGUpKQoJCXJldHVybjsKCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCgkJYWRkX3pvbmUyKGkgKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7CglhZGRfem9uZV9pbmQyKDcgKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7CglhZGRfem9uZV9kaW5kMig4ICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwoJYWRkX3pvbmVfdGluZDIoOSArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGNoZWNrX2ZpbGUoc3RydWN0IG1pbml4X2lub2RlICpkaXIsIHVuc2lnbmVkIGludCBvZmZzZXQpCnsKCXN0YXRpYyBjaGFyIGJsa1tCTE9DS19TSVpFXTsKCXN0cnVjdCBtaW5peF9pbm9kZSAqaW5vZGU7CglpbnQgaW5vOwoJY2hhciAqbmFtZTsKCWludCBibG9jazsKCglibG9jayA9IG1hcF9ibG9jayhkaXIsIG9mZnNldCAvIEJMT0NLX1NJWkUpOwoJcmVhZF9ibG9jayhibG9jaywgYmxrKTsKCW5hbWUgPSBibGsgKyAob2Zmc2V0ICUgQkxPQ0tfU0laRSkgKyAyOwoJaW5vID0gKih1bnNpZ25lZCBzaG9ydCAqKSAobmFtZSAtIDIpOwoJaWYgKGlubyA+IElOT0RFUykgewoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiIGNvbnRhaW5zIGEgYmFkIGlub2RlIG51bWJlciBmb3IgZmlsZSAnIik7CgkJcHJpbnRmKCIlLipzJy4iLCBuYW1lbGVuLCBuYW1lKTsKCQlpZiAoYXNrKCIgUmVtb3ZlIiwgMSkpIHsKCQkJKih1bnNpZ25lZCBzaG9ydCAqKSAobmFtZSAtIDIpID0gMDsKCQkJd3JpdGVfYmxvY2soYmxvY2ssIGJsayk7CgkJfQoJCWlubyA9IDA7Cgl9CglpZiAobmFtZV9kZXB0aCA8IE1BWF9ERVBUSCkKCQlzdHJuY3B5KG5hbWVfbGlzdFtuYW1lX2RlcHRoXSwgbmFtZSwgbmFtZWxlbik7CgluYW1lX2RlcHRoKys7Cglpbm9kZSA9IGdldF9pbm9kZShpbm8pOwoJbmFtZV9kZXB0aC0tOwoJaWYgKCFvZmZzZXQpIHsKCQlpZiAoIWlub2RlIHx8IHN0cmNtcCgiLiIsIG5hbWUpKSB7CgkJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCQlwcmludGYoIjogYmFkIGRpcmVjdG9yeTogJy4nIGlzbid0IGZpcnN0XG4iKTsKCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQl9IGVsc2UKCQkJcmV0dXJuOwoJfQoJaWYgKG9mZnNldCA9PSBkaXJzaXplKSB7CgkJaWYgKCFpbm9kZSB8fCBzdHJjbXAoIi4uIiwgbmFtZSkpIHsKCQkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJCXByaW50ZigiOiBiYWQgZGlyZWN0b3J5OiAnLi4nIGlzbid0IHNlY29uZFxuIik7CgkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJfSBlbHNlCgkJCXJldHVybjsKCX0KCWlmICghaW5vZGUpCgkJcmV0dXJuOwoJaWYgKG5hbWVfZGVwdGggPCBNQVhfREVQVEgpCgkJc3RybmNweShuYW1lX2xpc3RbbmFtZV9kZXB0aF0sIG5hbWUsIG5hbWVsZW4pOwoJbmFtZV9kZXB0aCsrOwoJaWYgKGxpc3QpIHsKCQlpZiAodmVyYm9zZSkKCQkJcHJpbnRmKCIlNmQgJTA3byAlM2QgIiwgaW5vLCBpbm9kZS0+aV9tb2RlLCBpbm9kZS0+aV9ubGlua3MpOwoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCQlwcmludGYoIjpcbiIpOwoJCWVsc2UKCQkJcHJpbnRmKCJcbiIpOwoJfQoJY2hlY2tfem9uZXMoaW5vKTsKCWlmIChpbm9kZSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCXJlY3Vyc2l2ZV9jaGVjayhpbm8pOwoJbmFtZV9kZXB0aC0tOwoJcmV0dXJuOwp9CgojaWZkZWYgQ09ORklHX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIGNoZWNrX2ZpbGUyKHN0cnVjdCBtaW5peDJfaW5vZGUgKmRpciwgdW5zaWduZWQgaW50IG9mZnNldCkKewoJc3RhdGljIGNoYXIgYmxrW0JMT0NLX1NJWkVdOwoJc3RydWN0IG1pbml4Ml9pbm9kZSAqaW5vZGU7CglpbnQgaW5vOwoJY2hhciAqbmFtZTsKCWludCBibG9jazsKCglibG9jayA9IG1hcF9ibG9jazIoZGlyLCBvZmZzZXQgLyBCTE9DS19TSVpFKTsKCXJlYWRfYmxvY2soYmxvY2ssIGJsayk7CgluYW1lID0gYmxrICsgKG9mZnNldCAlIEJMT0NLX1NJWkUpICsgMjsKCWlubyA9ICoodW5zaWduZWQgc2hvcnQgKikgKG5hbWUgLSAyKTsKCWlmIChpbm8gPiBJTk9ERVMpIHsKCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQlwcmludGYoIiBjb250YWlucyBhIGJhZCBpbm9kZSBudW1iZXIgZm9yIGZpbGUgJyIpOwoJCXByaW50ZigiJS4qcycuIiwgbmFtZWxlbiwgbmFtZSk7CgkJaWYgKGFzaygiIFJlbW92ZSIsIDEpKSB7CgkJCSoodW5zaWduZWQgc2hvcnQgKikgKG5hbWUgLSAyKSA9IDA7CgkJCXdyaXRlX2Jsb2NrKGJsb2NrLCBibGspOwoJCX0KCQlpbm8gPSAwOwoJfQoJaWYgKG5hbWVfZGVwdGggPCBNQVhfREVQVEgpCgkJc3RybmNweShuYW1lX2xpc3RbbmFtZV9kZXB0aF0sIG5hbWUsIG5hbWVsZW4pOwoJbmFtZV9kZXB0aCsrOwoJaW5vZGUgPSBnZXRfaW5vZGUyKGlubyk7CgluYW1lX2RlcHRoLS07CglpZiAoIW9mZnNldCkgewoJCWlmICghaW5vZGUgfHwgc3RyY21wKCIuIiwgbmFtZSkpIHsKCQkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJCXByaW50ZigiOiBiYWQgZGlyZWN0b3J5OiAnLicgaXNuJ3QgZmlyc3RcbiIpOwoJCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCX0gZWxzZQoJCQlyZXR1cm47Cgl9CglpZiAob2Zmc2V0ID09IGRpcnNpemUpIHsKCQlpZiAoIWlub2RlIHx8IHN0cmNtcCgiLi4iLCBuYW1lKSkgewoJCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQkJcHJpbnRmKCI6IGJhZCBkaXJlY3Rvcnk6ICcuLicgaXNuJ3Qgc2Vjb25kXG4iKTsKCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQl9IGVsc2UKCQkJcmV0dXJuOwoJfQoJaWYgKCFpbm9kZSkKCQlyZXR1cm47CgluYW1lX2RlcHRoKys7CglpZiAobGlzdCkgewoJCWlmICh2ZXJib3NlKQoJCQlwcmludGYoIiU2ZCAlMDdvICUzZCAiLCBpbm8sIGlub2RlLT5pX21vZGUsIGlub2RlLT5pX25saW5rcyk7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCgkJCXByaW50ZigiOlxuIik7CgkJZWxzZQoJCQlwcmludGYoIlxuIik7Cgl9CgljaGVja196b25lczIoaW5vKTsKCWlmIChpbm9kZSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCXJlY3Vyc2l2ZV9jaGVjazIoaW5vKTsKCW5hbWVfZGVwdGgtLTsKCXJldHVybjsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIHJlY3Vyc2l2ZV9jaGVjayh1bnNpZ25lZCBpbnQgaW5vKQp7CglzdHJ1Y3QgbWluaXhfaW5vZGUgKmRpcjsKCXVuc2lnbmVkIGludCBvZmZzZXQ7CgoJZGlyID0gSW5vZGUgKyBpbm87CglpZiAoIVNfSVNESVIoZGlyLT5pX21vZGUpKQoJCWRpZSgiaW50ZXJuYWwgZXJyb3IiKTsKCWlmIChkaXItPmlfc2l6ZSA8IDIgKiBkaXJzaXplKSB7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCI6IGJhZCBkaXJlY3Rvcnk6IHNpemU8MzIiKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQoJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBkaXItPmlfc2l6ZTsgb2Zmc2V0ICs9IGRpcnNpemUpCgkJY2hlY2tfZmlsZShkaXIsIG9mZnNldCk7Cn0KCiNpZmRlZiBDT05GSUdfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHZvaWQgcmVjdXJzaXZlX2NoZWNrMih1bnNpZ25lZCBpbnQgaW5vKQp7CglzdHJ1Y3QgbWluaXgyX2lub2RlICpkaXI7Cgl1bnNpZ25lZCBpbnQgb2Zmc2V0OwoKCWRpciA9IElub2RlMiArIGlubzsKCWlmICghU19JU0RJUihkaXItPmlfbW9kZSkpCgkJZGllKCJpbnRlcm5hbCBlcnJvciIpOwoJaWYgKGRpci0+aV9zaXplIDwgMiAqIGRpcnNpemUpIHsKCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQlwcmludGYoIjogYmFkIGRpcmVjdG9yeTogc2l6ZSA8IDMyIik7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZGlyLT5pX3NpemU7IG9mZnNldCArPSBkaXJzaXplKQoJCWNoZWNrX2ZpbGUyKGRpciwgb2Zmc2V0KTsKfQojZW5kaWYKCnN0YXRpYyBpbnQgYmFkX3pvbmUoaW50IGkpCnsKCWNoYXIgYnVmZmVyWzEwMjRdOwoKCWlmIChCTE9DS19TSVpFICogaSAhPSBsc2VlayhJTiwgQkxPQ0tfU0laRSAqIGksIFNFRUtfU0VUKSkKCQlkaWUoInNlZWsgZmFpbGVkIGluIGJhZF96b25lIik7CglyZXR1cm4gKEJMT0NLX1NJWkUgIT0gcmVhZChJTiwgYnVmZmVyLCBCTE9DS19TSVpFKSk7Cn0KCnN0YXRpYyB2b2lkIGNoZWNrX2NvdW50cyh2b2lkKQp7CglpbnQgaTsKCglmb3IgKGkgPSAxOyBpIDw9IElOT0RFUzsgaSsrKSB7CgkJaWYgKCFpbm9kZV9pbl91c2UoaSkgJiYgSW5vZGVbaV0uaV9tb2RlICYmIHdhcm5fbW9kZSkgewoJCQlwcmludGYoIklub2RlICVkIG1vZGUgbm90IGNsZWFyZWQuIiwgaSk7CgkJCWlmIChhc2soIkNsZWFyIiwgMSkpIHsKCQkJCUlub2RlW2ldLmlfbW9kZSA9IDA7CgkJCQljaGFuZ2VkID0gMTsKCQkJfQoJCX0KCQlpZiAoIWlub2RlX2NvdW50W2ldKSB7CgkJCWlmICghaW5vZGVfaW5fdXNlKGkpKQoJCQkJY29udGludWU7CgkJCXByaW50ZigiSW5vZGUgJWQgbm90IHVzZWQsIG1hcmtlZCB1c2VkIGluIHRoZSBiaXRtYXAuIiwgaSk7CgkJCWlmIChhc2soIkNsZWFyIiwgMSkpCgkJCQl1bm1hcmtfaW5vZGUoaSk7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoIWlub2RlX2luX3VzZShpKSkgewoJCQlwcmludGYoIklub2RlICVkIHVzZWQsIG1hcmtlZCB1bnVzZWQgaW4gdGhlIGJpdG1hcC4iLCBpKTsKCQkJaWYgKGFzaygiU2V0IiwgMSkpCgkJCQltYXJrX2lub2RlKGkpOwoJCX0KCQlpZiAoSW5vZGVbaV0uaV9ubGlua3MgIT0gaW5vZGVfY291bnRbaV0pIHsKCQkJcHJpbnRmKCJJbm9kZSAlZCAobW9kZSA9ICUwN28pLCBpX25saW5rcz0lZCwgY291bnRlZD0lZC4iLAoJCQkJICAgaSwgSW5vZGVbaV0uaV9tb2RlLCBJbm9kZVtpXS5pX25saW5rcywgaW5vZGVfY291bnRbaV0pOwoJCQlpZiAoYXNrKCJTZXQgaV9ubGlua3MgdG8gY291bnQiLCAxKSkgewoJCQkJSW5vZGVbaV0uaV9ubGlua3MgPSBpbm9kZV9jb3VudFtpXTsKCQkJCWNoYW5nZWQgPSAxOwoJCQl9CgkJfQoJfQoJZm9yIChpID0gRklSU1RaT05FOyBpIDwgWk9ORVM7IGkrKykgewoJCWlmICh6b25lX2luX3VzZShpKSA9PSB6b25lX2NvdW50W2ldKQoJCQljb250aW51ZTsKCQlpZiAoIXpvbmVfY291bnRbaV0pIHsKCQkJaWYgKGJhZF96b25lKGkpKQoJCQkJY29udGludWU7CgkJCXByaW50ZigiWm9uZSAlZDogbWFya2VkIGluIHVzZSwgbm8gZmlsZSB1c2VzIGl0LiIsIGkpOwoJCQlpZiAoYXNrKCJVbm1hcmsiLCAxKSkKCQkJCXVubWFya196b25lKGkpOwoJCQljb250aW51ZTsKCQl9CgkJcHJpbnRmKCJab25lICVkOiAlc2luIHVzZSwgY291bnRlZD0lZFxuIiwKCQkJICAgaSwgem9uZV9pbl91c2UoaSkgPyAiIiA6ICJub3QgIiwgem9uZV9jb3VudFtpXSk7Cgl9Cn0KCiNpZmRlZiBDT05GSUdfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHZvaWQgY2hlY2tfY291bnRzMih2b2lkKQp7CglpbnQgaTsKCglmb3IgKGkgPSAxOyBpIDw9IElOT0RFUzsgaSsrKSB7CgkJaWYgKCFpbm9kZV9pbl91c2UoaSkgJiYgSW5vZGUyW2ldLmlfbW9kZSAmJiB3YXJuX21vZGUpIHsKCQkJcHJpbnRmKCJJbm9kZSAlZCBtb2RlIG5vdCBjbGVhcmVkLiIsIGkpOwoJCQlpZiAoYXNrKCJDbGVhciIsIDEpKSB7CgkJCQlJbm9kZTJbaV0uaV9tb2RlID0gMDsKCQkJCWNoYW5nZWQgPSAxOwoJCQl9CgkJfQoJCWlmICghaW5vZGVfY291bnRbaV0pIHsKCQkJaWYgKCFpbm9kZV9pbl91c2UoaSkpCgkJCQljb250aW51ZTsKCQkJcHJpbnRmKCJJbm9kZSAlZCBub3QgdXNlZCwgbWFya2VkIHVzZWQgaW4gdGhlIGJpdG1hcC4iLCBpKTsKCQkJaWYgKGFzaygiQ2xlYXIiLCAxKSkKCQkJCXVubWFya19pbm9kZShpKTsKCQkJY29udGludWU7CgkJfQoJCWlmICghaW5vZGVfaW5fdXNlKGkpKSB7CgkJCXByaW50ZigiSW5vZGUgJWQgdXNlZCwgbWFya2VkIHVudXNlZCBpbiB0aGUgYml0bWFwLiIsIGkpOwoJCQlpZiAoYXNrKCJTZXQiLCAxKSkKCQkJCW1hcmtfaW5vZGUoaSk7CgkJfQoJCWlmIChJbm9kZTJbaV0uaV9ubGlua3MgIT0gaW5vZGVfY291bnRbaV0pIHsKCQkJcHJpbnRmKCJJbm9kZSAlZCAobW9kZSA9ICUwN28pLCBpX25saW5rcz0lZCwgY291bnRlZD0lZC4iLAoJCQkJICAgaSwgSW5vZGUyW2ldLmlfbW9kZSwgSW5vZGUyW2ldLmlfbmxpbmtzLAoJCQkJICAgaW5vZGVfY291bnRbaV0pOwoJCQlpZiAoYXNrKCJTZXQgaV9ubGlua3MgdG8gY291bnQiLCAxKSkgewoJCQkJSW5vZGUyW2ldLmlfbmxpbmtzID0gaW5vZGVfY291bnRbaV07CgkJCQljaGFuZ2VkID0gMTsKCQkJfQoJCX0KCX0KCWZvciAoaSA9IEZJUlNUWk9ORTsgaSA8IFpPTkVTOyBpKyspIHsKCQlpZiAoem9uZV9pbl91c2UoaSkgPT0gem9uZV9jb3VudFtpXSkKCQkJY29udGludWU7CgkJaWYgKCF6b25lX2NvdW50W2ldKSB7CgkJCWlmIChiYWRfem9uZShpKSkKCQkJCWNvbnRpbnVlOwoJCQlwcmludGYoIlpvbmUgJWQ6IG1hcmtlZCBpbiB1c2UsIG5vIGZpbGUgdXNlcyBpdC4iLCBpKTsKCQkJaWYgKGFzaygiVW5tYXJrIiwgMSkpCgkJCQl1bm1hcmtfem9uZShpKTsKCQkJY29udGludWU7CgkJfQoJCXByaW50ZigiWm9uZSAlZDogJXNpbiB1c2UsIGNvdW50ZWQ9JWRcbiIsCgkJCSAgIGksIHpvbmVfaW5fdXNlKGkpID8gIiIgOiAibm90ICIsIHpvbmVfY291bnRbaV0pOwoJfQp9CiNlbmRpZgoKc3RhdGljIHZvaWQgY2hlY2sodm9pZCkKewoJbWVtc2V0KGlub2RlX2NvdW50LCAwLCAoSU5PREVTICsgMSkgKiBzaXplb2YoKmlub2RlX2NvdW50KSk7CgltZW1zZXQoem9uZV9jb3VudCwgMCwgWk9ORVMgKiBzaXplb2YoKnpvbmVfY291bnQpKTsKCWNoZWNrX3pvbmVzKFJPT1RfSU5PKTsKCXJlY3Vyc2l2ZV9jaGVjayhST09UX0lOTyk7CgljaGVja19jb3VudHMoKTsKfQoKI2lmZGVmIENPTkZJR19GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCBjaGVjazIodm9pZCkKewoJbWVtc2V0KGlub2RlX2NvdW50LCAwLCAoSU5PREVTICsgMSkgKiBzaXplb2YoKmlub2RlX2NvdW50KSk7CgltZW1zZXQoem9uZV9jb3VudCwgMCwgWk9ORVMgKiBzaXplb2YoKnpvbmVfY291bnQpKTsKCWNoZWNrX3pvbmVzMihST09UX0lOTyk7CglyZWN1cnNpdmVfY2hlY2syKFJPT1RfSU5PKTsKCWNoZWNrX2NvdW50czIoKTsKfQojZW5kaWYKCi8qIFdlZCBGZWIgIDkgMTU6MTc6MDYgTVNUIDIwMDAgKi8KLyogZHluYW1pY2FsbHkgYWxsb2NhdGUgbmFtZV9saXN0IChpbnN0ZWFkIG9mIG1ha2luZyBpdCBzdGF0aWMpICovCnN0YXRpYyB2b2lkIGFsbG9jX25hbWVfbGlzdCh2b2lkKQp7CglpbnQgaTsKCgluYW1lX2xpc3QgPSB4bWFsbG9jKHNpemVvZihjaGFyICopICogTUFYX0RFUFRIKTsKCWZvciAoaSA9IDA7IGkgPCBNQVhfREVQVEg7IGkrKykKCQluYW1lX2xpc3RbaV0gPSB4bWFsbG9jKHNpemVvZihjaGFyKSAqIEJVRlNJWiArIDEpOwp9CgojaWZkZWYgQ09ORklHX0ZFQVRVUkVfQ0xFQU5fVVAKLyogZXhlY3V0ZSB0aGlzIGF0ZXhpdCgpIHRvIGRlYWxsb2NhdGUgbmFtZV9saXN0W10gKi8KLyogcGlwdGlnZ2VyIHdhcyBoZXJlICovCnN0YXRpYyB2b2lkIGZyZWVfbmFtZV9saXN0KHZvaWQpCnsKCWludCBpOwoKCWlmIChuYW1lX2xpc3QpIHsKCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0RFUFRIOyBpKyspIHsKCQkJZnJlZShuYW1lX2xpc3RbaV0pOwoJCX0KCQlmcmVlKG5hbWVfbGlzdCk7Cgl9Cn0KI2VuZGlmCgppbnQgZnNja19taW5peF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewoJc3RydWN0IHRlcm1pb3MgdG1wOwoJaW50IGNvdW50OwoJaW50IHJldGNvZGUgPSAwOwoKCWFsbG9jX25hbWVfbGlzdCgpOwojaWZkZWYgQ09ORklHX0ZFQVRVUkVfQ0xFQU5fVVAKCS8qIERvbid0IGJvdGhlciB0byBmcmVlIG1lbW9yeS4gIEV4aXQgZG9lcwoJICogdGhhdCBhdXRvbWFnaWNhbGx5LCBzbyB3ZSBjYW4gc2F2ZSBhIGZldyBieXRlcyAqLwoJYXRleGl0KGZyZWVfbmFtZV9saXN0KTsKI2VuZGlmCgoJaWYgKElOT0RFX1NJWkUgKiBNSU5JWF9JTk9ERVNfUEVSX0JMT0NLICE9IEJMT0NLX1NJWkUpCgkJZGllKCJiYWQgaW5vZGUgc2l6ZSIpOwojaWZkZWYgQ09ORklHX0ZFQVRVUkVfTUlOSVgyCglpZiAoSU5PREVfU0laRTIgKiBNSU5JWDJfSU5PREVTX1BFUl9CTE9DSyAhPSBCTE9DS19TSVpFKQoJCWRpZSgiYmFkIHYyIGlub2RlIHNpemUiKTsKI2VuZGlmCgl3aGlsZSAoYXJnYy0tID4gMSkgewoJCWFyZ3YrKzsKCQlpZiAoYXJndlswXVswXSAhPSAnLScpIHsKCQkJaWYgKGRldmljZV9uYW1lKQoJCQkJYmJfc2hvd191c2FnZSgpOwoJCQllbHNlCgkJCQlkZXZpY2VfbmFtZSA9IGFyZ3ZbMF07CgkJfSBlbHNlCgkJCXdoaWxlICgqKythcmd2WzBdKQoJCQkJc3dpdGNoIChhcmd2WzBdWzBdKSB7CgkJCQljYXNlICdsJzoKCQkJCQlsaXN0ID0gMTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ2EnOgoJCQkJCWF1dG9tYXRpYyA9IDE7CgkJCQkJcmVwYWlyID0gMTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ3InOgoJCQkJCWF1dG9tYXRpYyA9IDA7CgkJCQkJcmVwYWlyID0gMTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ3YnOgoJCQkJCXZlcmJvc2UgPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAncyc6CgkJCQkJc2hvdyA9IDE7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdtJzoKCQkJCQl3YXJuX21vZGUgPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAnZic6CgkJCQkJZm9yY2UgPSAxOwoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQliYl9zaG93X3VzYWdlKCk7CgkJCQl9Cgl9CglpZiAoIWRldmljZV9uYW1lKQoJCWJiX3Nob3dfdXNhZ2UoKTsKCWNoZWNrX21vdW50KCk7CQkJCS8qIHRyeWluZyB0byBjaGVjayBhIG1vdW50ZWQgZmlsZXN5c3RlbT8gKi8KCWlmIChyZXBhaXIgJiYgIWF1dG9tYXRpYykgewoJCWlmICghaXNhdHR5KDApIHx8ICFpc2F0dHkoMSkpCgkJCWRpZSgibmVlZCB0ZXJtaW5hbCBmb3IgaW50ZXJhY3RpdmUgcmVwYWlycyIpOwoJfQoJSU4gPSBvcGVuKGRldmljZV9uYW1lLCByZXBhaXIgPyBPX1JEV1IgOiBPX1JET05MWSk7CglpZiAoSU4gPCAwKXsKCQlmcHJpbnRmKHN0ZGVyciwidW5hYmxlIHRvIG9wZW4gZGV2aWNlICclcycuXG4iLGRldmljZV9uYW1lKTsKCQlsZWF2ZSg4KTsKCX0KCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDM7IGNvdW50KyspCgkJc3luYygpOwoJcmVhZF9zdXBlcmJsb2NrKCk7CgoJLyoKCSAqIERldGVybWluZSB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgY29udGludWUgd2l0aCB0aGUgY2hlY2tpbmcuCgkgKiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBzdGF0dXMgb2YgdGhlIGZpbGVzeXN0ZW0gdmFsaWQgYW5kIGVycm9yCgkgKiBmbGFncyBhbmQgd2hldGhlciBvciBub3QgdGhlIC1mIHN3aXRjaCB3YXMgc3BlY2lmaWVkIG9uIHRoZQoJICogY29tbWFuZCBsaW5lLgoJICovCglwcmludGYoIiVzLCAlc1xuIiwgYmJfYXBwbGV0X25hbWUsIHByb2dyYW1fdmVyc2lvbik7CglpZiAoIShTdXBlci5zX3N0YXRlICYgTUlOSVhfRVJST1JfRlMpICYmCgkJKFN1cGVyLnNfc3RhdGUgJiBNSU5JWF9WQUxJRF9GUykgJiYgIWZvcmNlKSB7CgkJaWYgKHJlcGFpcikKCQkJcHJpbnRmKCIlcyBpcyBjbGVhbiwgbm8gY2hlY2suXG4iLCBkZXZpY2VfbmFtZSk7CgkJcmV0dXJuIHJldGNvZGU7Cgl9IGVsc2UgaWYgKGZvcmNlKQoJCXByaW50ZigiRm9yY2luZyBmaWxlc3lzdGVtIGNoZWNrIG9uICVzLlxuIiwgZGV2aWNlX25hbWUpOwoJZWxzZSBpZiAocmVwYWlyKQoJCXByaW50ZigiRmlsZXN5c3RlbSBvbiAlcyBpcyBkaXJ0eSwgbmVlZHMgY2hlY2tpbmcuXG4iLAoJCQkgICBkZXZpY2VfbmFtZSk7CgoJcmVhZF90YWJsZXMoKTsKCglpZiAocmVwYWlyICYmICFhdXRvbWF0aWMpIHsKCQl0Y2dldGF0dHIoMCwgJnRlcm1pb3MpOwoJCXRtcCA9IHRlcm1pb3M7CgkJdG1wLmNfbGZsYWcgJj0gfihJQ0FOT04gfCBFQ0hPKTsKCQl0Y3NldGF0dHIoMCwgVENTQU5PVywgJnRtcCk7CgkJdGVybWlvc19zZXQgPSAxOwoJfQojaWZkZWYgQ09ORklHX0ZFQVRVUkVfTUlOSVgyCglpZiAodmVyc2lvbjIpIHsKCQljaGVja19yb290MigpOwoJCWNoZWNrMigpOwoJfSBlbHNlCiNlbmRpZgoJewoJCWNoZWNrX3Jvb3QoKTsKCQljaGVjaygpOwoJfQoJaWYgKHZlcmJvc2UpIHsKCQlpbnQgaSwgZnJlZV9jbnQ7CgoJCWZvciAoaSA9IDEsIGZyZWVfY250ID0gMDsgaSA8PSBJTk9ERVM7IGkrKykKCQkJaWYgKCFpbm9kZV9pbl91c2UoaSkpCgkJCQlmcmVlX2NudCsrOwoJCXByaW50ZigiXG4lNmxkIGlub2RlcyB1c2VkICglbGQlJSlcbiIsIChJTk9ERVMgLSBmcmVlX2NudCksCgkJCSAgIDEwMCAqIChJTk9ERVMgLSBmcmVlX2NudCkgLyBJTk9ERVMpOwoJCWZvciAoaSA9IEZJUlNUWk9ORSwgZnJlZV9jbnQgPSAwOyBpIDwgWk9ORVM7IGkrKykKCQkJaWYgKCF6b25lX2luX3VzZShpKSkKCQkJCWZyZWVfY250Kys7CgkJcHJpbnRmKCIlNmxkIHpvbmVzIHVzZWQgKCVsZCUlKVxuIiwgKFpPTkVTIC0gZnJlZV9jbnQpLAoJCQkgICAxMDAgKiAoWk9ORVMgLSBmcmVlX2NudCkgLyBaT05FUyk7CgkJcHJpbnRmKCJcbiU2ZCByZWd1bGFyIGZpbGVzXG4iCgkJCSAgICIlNmQgZGlyZWN0b3JpZXNcbiIKCQkJICAgIiU2ZCBjaGFyYWN0ZXIgZGV2aWNlIGZpbGVzXG4iCgkJCSAgICIlNmQgYmxvY2sgZGV2aWNlIGZpbGVzXG4iCgkJCSAgICIlNmQgbGlua3NcbiIKCQkJICAgIiU2ZCBzeW1ib2xpYyBsaW5rc1xuIgoJCQkgICAiLS0tLS0tXG4iCgkJCSAgICIlNmQgZmlsZXNcbiIsCgkJCSAgIHJlZ3VsYXIsIGRpcmVjdG9yeSwgY2hhcmRldiwgYmxvY2tkZXYsCgkJCSAgIGxpbmtzIC0gMiAqIGRpcmVjdG9yeSArIDEsIHN5bWxpbmtzLAoJCQkgICB0b3RhbCAtIDIgKiBkaXJlY3RvcnkgKyAxKTsKCX0KCWlmIChjaGFuZ2VkKSB7CgkJd3JpdGVfdGFibGVzKCk7CgkJcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCgkJCSAgICJGSUxFIFNZU1RFTSBIQVMgQkVFTiBDSEFOR0VEXG4iCgkJCSAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAzOyBjb3VudCsrKQoJCQlzeW5jKCk7Cgl9IGVsc2UgaWYgKHJlcGFpcikKCQl3cml0ZV9zdXBlcl9ibG9jaygpOwoKCWlmIChyZXBhaXIgJiYgIWF1dG9tYXRpYykKCQl0Y3NldGF0dHIoMCwgVENTQU5PVywgJnRlcm1pb3MpOwoKCWlmIChjaGFuZ2VkKQoJCXJldGNvZGUgKz0gMzsKCWlmIChlcnJvcnNfdW5jb3JyZWN0ZWQpCgkJcmV0Y29kZSArPSA0OwoJcmV0dXJuIHJldGNvZGU7Cn0K