LyoKICoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKI2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8cGNpLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS9wY2kuaD4KI2luY2x1ZGUgPGFzbS9pYy9zYzUyMC5oPgojaW5jbHVkZSA8YXNtL2ljL2FsaTUxMnguaD4KI2luY2x1ZGUgPHNwaS5oPgojaW5jbHVkZSA8bmV0ZGV2Lmg+CgpERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKCiN1bmRlZiBTQzUyMF9DRFBfREVCVUcKCiNpZmRlZglTQzUyMF9DRFBfREVCVUcKI2RlZmluZQlQUklOVEYoZm10LGFyZ3MuLi4pCXByaW50ZiAoZm10ICwjI2FyZ3MpCiNlbHNlCiNkZWZpbmUgUFJJTlRGKGZtdCxhcmdzLi4uKQojZW5kaWYKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgovKgogKiBUaGVvcnk6CiAqIFdlIGZpcnN0IHNldCB1cCBhbGwgSVJRcyB0byBiZSBub24tcGNpLCBlZGdlIHRyaWdnZXJlZCwKICogd2hlbiB3ZSBsYXRlciBlbnVtZXJhdGUgdGhlIHBjaSBidXMgYW5kIHBjaV9zYzUyMF9maXh1cF9pcnEoKSBnZXRzCiAqIGNhbGxlZCB3ZSByZWFsbG9jYXRlIGlycXMgdG8gdGhlIHBjaSBidXMgd2l0aCBzYzUyMF9wY2lfc2V0X2lycSgpCiAqIGFzIG5lZWRlZC4gV2hlIGNob29zZSB0aGUgaXJxcyB0byBncmFtIGZyb20gYSBjb25maWd1cmFibGUgbGlzdAogKiBpbnNpZGUgcGNpX3NjNTIwX2ZpeHVwX2lycSgpIChJZiB0aGlzIGxpc3QgY29udGFpbnMgc3R1cGlkIGlycSdzCiAqIHN1Y2ggYXMgMCB0aG5nYXMgd2lsbCBub3Qgd29yaykKICovCgpzdGF0aWMgdm9pZCBpcnFfaW5pdCh2b2lkKQp7CgkvKiBkaXNhYmxlIGdsb2JhbCBpbnRlcnJ1cHQgbW9kZSAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BJQ0lDUiwgMHg0MCk7CgoJLyogc2V0IGFsbCBpcnFzIHRvIGVkZ2UgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9NUElDTU9ERSwgMHgwMCk7Cgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU0wxUElDTU9ERSwgMHgwMCk7Cgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU0wyUElDTU9ERSwgMHgwMCk7CgoJLyogYWN0aXZlIGxvdyBwb2xhcml0eSBvbiBQSUMgaW50ZXJydXB0IHBpbnMsCgkgKiAgYWN0aXZlIGhpZ2ggcG9sYXJpdHkgb24gYWxsIG90aGVyIGlycSBwaW5zICovCgl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfSU5UUElOUE9MLCAweDAwMDApOwoKCS8qIHNldCBpcnEgbnVtYmVyIG1hcHBpbmcgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUFRNUjBNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAgLyogZGlzYWJsZSBHUCB0aW1lciAwIElOVCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQVE1SMU1BUCwgU0M1MjBfSVJRX0RJU0FCTEVEKTsgICAvKiBkaXNhYmxlIEdQIHRpbWVyIDEgSU5UICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1BUTVIyTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgIC8qIGRpc2FibGUgR1AgdGltZXIgMiBJTlQgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9QSVQwTUFQLCBTQzUyMF9JUlEwKTsgICAgICAgICAgICAgLyogU2V0IFBJVCB0aW1lciAwIElOVCB0byBJUlEwICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfUElUMU1BUCwgU0M1MjBfSVJRX0RJU0FCTEVEKTsgICAgIC8qIGRpc2FibGUgUElUIHRpbWVyIDEgSU5UICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfUElUMk1BUCwgU0M1MjBfSVJRX0RJU0FCTEVEKTsgICAgIC8qIGRpc2FibGUgUElUIHRpbWVyIDIgSU5UICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfUENJSU5UQU1BUCwgU0M1MjBfSVJRX0RJU0FCTEVEKTsgIC8qIGRpc2FibGUgUENJIElOVCBBICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfUENJSU5UQk1BUCwgU0M1MjBfSVJRX0RJU0FCTEVEKTsgIC8qIGRpc2FibGUgUENJIElOVCBCICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfUENJSU5UQ01BUCwgU0M1MjBfSVJRX0RJU0FCTEVEKTsgIC8qIGRpc2FibGUgUENJIElOVCBDICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfUENJSU5URE1BUCwgU0M1MjBfSVJRX0RJU0FCTEVEKTsgIC8qIGRpc2FibGUgUENJIElOVCBEICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfRE1BQkNJTlRNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7IC8qIGRpc2FibGUgRE1BIElOVCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1NTSU1BUCwgU0M1MjBfSVJRX0RJU0FCTEVEKTsgICAgICAvKiBkaXNhYmxlIFN5bmNocm9uaXVzIHNlcmlhbCBJTlQgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9XRFRNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAgICAgLyogZGlzYWJsZSBXYXRjaGRvZyBJTlQgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9SVENNQVAsIFNDNTIwX0lSUTgpOyAgICAgICAgICAgICAgLyogU2V0IFJUQyBpbnQgdG8gOCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1dQVk1BUCwgU0M1MjBfSVJRX0RJU0FCTEVEKTsgICAgICAvKiBkaXNhYmxlIHdyaXRlIHByb3RlY3QgSU5UICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfSUNFTUFQLCBTQzUyMF9JUlExKTsgICAgICAgICAgICAgIC8qIFNldCBJQ0UgRGVidWcgU2VyaWVscG9ydCBJTlQgdG8gSVJRMSAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0ZFUlJNQVAsU0M1MjBfSVJRMTMpOyAgICAgICAgICAgICAvKiBTZXQgRlAgZXJyb3IgSU5UIHRvIElSUTEzICovCgoJaWYgKENPTkZJR19TWVNfVVNFX1NJT19VQVJUKSB7CgkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1VBUlQxTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAvKiBkaXNhYmxlIGludGVybmFsIFVBUlQxIElOVCAqLwoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9VQVJUMk1BUCwgU0M1MjBfSVJRX0RJU0FCTEVEKTsgLyogZGlzYWJsZSBpbnRlcm5hbCBVQVJUMiBJTlQgKi8KCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1AzSU1BUCwgU0M1MjBfSVJRMyk7ICAgICAgICAgIC8qIFNldCBHUElSUTMgKElTQSBJUlEzKSB0byBJUlEzICovCgkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQNElNQVAsIFNDNTIwX0lSUTQpOyAgICAgICAgICAvKiBTZXQgR1BJUlE0IChJU0EgSVJRNCkgdG8gSVJRNCAqLwoJfSBlbHNlIHsKCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfVUFSVDFNQVAsIFNDNTIwX0lSUTQpOyAgICAgICAgIC8qIFNldCBpbnRlcm5hbCBVQVJUMiBJTlQgdG8gSVJRNCAqLwoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9VQVJUMk1BUCwgU0M1MjBfSVJRMyk7ICAgICAgICAgLyogU2V0IGludGVybmFsIFVBUlQyIElOVCB0byBJUlEzICovCgkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQM0lNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAvKiBkaXNhYmxlIEdQSVJRMyAoSVNBIElSUTMpICovCgkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQNElNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAvKiBkaXNhYmxlIEdQSVJRNCAoSVNBIElSUTQpICovCgl9CgoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQMUlNQVAsIFNDNTIwX0lSUTEpOyAgICAgICAgICAgICAvKiBTZXQgR1BJUlExIChTSU8gSVJRMSkgdG8gSVJRMSAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQNUlNQVAsIFNDNTIwX0lSUTUpOyAgICAgICAgICAgICAvKiBTZXQgR1BJUlE1IChJU0EgSVJRNSkgdG8gSVJRNSAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQNklNQVAsIFNDNTIwX0lSUTYpOyAgICAgICAgICAgICAvKiBTZXQgR1BJUlE2IChJU0EgSVJRNikgdG8gSVJRNiAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQN0lNQVAsIFNDNTIwX0lSUTcpOyAgICAgICAgICAgICAvKiBTZXQgR1BJUlE3IChJU0EgSVJRNykgdG8gSVJRNyAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQOElNQVAsIFNDNTIwX0lSUTgpOyAgICAgICAgICAgICAvKiBTZXQgR1BJUlE4IChTSU8gSVJROCkgdG8gSVJROCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQOUlNQVAsIFNDNTIwX0lSUTkpOyAgICAgICAgICAgICAvKiBTZXQgR1BJUlE5IChJU0EgSVJRMikgdG8gSVJROSAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQMElNQVAsIFNDNTIwX0lSUTExKTsgICAgICAgICAgICAvKiBTZXQgR1BJUlEwIChJU0EgSVJRMTEpIHRvIElSUTEwICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1AySU1BUCwgU0M1MjBfSVJRMTIpOyAgICAgICAgICAgIC8qIFNldCBHUElSUTIgKElTQSBJUlExMikgdG8gSVJRMTIgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDEwSU1BUCxTQzUyMF9JUlExNCk7ICAgICAgICAgICAgLyogU2V0IEdQSVJRMTAgKElTQSBJUlExNCkgdG8gSVJRMTQgKi8KCgl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfUENJSE9TVE1BUCwgMHgxMWYpOyAgICAgICAgICAgICAgICAvKiBNYXAgUENJIGhvc3RicmlkZ2UgSU5UIHRvIE5NSSAqLwoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0VDQ01BUCwgMHgxMDApOyAgICAgICAgICAgICAgICAgICAgLyogTWFwIFNEUkFNIEVDQyBmYWlsdXJlIElOVCB0byBOTUkgKi8KCn0KCiNpZmRlZiBDT05GSUdfUENJCi8qIFBDSSBzdHVmZiAqLwpzdGF0aWMgdm9pZCBwY2lfc2M1MjBfY2RwX2ZpeHVwX2lycShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIHBjaV9kZXZfdCBkZXYpCnsKCS8qIGEgY29uZmlndXJhYmxlIGxpc3RzIG9mIGlycXMgdG8gc3RlYWwKCSAqIHdoZW4gd2UgbmVlZCBvbmUgKGEgYm9hcmQgd2l0aCBtb3JlIHBjaSBpbnRlcnJ1cHQgcGlucwoJICogd291bGQgdXNlIGEgbGFyZ2VyIHRhYmxlICovCglzdGF0aWMgaW50IGlycV9saXN0W10gPSB7CgkJQ09ORklHX1NZU19GSVJTVF9QQ0lfSVJRLAoJCUNPTkZJR19TWVNfU0VDT05EX1BDSV9JUlEsCgkJQ09ORklHX1NZU19USElSRF9QQ0lfSVJRLAoJCUNPTkZJR19TWVNfRk9SVEhfUENJX0lSUQoJfTsKCXN0YXRpYyBpbnQgbmV4dF9pcnFfaW5kZXg9MDsKCgl1Y2hhciB0bXBfcGluOwoJaW50IHBpbjsKCglwY2lfaG9zZV9yZWFkX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgUENJX0lOVEVSUlVQVF9QSU4sICZ0bXBfcGluKTsKCXBpbiA9IHRtcF9waW47CgoJcGluLT0xOyAvKiBwY2kgY29uZmlnIHNwYWNlIHVzZSAxLWJhc2VkIG51bWJlcmluZyAqLwoJaWYgKC0xID09IHBpbikgewoJCXJldHVybjsgLyogZGV2aWNlIHVzZSBubyBpcnEgKi8KCX0KCgoJLyogbWFwIGRldmljZSBudW1iZXIgKyAgcGluIHRvIGEgcGluIG9uIHRoZSBzYzUyMCAqLwoJc3dpdGNoIChQQ0lfREVWKGRldikpIHsKCWNhc2UgMjA6CgkJcGluKz1TQzUyMF9QQ0lfSU5UQTsKCQlicmVhazsKCgljYXNlIDE5OgoJCXBpbis9U0M1MjBfUENJX0lOVEI7CgkJYnJlYWs7CgoJY2FzZSAxODoKCQlwaW4rPVNDNTIwX1BDSV9JTlRDOwoJCWJyZWFrOwoKCWNhc2UgMTc6CgkJcGluKz1TQzUyMF9QQ0lfSU5URDsKCQlicmVhazsKCglkZWZhdWx0OgoJCXJldHVybjsKCX0KCglwaW4mPTM7IC8qIHdyYXAgYXJvdW5kICovCgoJaWYgKHNjNTIwX3BjaV9pbnRzW3Bpbl0gPT0gLTEpIHsKCQkvKiByZS1yb3V0ZSBvbmUgaW50ZXJydXB0IGZvciB1cyAqLwoJCWlmIChuZXh0X2lycV9pbmRleCA+IDMpIHsKCQkJcmV0dXJuOwoJCX0KCQlpZiAocGNpX3NjNTIwX3NldF9pcnEocGluLCBpcnFfbGlzdFtuZXh0X2lycV9pbmRleF0pKSB7CgkJCXJldHVybjsKCQl9CgkJbmV4dF9pcnFfaW5kZXgrKzsKCX0KCgoJaWYgKC0xICE9IHNjNTIwX3BjaV9pbnRzW3Bpbl0pIHsKCQlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwKCQkJCQkgICBzYzUyMF9wY2lfaW50c1twaW5dKTsKCX0KCVBSSU5URigiZml4dXBfaXJxOiBkZXZpY2UgJWQgcGluICVjIGlycSAlZFxuIiwKCSAgICAgICBQQ0lfREVWKGRldiksICdBJyArIHBpbiwgc2M1MjBfcGNpX2ludHNbcGluXSk7Cn0KCnN0YXRpYyBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgc2M1MjBfY2RwX2hvc2UgPSB7CglmaXh1cF9pcnE6IHBjaV9zYzUyMF9jZHBfZml4dXBfaXJxLAp9OwoKdm9pZCBwY2lfaW5pdF9ib2FyZCh2b2lkKQp7CglwY2lfc2M1MjBfaW5pdCgmc2M1MjBfY2RwX2hvc2UpOwp9CiNlbmRpZgoKc3RhdGljIHZvaWQgc2lsZW5jZV91YXJ0KGludCBwb3J0KQp7CglvdXRiKDAsIHBvcnQrMSk7Cn0KCnZvaWQgc2V0dXBfYWxpX3NpbyhpbnQgdWFydF9wcmltYXJ5KQp7CglhbGk1MTJ4X2luaXQoKTsKCglhbGk1MTJ4X3NldF9mZGMoQUxJX0VOQUJMRUQsIDB4M2YyLCA2LCAwKTsKCWFsaTUxMnhfc2V0X3BwKEFMSV9FTkFCTEVELCAweDI3OCwgNywgMyk7CglhbGk1MTJ4X3NldF91YXJ0KEFMSV9FTkFCTEVELCBBTElfVUFSVDEsIHVhcnRfcHJpbWFyeT8weDNmODoweDNlOCwgNCk7CglhbGk1MTJ4X3NldF91YXJ0KEFMSV9FTkFCTEVELCBBTElfVUFSVDIsIHVhcnRfcHJpbWFyeT8weDJmODoweDJlOCwgMyk7CglhbGk1MTJ4X3NldF9ydGMoQUxJX0RJU0FCTEVELCAwLCAwKTsKCWFsaTUxMnhfc2V0X2tiYyhBTElfRU5BQkxFRCwgMSwgMTIpOwoJYWxpNTEyeF9zZXRfY2lvKEFMSV9FTkFCTEVEKTsKCgkvKiBJckRhIHBpbnMgKi8KCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDEyLCAxLCAwLCAwKTsKCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDEzLCAxLCAwLCAwKTsKCgkvKiBTU0kgY2hpcCBzZWxlY3QgcGlucyAqLwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMTQsIDAsIDAsIDApOyAgLyogU1NJX0NTICovCglhbGk1MTJ4X2Npb19mdW5jdGlvbigxNSwgMCwgMCwgMCk7ICAvKiBTU0lfTVYgKi8KCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDE2LCAwLCAwLCAwKTsgIC8qIFNTSV9TUEkjICovCgoJLyogQm9hcmQgUkVWIHBpbnMgKi8KCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDIwLCAwLCAwLCAxKTsKCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDIxLCAwLCAwLCAxKTsKCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDIyLCAwLCAwLCAxKTsKCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDIzLCAwLCAwLCAxKTsKfQoKCi8qIHNldCB1cCB0aGUgSVNBIGJ1cyB0aW1pbmcgYW5kIHN5c3RlbSBhZGRyZXNzIG1hcHBpbmdzICovCnN0YXRpYyB2b2lkIGJ1c19pbml0KHZvaWQpCnsKCgkvKiBzZXQgdXAgdGhlIEdQIElPIHBpbnMgKi8KCXdyaXRlX21tY3Jfd29yZChTQzUyMF9QSU9QRlMzMV8xNiwgMHhmN2ZmKTsJLyogc2V0IHRoZSBHUElPIHBpbiBmdW5jdGlvbiAzMS0xNiByZWcgKi8KCXdyaXRlX21tY3Jfd29yZChTQzUyMF9QSU9QRlMxNV8wLCAweGZmZmYpOwkvKiBzZXQgdGhlIEdQSU8gcGluIGZ1bmN0aW9uIDE1LTAgcmVnICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfQ1NQRlMsIDB4ZjgpOwkJLyogc2V0IHRoZSBDUyBwaW4gZnVuY3Rpb24gIHJlZyAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0NMS1NFTCwgMHg3MCk7CgoKCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUENTUlQsIDEpOyAgIC8qIHNldCB0aGUgR1AgQ1Mgb2Zmc2V0ICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1BDU1BXLCAzKTsgICAvKiBzZXQgdGhlIEdQIENTIHB1bHNlIHdpZHRoICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1BDU09GRiwgMSk7ICAvKiBzZXQgdGhlIEdQIENTIG9mZnNldCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQUkRXLCAzKTsgICAgLyogc2V0IHRoZSBSRCBwdWxzZSB3aWR0aCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQUkRPRkYsIDEpOyAgLyogc2V0IHRoZSBHUCBSRCBvZmZzZXQgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUFdSVywgMyk7ICAgIC8qIHNldCB0aGUgR1AgV1IgcHVsc2Ugd2lkdGggKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUFdST0ZGLCAxKTsgIC8qIHNldCB0aGUgR1AgV1Igb2Zmc2V0ICovCgoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0JPT1RDU0NUTCwgMHgxODIzKTsJCS8qIHNldCB1cCB0aW1pbmcgb2YgQk9PVENTICovCgl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfUk9NQ1MxQ1RMLCAweDE4MjMpOwkJLyogc2V0IHVwIHRpbWluZyBvZiBST01DUzEgKi8KCXdyaXRlX21tY3Jfd29yZChTQzUyMF9ST01DUzJDVEwsIDB4MTgyMyk7CQkvKiBzZXQgdXAgdGltaW5nIG9mIFJPTUNTMiAqLwoKCS8qIGFkanVzdCB0aGUgbWVtb3J5IG1hcDoKCSAqIGJ5IGRlZmF1bHQgdGhlIGZpcnN0IDI1Nk1CICgweDAwMDAwMDAwIC0gMHgwZmZmZmZmZikgaXMgbWFwcGVkIHRvIFNEUkFNCgkgKiBhbmQgMjU2TUIgdG8gMUctMTI4ayAgKDB4MTAwMDAwMCAtIDB4MzdmZmZmZmYpIGlzIG1hcHBlZCB0byBQQ0kgbW1pbwoJICogd2UgbmVlZCB0byBtYXAgMUctMTI4ayAtIDFHICgweDM4MDAwMDAwIC0gMHgzZmZmZmZmZikgdG8gQ1MxICovCgoKCS8qIFNSQU0gPSBHUENTMyAxMjhrIEAgZDAwMDAtZWZmZmYqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjIsICAweDRlMDA0MDBkKTsKCgkvKiBJREUwID0gR1BDUzYgMWYwLTFmNyAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjMsICAweDM4MDgwMWYwKTsKCgkvKiBJREUxID0gR1BDUzcgM2Y2ICovCgl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSNCwgIDB4M2MwMDAzZjYpOwoJLyogYm9vdGNzICovCgl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSMTIsIDB4OGJmZmU4MDApOwoJLyogcm9tY3MyICovCgl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSMTMsIDB4Y2JmZmYwMDApOwoJLyogcm9tY3MxICovCgl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSMTQsIDB4YWJmZmY4MDApOwoJLyogNjgwIExFRFMgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVIxNSwgMHgzMDAwMDY0MCk7CgoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0FERERFQ0NUTCwgMCk7CgoJYXNtICgid2JpbnZkXG4iKTsgLyogRmx1c2ggY2FjaGUsIHJlcS4gYWZ0ZXIgc2V0dGluZyB0aGUgdW5jaGFjaGVkIGF0dHJpYnV0ZSBvbmEgUEFSICovCgoJaWYgKENPTkZJR19TWVNfVVNFX1NJT19VQVJUKSB7CgkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0FERERFQ0NUTCwgcmVhZF9tbWNyX2J5dGUoU0M1MjBfQUREREVDQ1RMKSB8IFVBUlQyX0RJU3xVQVJUMV9ESVMpOwoJCXNldHVwX2FsaV9zaW8oMSk7Cgl9IGVsc2UgewoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9BRERERUNDVEwsIHJlYWRfbW1jcl9ieXRlKFNDNTIwX0FERERFQ0NUTCkgJiB+KFVBUlQyX0RJU3xVQVJUMV9ESVMpKTsKCQlzZXR1cF9hbGlfc2lvKDApOwoJCXNpbGVuY2VfdWFydCgweDNlOCk7CgkJc2lsZW5jZV91YXJ0KDB4MmU4KTsKCX0KCn0KCi8qIEdQQ1MgdXNhZ2UKICogR1BDUzAgICAgICAgUElPMjcgKE5NSSkKICogR1BDUzEgICAgICAgUk9NQ1MxCiAqIEdQQ1MyICAgICAgIFJPTUNTMgogKiBHUENTMyAgICAgICBTUkFNQ1MgICAgICAgUEFSMgogKiBHUENTNCAgICAgICB1bnVzZWQgICAgICAgUEFSMwogKiBHUENTNSAgICAgICB1bnVzZWQgICAgICAgUEFSNAogKiBHUENTNiAgICAgICBJREUKICogR1BDUzcgICAgICAgSURFCiAqLwoKCi8qIHBhciB1c2FnZToKICogUEFSMCAgIGxlZ2FjeV92aWRlbwogKiBQQVIxICAgUENJIFJPTSBtYXBwaW5nCiAqIFBBUjIgICBTUkFNCiAqIFBBUjMgICBJREUKICogUEFSNCAgIElERQogKiBQQVI1ICAgbGVnYWN5X3ZpZGVvCiAqIFBBUjYgICBsZWdhY3lfdmlkZW8KICogUEFSNyAgIGxlZ2FjeV92aWRlbwogKiBQQVI4ICAgbGVnYWN5X3ZpZGVvCiAqIFBBUjkgICBsZWdhY3lfdmlkZW8KICogUEFSMTAgIGxlZ2FjeV92aWRlbwogKiBQQVIxMSAgSVNBUk9NCiAqIFBBUjEyICBCT09UQ1MKICogUEFSMTMgIFJPTUNTMQogKiBQQVIxNCAgUk9NQ1MyCiAqIFBBUjE1ICBQb3J0IDB4NjgwIExFRCBkaXNwbGF5CiAqLwoKLyoKICogVGhpcyBmdW5jdGlvbiBzaG91bGQgbWFwIGEgY2h1bmsgb2Ygc2l6ZSBieXRlcwogKiBvZiB0aGUgc3lzdGVtIGFkZHJlc3Mgc3BhY2UgdG8gdGhlIElTQSBidXMKICoKICogVGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBtZW1vcnkgYWRkcmVzcwogKiBhcyBzZWVuIGJ5IHRoZSBob3N0ICh3aGljaCBtYXkgdmVyeSB3aWxsIGJlIHRoZQogKiBzYW1lIGFzIHRoZSBidXMgYWRkcmVzcykKICovCnUzMiBpc2FfbWFwX3JvbSh1MzIgYnVzX2FkZHIsIGludCBzaXplKQp7Cgl1MzIgcGFyOwoKCVBSSU5URigiaXNhX21hcF9yb20gYXNrZWQgdG8gbWFwICVkIGJ5dGVzIGF0ICV4XG4iLAoJICAgICAgIHNpemUsIGJ1c19hZGRyKTsKCglwYXIgPSBzaXplOwoJaWYgKHBhciA8IDB4ODAwMDApIHsKCQlwYXIgPSAweDgwMDAwOwoJfQoJcGFyID4+PSAxMjsKCXBhci0tOwoJcGFyJj0weDdmOwoJcGFyIDw8PSAxODsKCXBhciB8PSAoYnVzX2FkZHI+PjEyKTsKCXBhciB8PSAweDUwMDAwMDAwOwoKCVBSSU5URiAoInNldHRpbmcgUEFSMTEgdG8gJXhcbiIsIHBhcik7CgoJLyogTWFwIHJvbSAweDEwMDAwIHdpdGggUEFSMSAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjExLCAgcGFyKTsKCglyZXR1cm4gYnVzX2FkZHI7Cn0KCi8qCiAqIHRoaXMgZnVuY3Rpb24gcmVtb3ZlZCBhbnkgbWFwcGluZyBjcmVhdGVkCiAqIHdpdGggcGNpX2dldF9yb21fd2luZG93KCkKICovCnZvaWQgaXNhX3VubWFwX3JvbSh1MzIgYWRkcikKewoJUFJJTlRGKCJpc2FfdW5tYXBfcm9tIGFza2VkIHRvIHVubWFwICV4IiwgYWRkcik7CglpZiAoKGFkZHI+PjEyKSA9PSAocmVhZF9tbWNyX2xvbmcoU0M1MjBfUEFSMTEpJjB4M2ZmZmYpKSB7CgkJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjExLCAwKTsKCQlQUklOVEYoIiBkb25lXG4iKTsKCQlyZXR1cm47Cgl9CglQUklOVEYoIiBub3Qgb3Vyc1xuIik7Cn0KCiNpZmRlZiBDT05GSUdfUENJCiNkZWZpbmUgUENJX1JPTV9URU1QX1NQQUNFIDB4MTAwMDAKLyoKICogVGhpcyBmdW5jdGlvbiBzaG91bGQgbWFwIGEgY2h1bmsgb2Ygc2l6ZSBieXRlcwogKiBvZiB0aGUgc3lzdGVtIGFkZHJlc3Mgc3BhY2UgdG8gdGhlIFBDSSBidXMsCiAqIHN1aXRhYmxlIHRvIG1hcCBQQ0kgUk9NUyAoYnVzIGFkZHJlc3MgPCAxNk0pCiAqIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgaG9zdCBtZW1vcnkgYWRkcmVzcwogKiB3aGljaCBzaG91bGQgYmUgY29udmVydGVkIGludG8gYSBidXMgYWRkcmVzcwogKiBiZWZvcmUgdXNlZCB0byBjb25maWd1cmUgdGhlIFBDSSByb20gYWRkcmVzcwogKiBkZWNvZGVyCiAqLwp1MzIgcGNpX2dldF9yb21fd2luZG93KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgaW50IHNpemUpCnsKCXUzMiBwYXI7CgoJcGFyID0gc2l6ZTsKCWlmIChwYXIgPCAweDgwMDAwKSB7CgkJcGFyID0gMHg4MDAwMDsKCX0KCXBhciA+Pj0gMTY7CglwYXItLTsKCXBhciY9MHg3ZmY7CglwYXIgPDw9IDE0OwoJcGFyIHw9IChQQ0lfUk9NX1RFTVBfU1BBQ0U+PjE2KTsKCXBhciB8PSAweDcyMDAwMDAwOwoKCVBSSU5URiAoInNldHRpbmcgUEFSMSB0byAleFxuIiwgcGFyKTsKCgkvKiBNYXAgcm9tIDB4MTAwMDAgd2l0aCBQQVIxICovCgl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSMSwgIHBhcik7CgoJcmV0dXJuIFBDSV9ST01fVEVNUF9TUEFDRTsKfQoKLyoKICogdGhpcyBmdW5jdGlvbiByZW1vdmVkIGFueSBtYXBwaW5nIGNyZWF0ZWQKICogd2l0aCBwY2lfZ2V0X3JvbV93aW5kb3coKQogKi8Kdm9pZCBwY2lfcmVtb3ZlX3JvbV93aW5kb3coc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCB1MzIgYWRkcikKewoJUFJJTlRGKCJwY2lfcmVtb3ZlX3JvbV93aW5kb3c6ICV4IiwgYWRkcik7CglpZiAoYWRkciA9PSBQQ0lfUk9NX1RFTVBfU1BBQ0UpIHsKCQl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSMSwgMCk7CgkJUFJJTlRGKCIgZG9uZVxuIik7CgkJcmV0dXJuOwoJfQoJUFJJTlRGKCIgbm90IG91cnNcbiIpOwoKfQoKLyoKICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gb3JkZXIgdG8gcHJvdmlkZSBhY2NlcyB0byB0aGUKICogbGVnYWN5IHZpZGVvIEkvTyBwb3J0cyBvbiB0aGUgUENJIGJ1cy4KICogQWZ0ZXIgdGhpcyBmdW5jdGlvbiBhY2Nlc3NlcyB0byBJL08gcG9ydHMgMHgzYjAtMHgzYmIgYW5kCiAqIDB4M2MwLTB4M2RmIHNodWxkIHJlc3VsdCBpbiB0cmFuc2FjdGlvbnMgb24gdGhlIFBDSSBidXMuCiAqCiAqLwppbnQgcGNpX2VuYWJsZV9sZWdhY3lfdmlkZW9fcG9ydHMoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQp7CgkvKiBNYXAgdmlkZW8gbWVtb3J5IHRvIDB4YTAwMDAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjAsICAweDcyMDA0MDBhKTsKCgkvKiBmb3J3YXJkIGFsbCBJL08gYWNjZXNzZXMgdG8gUENJICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfQUREREVDQ1RMLAoJCQlyZWFkX21tY3JfYnl0ZShTQzUyMF9BRERERUNDVEwpIHwgSU9fSE9MRV9ERVNUX1BDSSk7CgoKCS8qIHNvIHdlIG1hcCBhd2F5IGFsbCBpbyBwb3J0cyB0byBwY2kgKG9ubHkgd2F5IHRvIGFjY2VzcyBwY2kgaW8KCSAqIGJlbG93IDB4NDAwLiBCdXQgdGhlbiB3ZSBoYXZlIHRvIG1hcCBiYWNrIHRoZSBwb3J0aW9ucyB0aGF0IHdlIGRvbnQKCSAqIHVzZSBzbyB0aGF0IHRoZSBnZW5lcmF0ZSBjeWNsZXMgb24gdGhlIEdQSU8gYnVzIHdoZXJlIHRoZSBzaW8gYW5kCgkgKiBJU0Egc2xvdHMgYXJlIGNvbm5lY3RlZCwgdGhpcyByZXF1cmUgdGhlIHVzZSBvZiBzZXZlcmFsIFBBUiByZWdpc3RlcnMKCSAqLwoKCS8qIGJyaW5nIDB4MTAwIC0gMHgxZWYgYmFjayB0byBJU0EgdXNpbmcgUEFSNSAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjUsIDB4MzBlZjAxMDApOwoKCS8qIElERSB1c2UgMWYwLTFmNyAqLwoKCS8qIGJyaW5nIDB4MWY4IC0gMHgyZjcgYmFjayB0byBJU0EgdXNpbmcgUEFSNiAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjYsIDB4MzBmZjAxZjgpOwoKCS8qIGNvbTIgdXNlIDJmOC0yZmYgKi8KCgkvKiBicmluZyAweDMwMCAtIDB4M2FmIGJhY2sgdG8gSVNBIHVzaW5nIFBBUjcgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVI3LCAweDMwYWYwMzAwKTsKCgkvKiB2Z2EgdXNlIDNiMC0zYmIgKi8KCgkvKiBicmluZyAweDNiYyAtIDB4M2JmIGJhY2sgdG8gSVNBIHVzaW5nIFBBUjggKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVI4LCAweDMwMDMwM2JjKTsKCgkvKiB2Z2EgdXNlIDNjMC0zZGYgKi8KCgkvKiBicmluZyAweDNlMCAtIDB4M2Y1IGJhY2sgdG8gSVNBIHVzaW5nIFBBUjkgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVI5LCAweDMwMTUwM2UwKTsKCgkvKiBpZGUgdXNlIDNmNiAqLwoKCS8qIGJyaW5nIDB4M2Y3ICBiYWNrIHRvIElTQSB1c2luZyBQQVIxMCAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjEwLCAweDMwMDAwM2Y3KTsKCgkvKiBjb20xIHVzZSAzZjgtM2ZmICovCgoJcmV0dXJuIDA7Cn0KI2VuZGlmCgovKgogKiBNaXNjZWxhbmVvdXMgcGxhdGZvcm0gZGVwZW5kZW50IGluaXRpYWxpc2F0aW9ucwogKi8KCmludCBib2FyZF9pbml0KHZvaWQpCnsKCWluaXRfc2M1MjAoKTsKCWJ1c19pbml0KCk7CglpcnFfaW5pdCgpOwoKCS8qIG1heCBkcml2ZSBjdXJyZW50IG9uIFNEUkFNICovCgl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfRFNDVEwsIDB4MDEwMCk7CgoJLyogZW50ZXIgZGVidWcgbW9kZSBhZnRlciBuZXh0IHJlc2V0IChvbmx5IGlmIGp1bXBlciBpcyBhbHNvIHNldCkgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9SRVNDRkcsIDB4MDgpOwoJLyogY29uZmlndXJlIHRoZSBzb2Z0d2FyZSB0aW1lciB0byAzMy4zMzNNSHogKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9TV1RNUkNGRywgMCk7CglnZC0+YnVzX2NsayA9IDMzMzMzMDAwOwoKCXJldHVybiAwOwp9CgppbnQgZHJhbV9pbml0KHZvaWQpCnsKCWluaXRfc2M1MjBfZHJhbSgpOwoJcmV0dXJuIDA7Cn0KCnZvaWQgc2hvd19ib290X3Byb2dyZXNzKGludCB2YWwpCnsKCWlmICh2YWwgPCAtMzIpIHZhbCA9IC0xOyAgLyogbGV0IHRoaW5ncyBjb21wYXRpYmxlICovCglvdXRiKHZhbCYweGZmLCAweDgwKTsKCW91dGIoKHZhbCYweGZmMDApPj44LCAweDY4MCk7Cn0KCgppbnQgbGFzdF9zdGFnZV9pbml0KHZvaWQpCnsKCWludCBtaW5vcjsKCWludCBtYWpvcjsKCgltYWpvciA9IG1pbm9yID0gMDsKCW1ham9yIHw9IGFsaTUxMnhfY2lvX2luKDIzKT8yOjA7CgltYWpvciB8PSBhbGk1MTJ4X2Npb19pbigyMik/MTowOwoJbWlub3IgfD0gYWxpNTEyeF9jaW9faW4oMjEpPzI6MDsKCW1pbm9yIHw9IGFsaTUxMnhfY2lvX2luKDIwKT8xOjA7CgoJcHJpbnRmKCJBTUQgU0M1MjAgQ0RQIHJldmlzaW9uICVkLiVkXG4iLCBtYWpvciwgbWlub3IpOwoKCXJldHVybiAwOwp9CgoKdm9pZCBzc2lfY2hpcF9zZWxlY3QoaW50IGRldikKewoKCS8qIFNwdW5rIGJvYXJkOiBTUEkgRUVQUk9NIGlzIGFjdGl2ZS1sb3csIE1XIEVFUFJPTSBhbmQgQVVYIGFyZSBhY3RpdmUgaGlnaCAqLwoJc3dpdGNoIChkZXYpIHsKCWNhc2UgMTogLyogU1BJIEVFUFJPTSAqLwoJCWFsaTUxMnhfY2lvX291dCgxNiwgMCk7CgkJYnJlYWs7CgoJY2FzZSAyOiAvKiBNVyBFRVBST00gKi8KCQlhbGk1MTJ4X2Npb19vdXQoMTUsIDEpOwoJCWJyZWFrOwoKCWNhc2UgMzogLyogQVVYICovCgkJYWxpNTEyeF9jaW9fb3V0KDE0LCAxKTsKCQlicmVhazsKCgljYXNlIDA6CgkJYWxpNTEyeF9jaW9fb3V0KDE2LCAxKTsKCQlhbGk1MTJ4X2Npb19vdXQoMTUsIDApOwoJCWFsaTUxMnhfY2lvX291dCgxNCwgMCk7CgkJYnJlYWs7CgoJZGVmYXVsdDoKCQlwcmludGYoIklsbGVnYWwgU1NJIGRldmljZSByZXF1ZXN0ZWQ6ICVkXG4iLCBkZXYpOwoJfQp9Cgp2b2lkIHNwaV9lZXByb21fcHJvYmUoaW50IHgpCnsKfQoKaW50IHNwaV9lZXByb21fcmVhZChpbnQgeCwgaW50IG9mZnNldCwgdWNoYXIgKmJ1ZmZlciwgaW50IGxlbikKewogICAgICAgcmV0dXJuIDA7Cn0KCmludCBzcGlfZWVwcm9tX3dyaXRlKGludCB4LCBpbnQgb2Zmc2V0LCB1Y2hhciAqYnVmZmVyLCBpbnQgbGVuKQp7CiAgICAgICByZXR1cm4gMDsKfQoKdm9pZCBzcGlfaW5pdF9mKHZvaWQpCnsKI2lmZGVmIENPTkZJR19TWVNfU0M1MjBfQ0RQX1VTRV9TUEkKCXNwaV9lZXByb21fcHJvYmUoMSk7CiNlbmRpZgojaWZkZWYgQ09ORklHX1NZU19TQzUyMF9DRFBfVVNFX01XCgltd19lZXByb21fcHJvYmUoMik7CiNlbmRpZgp9Cgpzc2l6ZV90IHNwaV9yZWFkKHVjaGFyICphZGRyLCBpbnQgYWxlbiwgdWNoYXIgKmJ1ZmZlciwgaW50IGxlbikKewoJaW50IG9mZnNldDsKCWludCBpOwoJc3NpemVfdCByZXM7CgoJb2Zmc2V0ID0gMDsKCWZvciAoaT0wO2k8YWxlbjtpKyspIHsKCQlvZmZzZXQgPDw9IDg7CgkJb2Zmc2V0IHw9IGFkZHJbaV07Cgl9CgojaWZkZWYgQ09ORklHX1NZU19TQzUyMF9DRFBfVVNFX1NQSQoJcmVzID0gc3BpX2VlcHJvbV9yZWFkKDEsIG9mZnNldCwgYnVmZmVyLCBsZW4pOwojZW5kaWYKI2lmZGVmIENPTkZJR19TWVNfU0M1MjBfQ0RQX1VTRV9NVwoJcmVzID0gbXdfZWVwcm9tX3JlYWQoMiwgb2Zmc2V0LCBidWZmZXIsIGxlbik7CiNlbmRpZgojaWYgIWRlZmluZWQoQ09ORklHX1NZU19TQzUyMF9DRFBfVVNFX1NQSSkgJiYgIWRlZmluZWQoQ09ORklHX1NZU19TQzUyMF9DRFBfVVNFX01XKQoJcmVzID0gMDsKI2VuZGlmCglyZXR1cm4gcmVzOwp9Cgpzc2l6ZV90IHNwaV93cml0ZSh1Y2hhciAqYWRkciwgaW50IGFsZW4sIHVjaGFyICpidWZmZXIsIGludCBsZW4pCnsKCWludCBvZmZzZXQ7CglpbnQgaTsKCXNzaXplX3QgcmVzOwoKCW9mZnNldCA9IDA7Cglmb3IgKGk9MDtpPGFsZW47aSsrKSB7CgkJb2Zmc2V0IDw8PSA4OwoJCW9mZnNldCB8PSBhZGRyW2ldOwoJfQoKI2lmZGVmIENPTkZJR19TWVNfU0M1MjBfQ0RQX1VTRV9TUEkKCXJlcyA9IHNwaV9lZXByb21fd3JpdGUoMSwgb2Zmc2V0LCBidWZmZXIsIGxlbik7CiNlbmRpZgojaWZkZWYgQ09ORklHX1NZU19TQzUyMF9DRFBfVVNFX01XCglyZXMgPSBtd19lZXByb21fd3JpdGUoMiwgb2Zmc2V0LCBidWZmZXIsIGxlbik7CiNlbmRpZgojaWYgIWRlZmluZWQoQ09ORklHX1NZU19TQzUyMF9DRFBfVVNFX1NQSSkgJiYgIWRlZmluZWQoQ09ORklHX1NZU19TQzUyMF9DRFBfVVNFX01XKQoJcmVzID0gMDsKI2VuZGlmCglyZXR1cm4gcmVzOwp9CgppbnQgYm9hcmRfZXRoX2luaXQoYmRfdCAqYmlzKQp7CglyZXR1cm4gcGNpX2V0aF9pbml0KGJpcyk7Cn0K