LyoKICoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKI2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8cGNpLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS9wY2kuaD4KI2luY2x1ZGUgPGFzbS9pYy9zYzUyMC5oPgojaW5jbHVkZSA8YXNtL2ljL2FsaTUxMnguaD4KI2luY2x1ZGUgPHNwaS5oPgoKREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CgojdW5kZWYgU0M1MjBfQ0RQX0RFQlVHCgojaWZkZWYJU0M1MjBfQ0RQX0RFQlVHCiNkZWZpbmUJUFJJTlRGKGZtdCxhcmdzLi4uKQlwcmludGYgKGZtdCAsIyNhcmdzKQojZWxzZQojZGVmaW5lIFBSSU5URihmbXQsYXJncy4uLikKI2VuZGlmCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoKLyoKICogVGhlb3J5OgogKiBXZSBmaXJzdCBzZXQgdXAgYWxsIElSUXMgdG8gYmUgbm9uLXBjaSwgZWRnZSB0cmlnZ2VyZWQsCiAqIHdoZW4gd2UgbGF0ZXIgZW51bWVyYXRlIHRoZSBwY2kgYnVzIGFuZCBwY2lfc2M1MjBfZml4dXBfaXJxKCkgZ2V0cwogKiBjYWxsZWQgd2UgcmVhbGxvY2F0ZSBpcnFzIHRvIHRoZSBwY2kgYnVzIHdpdGggc2M1MjBfcGNpX3NldF9pcnEoKQogKiBhcyBuZWVkZWQuIFdoZSBjaG9vc2UgdGhlIGlycXMgdG8gZ3JhbSBmcm9tIGEgY29uZmlndXJhYmxlIGxpc3QKICogaW5zaWRlIHBjaV9zYzUyMF9maXh1cF9pcnEoKSAoSWYgdGhpcyBsaXN0IGNvbnRhaW5zIHN0dXBpZCBpcnEncwogKiBzdWNoIGFzIDAgdGhuZ2FzIHdpbGwgbm90IHdvcmspCiAqLwoKc3RhdGljIHZvaWQgaXJxX2luaXQodm9pZCkKewoJLyogZGlzYWJsZSBnbG9iYWwgaW50ZXJydXB0IG1vZGUgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9QSUNJQ1IsIDB4NDApOwoKCS8qIHNldCBhbGwgaXJxcyB0byBlZGdlICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfTVBJQ01PREUsIDB4MDApOwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1NMMVBJQ01PREUsIDB4MDApOwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1NMMlBJQ01PREUsIDB4MDApOwoKCS8qIGFjdGl2ZSBsb3cgcG9sYXJpdHkgb24gUElDIGludGVycnVwdCBwaW5zLAoJICogIGFjdGl2ZSBoaWdoIHBvbGFyaXR5IG9uIGFsbCBvdGhlciBpcnEgcGlucyAqLwoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0lOVFBJTlBPTCwgMHgwMDAwKTsKCgkvKiBzZXQgaXJxIG51bWJlciBtYXBwaW5nICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1BUTVIwTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgIC8qIGRpc2FibGUgR1AgdGltZXIgMCBJTlQgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUFRNUjFNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAgLyogZGlzYWJsZSBHUCB0aW1lciAxIElOVCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQVE1SMk1BUCwgU0M1MjBfSVJRX0RJU0FCTEVEKTsgICAvKiBkaXNhYmxlIEdQIHRpbWVyIDIgSU5UICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfUElUME1BUCwgU0M1MjBfSVJRMCk7ICAgICAgICAgICAgIC8qIFNldCBQSVQgdGltZXIgMCBJTlQgdG8gSVJRMCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BJVDFNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAgICAvKiBkaXNhYmxlIFBJVCB0aW1lciAxIElOVCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BJVDJNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAgICAvKiBkaXNhYmxlIFBJVCB0aW1lciAyIElOVCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BDSUlOVEFNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAvKiBkaXNhYmxlIFBDSSBJTlQgQSAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BDSUlOVEJNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAvKiBkaXNhYmxlIFBDSSBJTlQgQiAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BDSUlOVENNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAvKiBkaXNhYmxlIFBDSSBJTlQgQyAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BDSUlOVERNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAvKiBkaXNhYmxlIFBDSSBJTlQgRCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0RNQUJDSU5UTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAvKiBkaXNhYmxlIERNQSBJTlQgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9TU0lNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAgICAgLyogZGlzYWJsZSBTeW5jaHJvbml1cyBzZXJpYWwgSU5UICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfV0RUTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgICAgIC8qIGRpc2FibGUgV2F0Y2hkb2cgSU5UICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfUlRDTUFQLCBTQzUyMF9JUlE4KTsgICAgICAgICAgICAgIC8qIFNldCBSVEMgaW50IHRvIDggKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9XUFZNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAgICAgLyogZGlzYWJsZSB3cml0ZSBwcm90ZWN0IElOVCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0lDRU1BUCwgU0M1MjBfSVJRMSk7ICAgICAgICAgICAgICAvKiBTZXQgSUNFIERlYnVnIFNlcmllbHBvcnQgSU5UIHRvIElSUTEgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9GRVJSTUFQLFNDNTIwX0lSUTEzKTsgICAgICAgICAgICAgLyogU2V0IEZQIGVycm9yIElOVCB0byBJUlExMyAqLwoKCWlmIChDRkdfVVNFX1NJT19VQVJUKSB7CgkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1VBUlQxTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAvKiBkaXNhYmxlIGludGVybmFsIFVBUlQxIElOVCAqLwoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9VQVJUMk1BUCwgU0M1MjBfSVJRX0RJU0FCTEVEKTsgLyogZGlzYWJsZSBpbnRlcm5hbCBVQVJUMiBJTlQgKi8KCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1AzSU1BUCwgU0M1MjBfSVJRMyk7ICAgICAgICAgIC8qIFNldCBHUElSUTMgKElTQSBJUlEzKSB0byBJUlEzICovCgkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQNElNQVAsIFNDNTIwX0lSUTQpOyAgICAgICAgICAvKiBTZXQgR1BJUlE0IChJU0EgSVJRNCkgdG8gSVJRNCAqLwoJfSBlbHNlIHsKCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfVUFSVDFNQVAsIFNDNTIwX0lSUTQpOyAgICAgICAgIC8qIFNldCBpbnRlcm5hbCBVQVJUMiBJTlQgdG8gSVJRNCAqLwoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9VQVJUMk1BUCwgU0M1MjBfSVJRMyk7ICAgICAgICAgLyogU2V0IGludGVybmFsIFVBUlQyIElOVCB0byBJUlEzICovCgkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQM0lNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAvKiBkaXNhYmxlIEdQSVJRMyAoSVNBIElSUTMpICovCgkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQNElNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAvKiBkaXNhYmxlIEdQSVJRNCAoSVNBIElSUTQpICovCgl9CgoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQMUlNQVAsIFNDNTIwX0lSUTEpOyAgICAgICAgICAgICAvKiBTZXQgR1BJUlExIChTSU8gSVJRMSkgdG8gSVJRMSAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQNUlNQVAsIFNDNTIwX0lSUTUpOyAgICAgICAgICAgICAvKiBTZXQgR1BJUlE1IChJU0EgSVJRNSkgdG8gSVJRNSAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQNklNQVAsIFNDNTIwX0lSUTYpOyAgICAgICAgICAgICAvKiBTZXQgR1BJUlE2IChJU0EgSVJRNikgdG8gSVJRNiAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQN0lNQVAsIFNDNTIwX0lSUTcpOyAgICAgICAgICAgICAvKiBTZXQgR1BJUlE3IChJU0EgSVJRNykgdG8gSVJRNyAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQOElNQVAsIFNDNTIwX0lSUTgpOyAgICAgICAgICAgICAvKiBTZXQgR1BJUlE4IChTSU8gSVJROCkgdG8gSVJROCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQOUlNQVAsIFNDNTIwX0lSUTkpOyAgICAgICAgICAgICAvKiBTZXQgR1BJUlE5IChJU0EgSVJRMikgdG8gSVJROSAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQMElNQVAsIFNDNTIwX0lSUTExKTsgICAgICAgICAgICAvKiBTZXQgR1BJUlEwIChJU0EgSVJRMTEpIHRvIElSUTEwICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1AySU1BUCwgU0M1MjBfSVJRMTIpOyAgICAgICAgICAgIC8qIFNldCBHUElSUTIgKElTQSBJUlExMikgdG8gSVJRMTIgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDEwSU1BUCxTQzUyMF9JUlExNCk7ICAgICAgICAgICAgLyogU2V0IEdQSVJRMTAgKElTQSBJUlExNCkgdG8gSVJRMTQgKi8KCgl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfUENJSE9TVE1BUCwgMHgxMWYpOyAgICAgICAgICAgICAgICAvKiBNYXAgUENJIGhvc3RicmlkZ2UgSU5UIHRvIE5NSSAqLwoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0VDQ01BUCwgMHgxMDApOyAgICAgICAgICAgICAgICAgICAgLyogTWFwIFNEUkFNIEVDQyBmYWlsdXJlIElOVCB0byBOTUkgKi8KCn0KCgovKiBQQ0kgc3R1ZmYgKi8Kc3RhdGljIHZvaWQgcGNpX3NjNTIwX2NkcF9maXh1cF9pcnEoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBwY2lfZGV2X3QgZGV2KQp7CgkvKiBhIGNvbmZpZ3VyYWJsZSBsaXN0cyBvZiBpcnFzIHRvIHN0ZWFsCgkgKiB3aGVuIHdlIG5lZWQgb25lIChhIGJvYXJkIHdpdGggbW9yZSBwY2kgaW50ZXJydXB0IHBpbnMKCSAqIHdvdWxkIHVzZSBhIGxhcmdlciB0YWJsZSAqLwoJc3RhdGljIGludCBpcnFfbGlzdFtdID0gewoJCUNGR19GSVJTVF9QQ0lfSVJRLAoJCUNGR19TRUNPTkRfUENJX0lSUSwKCQlDRkdfVEhJUkRfUENJX0lSUSwKCQlDRkdfRk9SVEhfUENJX0lSUQoJfTsKCXN0YXRpYyBpbnQgbmV4dF9pcnFfaW5kZXg9MDsKCgljaGFyIHRtcF9waW47CglpbnQgcGluOwoKCXBjaV9ob3NlX3JlYWRfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnRtcF9waW4pOwoJcGluID0gdG1wX3BpbjsKCglwaW4tPTE7IC8qIHBjaSBjb25maWcgc3BhY2UgdXNlIDEtYmFzZWQgbnVtYmVyaW5nICovCglpZiAoLTEgPT0gcGluKSB7CgkJcmV0dXJuOyAvKiBkZXZpY2UgdXNlIG5vIGlycSAqLwoJfQoKCgkvKiBtYXAgZGV2aWNlIG51bWJlciArICBwaW4gdG8gYSBwaW4gb24gdGhlIHNjNTIwICovCglzd2l0Y2ggKFBDSV9ERVYoZGV2KSkgewoJY2FzZSAyMDoKCQlwaW4rPVNDNTIwX1BDSV9JTlRBOwoJCWJyZWFrOwoKCWNhc2UgMTk6CgkJcGluKz1TQzUyMF9QQ0lfSU5UQjsKCQlicmVhazsKCgljYXNlIDE4OgoJCXBpbis9U0M1MjBfUENJX0lOVEM7CgkJYnJlYWs7CgoJY2FzZSAxNzoKCQlwaW4rPVNDNTIwX1BDSV9JTlREOwoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJcmV0dXJuOwoJfQoKCXBpbiY9MzsgLyogd3JhcCBhcm91bmQgKi8KCglpZiAoc2M1MjBfcGNpX2ludHNbcGluXSA9PSAtMSkgewoJCS8qIHJlLXJvdXRlIG9uZSBpbnRlcnJ1cHQgZm9yIHVzICovCgkJaWYgKG5leHRfaXJxX2luZGV4ID4gMykgewoJCQlyZXR1cm47CgkJfQoJCWlmIChwY2lfc2M1MjBfc2V0X2lycShwaW4sIGlycV9saXN0W25leHRfaXJxX2luZGV4XSkpIHsKCQkJcmV0dXJuOwoJCX0KCQluZXh0X2lycV9pbmRleCsrOwoJfQoKCglpZiAoLTEgIT0gc2M1MjBfcGNpX2ludHNbcGluXSkgewoJCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLAoJCQkJCSAgIHNjNTIwX3BjaV9pbnRzW3Bpbl0pOwoJfQoJUFJJTlRGKCJmaXh1cF9pcnE6IGRldmljZSAlZCBwaW4gJWMgaXJxICVkXG4iLAoJICAgICAgIFBDSV9ERVYoZGV2KSwgJ0EnICsgcGluLCBzYzUyMF9wY2lfaW50c1twaW5dKTsKfQoKc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBzYzUyMF9jZHBfaG9zZSA9IHsKCWZpeHVwX2lycTogcGNpX3NjNTIwX2NkcF9maXh1cF9pcnEsCn07Cgp2b2lkIHBjaV9pbml0X2JvYXJkKHZvaWQpCnsKCXBjaV9zYzUyMF9pbml0KCZzYzUyMF9jZHBfaG9zZSk7Cn0KCgpzdGF0aWMgdm9pZCBzaWxlbmNlX3VhcnQoaW50IHBvcnQpCnsKCW91dGIoMCwgcG9ydCsxKTsKfQoKdm9pZCBzZXR1cF9hbGlfc2lvKGludCB1YXJ0X3ByaW1hcnkpCnsKCWFsaTUxMnhfaW5pdCgpOwoKCWFsaTUxMnhfc2V0X2ZkYyhBTElfRU5BQkxFRCwgMHgzZjIsIDYsIDApOwoJYWxpNTEyeF9zZXRfcHAoQUxJX0VOQUJMRUQsIDB4Mjc4LCA3LCAzKTsKCWFsaTUxMnhfc2V0X3VhcnQoQUxJX0VOQUJMRUQsIEFMSV9VQVJUMSwgdWFydF9wcmltYXJ5PzB4M2Y4OjB4M2U4LCA0KTsKCWFsaTUxMnhfc2V0X3VhcnQoQUxJX0VOQUJMRUQsIEFMSV9VQVJUMiwgdWFydF9wcmltYXJ5PzB4MmY4OjB4MmU4LCAzKTsKCWFsaTUxMnhfc2V0X3J0YyhBTElfRElTQUJMRUQsIDAsIDApOwoJYWxpNTEyeF9zZXRfa2JjKEFMSV9FTkFCTEVELCAxLCAxMik7CglhbGk1MTJ4X3NldF9jaW8oQUxJX0VOQUJMRUQpOwoKCS8qIElyRGEgcGlucyAqLwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMTIsIDEsIDAsIDApOwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMTMsIDEsIDAsIDApOwoKCS8qIFNTSSBjaGlwIHNlbGVjdCBwaW5zICovCglhbGk1MTJ4X2Npb19mdW5jdGlvbigxNCwgMCwgMCwgMCk7ICAvKiBTU0lfQ1MgKi8KCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDE1LCAwLCAwLCAwKTsgIC8qIFNTSV9NViAqLwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMTYsIDAsIDAsIDApOyAgLyogU1NJX1NQSSMgKi8KCgkvKiBCb2FyZCBSRVYgcGlucyAqLwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMjAsIDAsIDAsIDEpOwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMjEsIDAsIDAsIDEpOwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMjIsIDAsIDAsIDEpOwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMjMsIDAsIDAsIDEpOwp9CgoKLyogc2V0IHVwIHRoZSBJU0EgYnVzIHRpbWluZyBhbmQgc3lzdGVtIGFkZHJlc3MgbWFwcGluZ3MgKi8Kc3RhdGljIHZvaWQgYnVzX2luaXQodm9pZCkKewoKCS8qIHNldCB1cCB0aGUgR1AgSU8gcGlucyAqLwoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX1BJT1BGUzMxXzE2LCAweGY3ZmYpOwkvKiBzZXQgdGhlIEdQSU8gcGluIGZ1bmN0aW9uIDMxLTE2IHJlZyAqLwoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX1BJT1BGUzE1XzAsIDB4ZmZmZik7CS8qIHNldCB0aGUgR1BJTyBwaW4gZnVuY3Rpb24gMTUtMCByZWcgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9DU1BGUywgMHhmOCk7CQkvKiBzZXQgdGhlIENTIHBpbiBmdW5jdGlvbiAgcmVnICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfQ0xLU0VMLCAweDcwKTsKCgoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQQ1NSVCwgMSk7ICAgLyogc2V0IHRoZSBHUCBDUyBvZmZzZXQgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUENTUFcsIDMpOyAgIC8qIHNldCB0aGUgR1AgQ1MgcHVsc2Ugd2lkdGggKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUENTT0ZGLCAxKTsgIC8qIHNldCB0aGUgR1AgQ1Mgb2Zmc2V0ICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1BSRFcsIDMpOyAgICAvKiBzZXQgdGhlIFJEIHB1bHNlIHdpZHRoICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1BSRE9GRiwgMSk7ICAvKiBzZXQgdGhlIEdQIFJEIG9mZnNldCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQV1JXLCAzKTsgICAgLyogc2V0IHRoZSBHUCBXUiBwdWxzZSB3aWR0aCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQV1JPRkYsIDEpOyAgLyogc2V0IHRoZSBHUCBXUiBvZmZzZXQgKi8KCgl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfQk9PVENTQ1RMLCAweDE4MjMpOwkJLyogc2V0IHVwIHRpbWluZyBvZiBCT09UQ1MgKi8KCXdyaXRlX21tY3Jfd29yZChTQzUyMF9ST01DUzFDVEwsIDB4MTgyMyk7CQkvKiBzZXQgdXAgdGltaW5nIG9mIFJPTUNTMSAqLwoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX1JPTUNTMkNUTCwgMHgxODIzKTsJCS8qIHNldCB1cCB0aW1pbmcgb2YgUk9NQ1MyICovCgoJLyogYWRqdXN0IHRoZSBtZW1vcnkgbWFwOgoJICogYnkgZGVmYXVsdCB0aGUgZmlyc3QgMjU2TUIgKDB4MDAwMDAwMDAgLSAweDBmZmZmZmZmKSBpcyBtYXBwZWQgdG8gU0RSQU0KCSAqIGFuZCAyNTZNQiB0byAxRy0xMjhrICAoMHgxMDAwMDAwIC0gMHgzN2ZmZmZmZikgaXMgbWFwcGVkIHRvIFBDSSBtbWlvCgkgKiB3ZSBuZWVkIHRvIG1hcCAxRy0xMjhrIC0gMUcgKDB4MzgwMDAwMDAgLSAweDNmZmZmZmZmKSB0byBDUzEgKi8KCgoJLyogU1JBTSA9IEdQQ1MzIDEyOGsgQCBkMDAwMC1lZmZmZiovCgl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSMiwgIDB4NGUwMDQwMGQpOwoKCS8qIElERTAgPSBHUENTNiAxZjAtMWY3ICovCgl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSMywgIDB4MzgwODAxZjApOwoKCS8qIElERTEgPSBHUENTNyAzZjYgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVI0LCAgMHgzYzAwMDNmNik7CgkvKiBib290Y3MgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVIxMiwgMHg4YmZmZTgwMCk7CgkvKiByb21jczIgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVIxMywgMHhjYmZmZjAwMCk7CgkvKiByb21jczEgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVIxNCwgMHhhYmZmZjgwMCk7CgkvKiA2ODAgTEVEUyAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjE1LCAweDMwMDAwNjQwKTsKCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfQUREREVDQ1RMLCAwKTsKCglhc20gKCJ3YmludmRcbiIpOyAvKiBGbHVzaCBjYWNoZSwgcmVxLiBhZnRlciBzZXR0aW5nIHRoZSB1bmNoYWNoZWQgYXR0cmlidXRlIG9uYSBQQVIgKi8KCglpZiAoQ0ZHX1VTRV9TSU9fVUFSVCkgewoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9BRERERUNDVEwsIHJlYWRfbW1jcl9ieXRlKFNDNTIwX0FERERFQ0NUTCkgfCBVQVJUMl9ESVN8VUFSVDFfRElTKTsKCQlzZXR1cF9hbGlfc2lvKDEpOwoJfSBlbHNlIHsKCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfQUREREVDQ1RMLCByZWFkX21tY3JfYnl0ZShTQzUyMF9BRERERUNDVEwpICYgfihVQVJUMl9ESVN8VUFSVDFfRElTKSk7CgkJc2V0dXBfYWxpX3NpbygwKTsKCQlzaWxlbmNlX3VhcnQoMHgzZTgpOwoJCXNpbGVuY2VfdWFydCgweDJlOCk7Cgl9Cgp9CgovKiBHUENTIHVzYWdlCiAqIEdQQ1MwICAgICAgIFBJTzI3IChOTUkpCiAqIEdQQ1MxICAgICAgIFJPTUNTMQogKiBHUENTMiAgICAgICBST01DUzIKICogR1BDUzMgICAgICAgU1JBTUNTICAgICAgIFBBUjIKICogR1BDUzQgICAgICAgdW51c2VkICAgICAgIFBBUjMKICogR1BDUzUgICAgICAgdW51c2VkICAgICAgIFBBUjQKICogR1BDUzYgICAgICAgSURFCiAqIEdQQ1M3ICAgICAgIElERQogKi8KCgovKiBwYXIgdXNhZ2U6CiAqIFBBUjAgICBsZWdhY3lfdmlkZW8KICogUEFSMSAgIFBDSSBST00gbWFwcGluZwogKiBQQVIyICAgU1JBTQogKiBQQVIzICAgSURFCiAqIFBBUjQgICBJREUKICogUEFSNSAgIGxlZ2FjeV92aWRlbwogKiBQQVI2ICAgbGVnYWN5X3ZpZGVvCiAqIFBBUjcgICBsZWdhY3lfdmlkZW8KICogUEFSOCAgIGxlZ2FjeV92aWRlbwogKiBQQVI5ICAgbGVnYWN5X3ZpZGVvCiAqIFBBUjEwICBsZWdhY3lfdmlkZW8KICogUEFSMTEgIElTQVJPTQogKiBQQVIxMiAgQk9PVENTCiAqIFBBUjEzICBST01DUzEKICogUEFSMTQgIFJPTUNTMgogKiBQQVIxNSAgUG9ydCAweDY4MCBMRUQgZGlzcGxheQogKi8KCi8qCiAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG1hcCBhIGNodW5rIG9mIHNpemUgYnl0ZXMKICogb2YgdGhlIHN5c3RlbSBhZGRyZXNzIHNwYWNlIHRvIHRoZSBJU0EgYnVzCiAqCiAqIFRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgbWVtb3J5IGFkZHJlc3MKICogYXMgc2VlbiBieSB0aGUgaG9zdCAod2hpY2ggbWF5IHZlcnkgd2lsbCBiZSB0aGUKICogc2FtZSBhcyB0aGUgYnVzIGFkZHJlc3MpCiAqLwp1MzIgaXNhX21hcF9yb20odTMyIGJ1c19hZGRyLCBpbnQgc2l6ZSkKewoJdTMyIHBhcjsKCglQUklOVEYoImlzYV9tYXBfcm9tIGFza2VkIHRvIG1hcCAlZCBieXRlcyBhdCAleFxuIiwKCSAgICAgICBzaXplLCBidXNfYWRkcik7CgoJcGFyID0gc2l6ZTsKCWlmIChwYXIgPCAweDgwMDAwKSB7CgkJcGFyID0gMHg4MDAwMDsKCX0KCXBhciA+Pj0gMTI7CglwYXItLTsKCXBhciY9MHg3ZjsKCXBhciA8PD0gMTg7CglwYXIgfD0gKGJ1c19hZGRyPj4xMik7CglwYXIgfD0gMHg1MDAwMDAwMDsKCglQUklOVEYgKCJzZXR0aW5nIFBBUjExIHRvICV4XG4iLCBwYXIpOwoKCS8qIE1hcCByb20gMHgxMDAwMCB3aXRoIFBBUjEgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVIxMSwgIHBhcik7CgoJcmV0dXJuIGJ1c19hZGRyOwp9CgovKgogKiB0aGlzIGZ1bmN0aW9uIHJlbW92ZWQgYW55IG1hcHBpbmcgY3JlYXRlZAogKiB3aXRoIHBjaV9nZXRfcm9tX3dpbmRvdygpCiAqLwp2b2lkIGlzYV91bm1hcF9yb20odTMyIGFkZHIpCnsKCVBSSU5URigiaXNhX3VubWFwX3JvbSBhc2tlZCB0byB1bm1hcCAleCIsIGFkZHIpOwoJaWYgKChhZGRyPj4xMikgPT0gKHJlYWRfbW1jcl9sb25nKFNDNTIwX1BBUjExKSYweDNmZmZmKSkgewoJCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVIxMSwgMCk7CgkJUFJJTlRGKCIgZG9uZVxuIik7CgkJcmV0dXJuOwoJfQoJUFJJTlRGKCIgbm90IG91cnNcbiIpOwp9CgojaWZkZWYgQ09ORklHX1BDSQojZGVmaW5lIFBDSV9ST01fVEVNUF9TUEFDRSAweDEwMDAwCi8qCiAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG1hcCBhIGNodW5rIG9mIHNpemUgYnl0ZXMKICogb2YgdGhlIHN5c3RlbSBhZGRyZXNzIHNwYWNlIHRvIHRoZSBQQ0kgYnVzLAogKiBzdWl0YWJsZSB0byBtYXAgUENJIFJPTVMgKGJ1cyBhZGRyZXNzIDwgMTZNKQogKiB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIGhvc3QgbWVtb3J5IGFkZHJlc3MKICogd2hpY2ggc2hvdWxkIGJlIGNvbnZlcnRlZCBpbnRvIGEgYnVzIGFkZHJlc3MKICogYmVmb3JlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBQQ0kgcm9tIGFkZHJlc3MKICogZGVjb2RlcgogKi8KdTMyIHBjaV9nZXRfcm9tX3dpbmRvdyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIGludCBzaXplKQp7Cgl1MzIgcGFyOwoKCXBhciA9IHNpemU7CglpZiAocGFyIDwgMHg4MDAwMCkgewoJCXBhciA9IDB4ODAwMDA7Cgl9CglwYXIgPj49IDE2OwoJcGFyLS07CglwYXImPTB4N2ZmOwoJcGFyIDw8PSAxNDsKCXBhciB8PSAoUENJX1JPTV9URU1QX1NQQUNFPj4xNik7CglwYXIgfD0gMHg3MjAwMDAwMDsKCglQUklOVEYgKCJzZXR0aW5nIFBBUjEgdG8gJXhcbiIsIHBhcik7CgoJLyogTWFwIHJvbSAweDEwMDAwIHdpdGggUEFSMSAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjEsICBwYXIpOwoKCXJldHVybiBQQ0lfUk9NX1RFTVBfU1BBQ0U7Cn0KCi8qCiAqIHRoaXMgZnVuY3Rpb24gcmVtb3ZlZCBhbnkgbWFwcGluZyBjcmVhdGVkCiAqIHdpdGggcGNpX2dldF9yb21fd2luZG93KCkKICovCnZvaWQgcGNpX3JlbW92ZV9yb21fd2luZG93KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgdTMyIGFkZHIpCnsKCVBSSU5URigicGNpX3JlbW92ZV9yb21fd2luZG93OiAleCIsIGFkZHIpOwoJaWYgKGFkZHIgPT0gUENJX1JPTV9URU1QX1NQQUNFKSB7CgkJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjEsIDApOwoJCVBSSU5URigiIGRvbmVcbiIpOwoJCXJldHVybjsKCX0KCVBSSU5URigiIG5vdCBvdXJzXG4iKTsKCn0KCi8qCiAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIG9yZGVyIHRvIHByb3ZpZGUgYWNjZXMgdG8gdGhlCiAqIGxlZ2FjeSB2aWRlbyBJL08gcG9ydHMgb24gdGhlIFBDSSBidXMuCiAqIEFmdGVyIHRoaXMgZnVuY3Rpb24gYWNjZXNzZXMgdG8gSS9PIHBvcnRzIDB4M2IwLTB4M2JiIGFuZAogKiAweDNjMC0weDNkZiBzaHVsZCByZXN1bHQgaW4gdHJhbnNhY3Rpb25zIG9uIHRoZSBQQ0kgYnVzLgogKgogKi8KaW50IHBjaV9lbmFibGVfbGVnYWN5X3ZpZGVvX3BvcnRzKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKewoJLyogTWFwIHZpZGVvIG1lbW9yeSB0byAweGEwMDAwKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVIwLCAgMHg3MjAwNDAwYSk7CgoJLyogZm9yd2FyZCBhbGwgSS9PIGFjY2Vzc2VzIHRvIFBDSSAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0FERERFQ0NUTCwKCQkJcmVhZF9tbWNyX2J5dGUoU0M1MjBfQUREREVDQ1RMKSB8IElPX0hPTEVfREVTVF9QQ0kpOwoKCgkvKiBzbyB3ZSBtYXAgYXdheSBhbGwgaW8gcG9ydHMgdG8gcGNpIChvbmx5IHdheSB0byBhY2Nlc3MgcGNpIGlvCgkgKiBiZWxvdyAweDQwMC4gQnV0IHRoZW4gd2UgaGF2ZSB0byBtYXAgYmFjayB0aGUgcG9ydGlvbnMgdGhhdCB3ZSBkb250CgkgKiB1c2Ugc28gdGhhdCB0aGUgZ2VuZXJhdGUgY3ljbGVzIG9uIHRoZSBHUElPIGJ1cyB3aGVyZSB0aGUgc2lvIGFuZAoJICogSVNBIHNsb3RzIGFyZSBjb25uZWN0ZWQsIHRoaXMgcmVxdXJlIHRoZSB1c2Ugb2Ygc2V2ZXJhbCBQQVIgcmVnaXN0ZXJzCgkgKi8KCgkvKiBicmluZyAweDEwMCAtIDB4MWVmIGJhY2sgdG8gSVNBIHVzaW5nIFBBUjUgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVI1LCAweDMwZWYwMTAwKTsKCgkvKiBJREUgdXNlIDFmMC0xZjcgKi8KCgkvKiBicmluZyAweDFmOCAtIDB4MmY3IGJhY2sgdG8gSVNBIHVzaW5nIFBBUjYgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVI2LCAweDMwZmYwMWY4KTsKCgkvKiBjb20yIHVzZSAyZjgtMmZmICovCgoJLyogYnJpbmcgMHgzMDAgLSAweDNhZiBiYWNrIHRvIElTQSB1c2luZyBQQVI3ICovCgl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSNywgMHgzMGFmMDMwMCk7CgoJLyogdmdhIHVzZSAzYjAtM2JiICovCgoJLyogYnJpbmcgMHgzYmMgLSAweDNiZiBiYWNrIHRvIElTQSB1c2luZyBQQVI4ICovCgl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSOCwgMHgzMDAzMDNiYyk7CgoJLyogdmdhIHVzZSAzYzAtM2RmICovCgoJLyogYnJpbmcgMHgzZTAgLSAweDNmNSBiYWNrIHRvIElTQSB1c2luZyBQQVI5ICovCgl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSOSwgMHgzMDE1MDNlMCk7CgoJLyogaWRlIHVzZSAzZjYgKi8KCgkvKiBicmluZyAweDNmNyAgYmFjayB0byBJU0EgdXNpbmcgUEFSMTAgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVIxMCwgMHgzMDAwMDNmNyk7CgoJLyogY29tMSB1c2UgM2Y4LTNmZiAqLwoKCXJldHVybiAwOwp9CiNlbmRpZgoKLyoKICogTWlzY2VsYW5lb3VzIHBsYXRmb3JtIGRlcGVuZGVudCBpbml0aWFsaXNhdGlvbnMKICovCgppbnQgYm9hcmRfaW5pdCh2b2lkKQp7Cglpbml0X3NjNTIwKCk7CglidXNfaW5pdCgpOwoJaXJxX2luaXQoKTsKCgkvKiBtYXggZHJpdmUgY3VycmVudCBvbiBTRFJBTSAqLwoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0RTQ1RMLCAweDAxMDApOwoKCS8qIGVudGVyIGRlYnVnIG1vZGUgYWZ0ZXIgbmV4dCByZXNldCAob25seSBpZiBqdW1wZXIgaXMgYWxzbyBzZXQpICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfUkVTQ0ZHLCAweDA4KTsKCS8qIGNvbmZpZ3VyZSB0aGUgc29mdHdhcmUgdGltZXIgdG8gMzMuMzMzTUh6ICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU1dUTVJDRkcsIDApOwoJZ2QtPmJ1c19jbGsgPSAzMzMzMzAwMDsKCglyZXR1cm4gMDsKfQoKaW50IGRyYW1faW5pdCh2b2lkKQp7Cglpbml0X3NjNTIwX2RyYW0oKTsKCXJldHVybiAwOwp9Cgp2b2lkIHNob3dfYm9vdF9wcm9ncmVzcyhpbnQgdmFsKQp7CglpZiAodmFsIDwgLTMyKSB2YWwgPSAtMTsgIC8qIGxldCB0aGluZ3MgY29tcGF0aWJsZSAqLwoJb3V0Yih2YWwmMHhmZiwgMHg4MCk7CglvdXRiKCh2YWwmMHhmZjAwKT4+OCwgMHg2ODApOwp9CgoKaW50IGxhc3Rfc3RhZ2VfaW5pdCh2b2lkKQp7CglpbnQgbWlub3I7CglpbnQgbWFqb3I7CgoJbWFqb3IgPSBtaW5vciA9IDA7CgltYWpvciB8PSBhbGk1MTJ4X2Npb19pbigyMyk/MjowOwoJbWFqb3IgfD0gYWxpNTEyeF9jaW9faW4oMjIpPzE6MDsKCW1pbm9yIHw9IGFsaTUxMnhfY2lvX2luKDIxKT8yOjA7CgltaW5vciB8PSBhbGk1MTJ4X2Npb19pbigyMCk/MTowOwoKCXByaW50ZigiQU1EIFNDNTIwIENEUCByZXZpc2lvbiAlZC4lZFxuIiwgbWFqb3IsIG1pbm9yKTsKCglyZXR1cm4gMDsKfQoKCnZvaWQgc3NpX2NoaXBfc2VsZWN0KGludCBkZXYpCnsKCgkvKiBTcHVuayBib2FyZDogU1BJIEVFUFJPTSBpcyBhY3RpdmUtbG93LCBNVyBFRVBST00gYW5kIEFVWCBhcmUgYWN0aXZlIGhpZ2ggKi8KCXN3aXRjaCAoZGV2KSB7CgljYXNlIDE6IC8qIFNQSSBFRVBST00gKi8KCQlhbGk1MTJ4X2Npb19vdXQoMTYsIDApOwoJCWJyZWFrOwoKCWNhc2UgMjogLyogTVcgRUVQUk9NICovCgkJYWxpNTEyeF9jaW9fb3V0KDE1LCAxKTsKCQlicmVhazsKCgljYXNlIDM6IC8qIEFVWCAqLwoJCWFsaTUxMnhfY2lvX291dCgxNCwgMSk7CgkJYnJlYWs7CgoJY2FzZSAwOgoJCWFsaTUxMnhfY2lvX291dCgxNiwgMSk7CgkJYWxpNTEyeF9jaW9fb3V0KDE1LCAwKTsKCQlhbGk1MTJ4X2Npb19vdXQoMTQsIDApOwoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJcHJpbnRmKCJJbGxlZ2FsIFNTSSBkZXZpY2UgcmVxdWVzdGVkOiAlZFxuIiwgZGV2KTsKCX0KfQoKdm9pZCBzcGlfZWVwcm9tX3Byb2JlKGludCB4KQp7Cn0KCmludCBzcGlfZWVwcm9tX3JlYWQoaW50IHgsIGludCBvZmZzZXQsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbikKewogICAgICAgcmV0dXJuIDA7Cn0KCmludCBzcGlfZWVwcm9tX3dyaXRlKGludCB4LCBpbnQgb2Zmc2V0LCBjaGFyICpidWZmZXIsIGludCBsZW4pCnsKICAgICAgIHJldHVybiAwOwp9Cgp2b2lkIHNwaV9pbml0X2Yodm9pZCkKewojaWZkZWYgQ09ORklHX1NDNTIwX0NEUF9VU0VfU1BJCglzcGlfZWVwcm9tX3Byb2JlKDEpOwojZW5kaWYKI2lmZGVmIENPTkZJR19TQzUyMF9DRFBfVVNFX01XCgltd19lZXByb21fcHJvYmUoMik7CiNlbmRpZgp9Cgpzc2l6ZV90IHNwaV9yZWFkKHVjaGFyICphZGRyLCBpbnQgYWxlbiwgdWNoYXIgKmJ1ZmZlciwgaW50IGxlbikKewoJaW50IG9mZnNldDsKCWludCBpOwoJc3NpemVfdCByZXM7CgoJb2Zmc2V0ID0gMDsKCWZvciAoaT0wO2k8YWxlbjtpKyspIHsKCQlvZmZzZXQgPDw9IDg7CgkJb2Zmc2V0IHw9IGFkZHJbaV07Cgl9CgojaWZkZWYgQ09ORklHX1NDNTIwX0NEUF9VU0VfU1BJCglyZXMgPSBzcGlfZWVwcm9tX3JlYWQoMSwgb2Zmc2V0LCBidWZmZXIsIGxlbik7CiNlbmRpZgojaWZkZWYgQ09ORklHX1NDNTIwX0NEUF9VU0VfTVcKCXJlcyA9IG13X2VlcHJvbV9yZWFkKDIsIG9mZnNldCwgYnVmZmVyLCBsZW4pOwojZW5kaWYKI2lmICFkZWZpbmVkKENPTkZJR19TQzUyMF9DRFBfVVNFX1NQSSkgJiYgIWRlZmluZWQoQ09ORklHX1NDNTIwX0NEUF9VU0VfTVcpCglyZXMgPSAwOwojZW5kaWYKCXJldHVybiByZXM7Cn0KCnNzaXplX3Qgc3BpX3dyaXRlKHVjaGFyICphZGRyLCBpbnQgYWxlbiwgdWNoYXIgKmJ1ZmZlciwgaW50IGxlbikKewoJaW50IG9mZnNldDsKCWludCBpOwoJc3NpemVfdCByZXM7CgoJb2Zmc2V0ID0gMDsKCWZvciAoaT0wO2k8YWxlbjtpKyspIHsKCQlvZmZzZXQgPDw9IDg7CgkJb2Zmc2V0IHw9IGFkZHJbaV07Cgl9CgojaWZkZWYgQ09ORklHX1NDNTIwX0NEUF9VU0VfU1BJCglyZXMgPSBzcGlfZWVwcm9tX3dyaXRlKDEsIG9mZnNldCwgYnVmZmVyLCBsZW4pOwojZW5kaWYKI2lmZGVmIENPTkZJR19TQzUyMF9DRFBfVVNFX01XCglyZXMgPSBtd19lZXByb21fd3JpdGUoMiwgb2Zmc2V0LCBidWZmZXIsIGxlbik7CiNlbmRpZgojaWYgIWRlZmluZWQoQ09ORklHX1NDNTIwX0NEUF9VU0VfU1BJKSAmJiAhZGVmaW5lZChDT05GSUdfU0M1MjBfQ0RQX1VTRV9NVykKCXJlcyA9IDA7CiNlbmRpZgoJcmV0dXJuIHJlczsKfQo=