LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIFN05HVibGkgRmF2ZXJnZXMgLSA8d3d3LnN0YXVibGkuY29tPgogKiBQaWVycmUgQVVCRVJUICBwLmF1YmVydEBzdGF1YmxpLmNvbQogKgogKiAoQykgQ29weXJpZ2h0IDIwMDUKICogTWFydGluIEtyYXVzZSBUUS1TeXN0ZW1zIEdtYkggbWFydGluLmtyYXVzZUB0cXMuZGUKICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgovKgogKiBCYXNpYyB2aWRlbyBzdXBwb3J0IGZvciBTTUkgU001MDEgIlZveWFnZXIiIGdyYXBoaWMgY29udHJvbGxlcgogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KCiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPHZpZGVvX2ZiLmg+CiNpbmNsdWRlIDxzbTUwMS5oPgoKI2RlZmluZSByZWFkOChwdHJSZWcpICAgICAgICAgICAgICAgIFwKICAgICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShzbTUwMS5pc2FCYXNlICsgcHRyUmVnKQoKI2RlZmluZSB3cml0ZTgocHRyUmVnLHZhbHVlKSBcCiAgICAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikoc201MDEuaXNhQmFzZSArIHB0clJlZykgPSB2YWx1ZQoKI2RlZmluZSByZWFkMTYocHRyUmVnKSBcCiAgICAoKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKShzbTUwMS5pc2FCYXNlICsgcHRyUmVnKSkKCiNkZWZpbmUgd3JpdGUxNihwdHJSZWcsdmFsdWUpIFwKICAgICgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKHNtNTAxLmlzYUJhc2UgKyBwdHJSZWcpID0gdmFsdWUpCgojZGVmaW5lIHJlYWQzMihwdHJSZWcpIFwKICAgICgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKShzbTUwMS5pc2FCYXNlICsgcHRyUmVnKSkKCiNkZWZpbmUgd3JpdGUzMihwdHJSZWcsIHZhbHVlKSBcCiAgICAoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikoc201MDEuaXNhQmFzZSArIHB0clJlZykgPSB2YWx1ZSkKCkdyYXBoaWNEZXZpY2Ugc201MDE7Cgp2b2lkIHdyaXRlX2JlMzIoaW50IG9mZiwgdW5zaWduZWQgaW50IHZhbCkKewoJb3V0X2JlMzIoKHVuc2lnbmVkIF9faW9tZW0gKikoc201MDEuaXNhQmFzZSArIG9mZiksIHZhbCk7Cn0KCnZvaWQgd3JpdGVfbGUzMihpbnQgb2ZmLCB1bnNpZ25lZCBpbnQgdmFsKQp7CglvdXRfbGUzMigodW5zaWduZWQgX19pb21lbSAqKShzbTUwMS5pc2FCYXNlICsgb2ZmKSwgdmFsKTsKfQoKdm9pZCAoKndyaXRlX3JlZzMyKShpbnQgb2ZmLCB1bnNpZ25lZCBpbnQgdmFsKSA9IHdyaXRlX2JlMzI7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIFNtaVNldFJlZ3MgLS0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8Kc3RhdGljIHZvaWQgU21pU2V0UmVncyAodm9pZCkKewoJLyoKCSAqIFRoZSBjb250ZW50IG9mIHRoZSBjaGlwc2V0IHJlZ2lzdGVyIGRlcGVuZHMgb24gdGhlIGJvYXJkIChjbG9ja3MsCgkgKiAuLi4pCgkgKi8KCWNvbnN0IFNNSV9SRUdTICpwcmVnID0gYm9hcmRfZ2V0X3JlZ3MgKCk7Cgl3aGlsZSAocHJlZy0+SW5kZXgpIHsKCQl3cml0ZV9yZWczMiAocHJlZy0+SW5kZXgsIHByZWctPlZhbHVlKTsKCQkvKgoJCSAqIEluc2VydCBhIGRlbGF5IGJldHdlZW4KCQkgKi8KCQl1ZGVsYXkgKDEwMDApOwoJCXByZWcgKys7Cgl9Cn0KCiNpZmRlZiBDT05GSUdfVklERU9fU001MDFfUENJCnN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzbTUwMV9wY2lfdGJsW10gPSB7Cgl7IFBDSV9WRU5ET1JfSURfU01JLCBQQ0lfREVWSUNFX0lEX1NNSV81MDEgfSwKCXt9Cn07CiNlbmRpZgoKLyoKICogV2UgZG8gbm90IGVuZm9yY2UgYm9hcmQgY29kZSB0byBwcm92aWRlIGVtcHR5L3VudXNlZAogKiBmdW5jdGlvbnMgZm9yIHRoaXMgZHJpdmVyIGFuZCBkZWZpbmUgd2VhayBkZWZhdWx0CiAqIGZ1bmN0aW9ucyBoZXJlLgogKi8KdW5zaWduZWQgaW50IF9fYm9hcmRfdmlkZW9faW5pdCAodm9pZCkKewoJcmV0dXJuIDA7Cn0KCnVuc2lnbmVkIGludCBib2FyZF92aWRlb19pbml0ICh2b2lkKQoJCQlfX2F0dHJpYnV0ZV9fKCh3ZWFrLCBhbGlhcygiX19ib2FyZF92aWRlb19pbml0IikpKTsKCnVuc2lnbmVkIGludCBfX2JvYXJkX3ZpZGVvX2dldF9mYiAodm9pZCkKewoJcmV0dXJuIDA7Cn0KCnVuc2lnbmVkIGludCBib2FyZF92aWRlb19nZXRfZmIgKHZvaWQpCgkJCV9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJfX2JvYXJkX3ZpZGVvX2dldF9mYiIpKSk7Cgp2b2lkIF9fYm9hcmRfdmFsaWRhdGVfc2NyZWVuICh1bnNpZ25lZCBpbnQgYmFzZSkKewp9Cgp2b2lkIGJvYXJkX3ZhbGlkYXRlX3NjcmVlbiAodW5zaWduZWQgaW50IGJhc2UpCgkJCV9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJfX2JvYXJkX3ZhbGlkYXRlX3NjcmVlbiIpKSk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHZpZGVvX2h3X2luaXQgLS0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8Kdm9pZCAqdmlkZW9faHdfaW5pdCAodm9pZCkKewojaWZkZWYgQ09ORklHX1ZJREVPX1NNNTAxX1BDSQoJdW5zaWduZWQgaW50IHBjaV9tZW1fYmFzZSwgcGNpX21taW9fYmFzZTsKCXVuc2lnbmVkIGludCBpZDsKCXVuc2lnbmVkIHNob3J0IGRldmljZV9pZDsKCXBjaV9kZXZfdCBkZXZidXNmbjsKCWludCBtZW07CiNlbmRpZgoJdW5zaWduZWQgaW50ICp2bSwgaTsKCgltZW1zZXQgKCZzbTUwMSwgMCwgc2l6ZW9mIChHcmFwaGljRGV2aWNlKSk7CgojaWZkZWYgQ09ORklHX1ZJREVPX1NNNTAxX1BDSQoJcHJpbnRmKCJWaWRlbzogIik7CgoJLyogTG9vayBmb3IgU001MDEvU001MDIgY2hpcHMgKi8KCWRldmJ1c2ZuID0gcGNpX2ZpbmRfZGV2aWNlcyhzbTUwMV9wY2lfdGJsLCAwKTsKCWlmIChkZXZidXNmbiA8IDApIHsKCQlwcmludGYgKCJQQ0kgQ29udHJvbGxlciBub3QgZm91bmQuXG4iKTsKCQlnb3RvIG5vdF9wY2k7Cgl9CgoJLyogU2V0dXAgKi8KCXBjaV93cml0ZV9jb25maWdfZHdvcmQgKGRldmJ1c2ZuLCBQQ0lfQ09NTUFORCwKCQkJCShQQ0lfQ09NTUFORF9NRU1PUlkgfCBQQ0lfQ09NTUFORF9JTykpOwoJcGNpX3JlYWRfY29uZmlnX3dvcmQgKGRldmJ1c2ZuLCBQQ0lfREVWSUNFX0lELCAmZGV2aWNlX2lkKTsKCXBjaV9yZWFkX2NvbmZpZ19kd29yZCAoZGV2YnVzZm4sIFBDSV9SRVZJU0lPTl9JRCwgJmlkKTsKCXBjaV9yZWFkX2NvbmZpZ19kd29yZCAoZGV2YnVzZm4sIFBDSV9CQVNFX0FERFJFU1NfMCwgJnBjaV9tZW1fYmFzZSk7CglwY2lfcmVhZF9jb25maWdfZHdvcmQgKGRldmJ1c2ZuLCBQQ0lfQkFTRV9BRERSRVNTXzEsICZwY2lfbW1pb19iYXNlKTsKCXNtNTAxLmZyYW1lQWRycyA9IHBjaV9tZW1fdG9fcGh5cyAoZGV2YnVzZm4sIHBjaV9tZW1fYmFzZSk7CglzbTUwMS5pc2FCYXNlID0gcGNpX21lbV90b19waHlzIChkZXZidXNmbiwgcGNpX21taW9fYmFzZSk7CgoJaWYgKHNtNTAxLmlzYUJhc2UpCgkJd3JpdGVfcmVnMzIgPSB3cml0ZV9sZTMyOwoKCW1lbSA9IGluX2xlMzIgKCh1bnNpZ25lZCBfX2lvbWVtICopKHNtNTAxLmlzYUJhc2UgKyAweDEwKSk7CgltZW0gPSAobWVtICYgMHgwMDAwZTAwMCkgPj4gMTM7Cglzd2l0Y2ggKG1lbSkgewoJY2FzZSAxOgoJCW1lbSA9IDg7CgkJYnJlYWs7CgljYXNlIDI6CgkJbWVtID0gMTY7CgkJYnJlYWs7CgljYXNlIDM6CgkJbWVtID0gMzI7CgkJYnJlYWs7CgljYXNlIDQ6CgkJbWVtID0gNjQ7CgkJYnJlYWs7CgljYXNlIDU6CgkJbWVtID0gMjsKCQlicmVhazsKCWNhc2UgMDoKCWRlZmF1bHQ6CgkJbWVtID0gNDsKCX0KCXByaW50ZiAoIlBDSSBTTTUwJWQgJWQgTUJcbiIsICgoaWQgJiAweGZmKSA9PSAweEMwKSA/IDIgOiAxLCBtZW0pOwpub3RfcGNpOgojZW5kaWYKCS8qCgkgKiBJbml0aWFsaXphdGlvbiBvZiB0aGUgYWNjZXNzIHRvIHRoZSBncmFwaGljIGNoaXBzZXQgUmV0cmVpdmUgYmFzZQoJICogYWRkcmVzcyBvZiB0aGUgY2hpcHNldCAoc2VlIGJvYXJkL1JQWENsYXNzaWMvZWNjeC5jKQoJICovCglpZiAoIXNtNTAxLmlzYUJhc2UpIHsKCQlzbTUwMS5pc2FCYXNlID0gYm9hcmRfdmlkZW9faW5pdCAoKTsKCQlpZiAoIXNtNTAxLmlzYUJhc2UpCgkJCXJldHVybiBOVUxMOwoJfQoKCWlmICghc201MDEuZnJhbWVBZHJzKSB7CgkJc201MDEuZnJhbWVBZHJzID0gYm9hcmRfdmlkZW9fZ2V0X2ZiICgpOwoJCWlmICghc201MDEuZnJhbWVBZHJzKQoJCQlyZXR1cm4gTlVMTDsKCX0KCglzbTUwMS53aW5TaXplWCA9IGJvYXJkX2dldF93aWR0aCAoKTsKCXNtNTAxLndpblNpemVZID0gYm9hcmRfZ2V0X2hlaWdodCAoKTsKCiNpZiBkZWZpbmVkKENPTkZJR19WSURFT19TTTUwMV84QlBQKQoJc201MDEuZ2RmSW5kZXggPSBHREZfXzhCSVRfSU5ERVg7CglzbTUwMS5nZGZCeXRlc1BQID0gMTsKCiNlbGlmIGRlZmluZWQoQ09ORklHX1ZJREVPX1NNNTAxXzE2QlBQKQoJc201MDEuZ2RmSW5kZXggPSBHREZfMTZCSVRfNTY1UkdCOwoJc201MDEuZ2RmQnl0ZXNQUCA9IDI7CgojZWxpZiBkZWZpbmVkKENPTkZJR19WSURFT19TTTUwMV8zMkJQUCkKCXNtNTAxLmdkZkluZGV4ID0gR0RGXzMyQklUX1g4ODhSR0I7CglzbTUwMS5nZGZCeXRlc1BQID0gNDsKI2Vsc2UKI2Vycm9yIFVuc3VwcG9ydGVkIFNNNTAxIEJQUAojZW5kaWYKCglzbTUwMS5tZW1TaXplID0gc201MDEud2luU2l6ZVggKiBzbTUwMS53aW5TaXplWSAqIHNtNTAxLmdkZkJ5dGVzUFA7CgoJLyogTG9hZCBTbWkgcmVnaXN0ZXJzICovCglTbWlTZXRSZWdzICgpOwoKCS8qIChzZWUgYm9hcmQvUlBYQ2xhc3NpYy9SUFhDbGFzc2ljLmMpICovCglib2FyZF92YWxpZGF0ZV9zY3JlZW4gKHNtNTAxLmlzYUJhc2UpOwoKCS8qIENsZWFyIHZpZGVvIG1lbW9yeSAqLwoJaSA9IHNtNTAxLm1lbVNpemUvNDsKCXZtID0gKHVuc2lnbmVkIGludCAqKXNtNTAxLmZyYW1lQWRyczsKCXdoaWxlKGktLSkKCQkqdm0rKyA9IDA7CgoJcmV0dXJuICgmc201MDEpOwp9Cg==