LyoKICoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKI2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlIDxhc20vaWMvc2M1MjAuaD4KI2luY2x1ZGUgPGFsaTUxMnguaD4KI2luY2x1ZGUgPHNwaS5oPgojaW5jbHVkZSA8bmV0ZGV2Lmg+CgpERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKCiN1bmRlZiBTQzUyMF9DRFBfREVCVUcKCiNpZmRlZglTQzUyMF9DRFBfREVCVUcKI2RlZmluZQlQUklOVEYoZm10LGFyZ3MuLi4pCXByaW50ZiAoZm10ICwjI2FyZ3MpCiNlbHNlCiNkZWZpbmUgUFJJTlRGKGZtdCxhcmdzLi4uKQojZW5kaWYKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgovKgogKiBUaGVvcnk6CiAqIFdlIGZpcnN0IHNldCB1cCBhbGwgSVJRcyB0byBiZSBub24tcGNpLCBlZGdlIHRyaWdnZXJlZCwKICogd2hlbiB3ZSBsYXRlciBlbnVtZXJhdGUgdGhlIHBjaSBidXMgYW5kIHBjaV9zYzUyMF9maXh1cF9pcnEoKSBnZXRzCiAqIGNhbGxlZCB3ZSByZWFsbG9jYXRlIGlycXMgdG8gdGhlIHBjaSBidXMgd2l0aCBzYzUyMF9wY2lfc2V0X2lycSgpCiAqIGFzIG5lZWRlZC4gV2hlIGNob29zZSB0aGUgaXJxcyB0byBncmFtIGZyb20gYSBjb25maWd1cmFibGUgbGlzdAogKiBpbnNpZGUgcGNpX3NjNTIwX2ZpeHVwX2lycSgpIChJZiB0aGlzIGxpc3QgY29udGFpbnMgc3R1cGlkIGlycSdzCiAqIHN1Y2ggYXMgMCB0aG5nYXMgd2lsbCBub3Qgd29yaykKICovCgpzdGF0aWMgdm9pZCBpcnFfaW5pdCh2b2lkKQp7CgkvKiBkaXNhYmxlIGdsb2JhbCBpbnRlcnJ1cHQgbW9kZSAqLwoJc2M1MjBfbW1jci0+cGljaWNyID0gMHg0MDsKCgkvKiBzZXQgYWxsIGlycXMgdG8gZWRnZSAqLwoJc2M1MjBfbW1jci0+cGljX21vZGVbMF0gPSAweDAwOwoJc2M1MjBfbW1jci0+cGljX21vZGVbMV0gPSAweDAwOwoJc2M1MjBfbW1jci0+cGljX21vZGVbMl0gPSAweDAwOwoKCS8qIGFjdGl2ZSBsb3cgcG9sYXJpdHkgb24gUElDIGludGVycnVwdCBwaW5zLAoJICogIGFjdGl2ZSBoaWdoIHBvbGFyaXR5IG9uIGFsbCBvdGhlciBpcnEgcGlucyAqLwoJc2M1MjBfbW1jci0+aW50cGlucG9sID0gMHgwMDAwOwoKCS8qIHNldCBpcnEgbnVtYmVyIG1hcHBpbmcgKi8KCXNjNTIwX21tY3ItPmdwX3Rtcl9pbnRfbWFwWzBdID0gU0M1MjBfSVJRX0RJU0FCTEVEOwkvKiBkaXNhYmxlIEdQIHRpbWVyIDAgSU5UICovCglzYzUyMF9tbWNyLT5ncF90bXJfaW50X21hcFsxXSA9IFNDNTIwX0lSUV9ESVNBQkxFRDsJLyogZGlzYWJsZSBHUCB0aW1lciAxIElOVCAqLwoJc2M1MjBfbW1jci0+Z3BfdG1yX2ludF9tYXBbMl0gPSBTQzUyMF9JUlFfRElTQUJMRUQ7CS8qIGRpc2FibGUgR1AgdGltZXIgMiBJTlQgKi8KCXNjNTIwX21tY3ItPnBpdF9pbnRfbWFwWzBdID0gU0M1MjBfSVJRMDsJCS8qIFNldCBQSVQgdGltZXIgMCBJTlQgdG8gSVJRMCAqLwoJc2M1MjBfbW1jci0+cGl0X2ludF9tYXBbMV0gPSBTQzUyMF9JUlFfRElTQUJMRUQ7CS8qIGRpc2FibGUgUElUIHRpbWVyIDEgSU5UICovCglzYzUyMF9tbWNyLT5waXRfaW50X21hcFsyXSA9IFNDNTIwX0lSUV9ESVNBQkxFRDsJLyogZGlzYWJsZSBQSVQgdGltZXIgMiBJTlQgKi8KCXNjNTIwX21tY3ItPnBjaV9pbnRfbWFwWzBdID0gU0M1MjBfSVJRX0RJU0FCTEVEOwkvKiBkaXNhYmxlIFBDSSBJTlQgQSAqLwoJc2M1MjBfbW1jci0+cGNpX2ludF9tYXBbMV0gPSBTQzUyMF9JUlFfRElTQUJMRUQ7CS8qIGRpc2FibGUgUENJIElOVCBCICovCglzYzUyMF9tbWNyLT5wY2lfaW50X21hcFsyXSA9IFNDNTIwX0lSUV9ESVNBQkxFRDsJLyogZGlzYWJsZSBQQ0kgSU5UIEMgKi8KCXNjNTIwX21tY3ItPnBjaV9pbnRfbWFwWzNdID0gU0M1MjBfSVJRX0RJU0FCTEVEOwkvKiBkaXNhYmxlIFBDSSBJTlQgRCAqLwoJc2M1MjBfbW1jci0+ZG1hYmNpbnRtYXAgPSBTQzUyMF9JUlFfRElTQUJMRUQ7CQkvKiBkaXNhYmxlIERNQSBJTlQgKi8KCXNjNTIwX21tY3ItPnNzaW1hcCA9IFNDNTIwX0lSUV9ESVNBQkxFRDsJCS8qIGRpc2FibGUgU3luY2hyb25pdXMgc2VyaWFsIElOVCAqLwoJc2M1MjBfbW1jci0+d2R0bWFwID0gU0M1MjBfSVJRX0RJU0FCTEVEOwkJLyogZGlzYWJsZSBXYXRjaGRvZyBJTlQgKi8KCXNjNTIwX21tY3ItPnJ0Y21hcCA9IFNDNTIwX0lSUTg7CQkJLyogU2V0IFJUQyBpbnQgdG8gOCAqLwoJc2M1MjBfbW1jci0+d3B2bWFwID0gU0M1MjBfSVJRX0RJU0FCTEVEOwkJLyogZGlzYWJsZSB3cml0ZSBwcm90ZWN0IElOVCAqLwoJc2M1MjBfbW1jci0+aWNlbWFwID0gU0M1MjBfSVJRMTsJCQkvKiBTZXQgSUNFIERlYnVnIFNlcmllbHBvcnQgSU5UIHRvIElSUTEgKi8KCXNjNTIwX21tY3ItPmZlcnJtYXAgPSBTQzUyMF9JUlExMzsgCQkJLyogU2V0IEZQIGVycm9yIElOVCB0byBJUlExMyAqLwoKCWlmIChDT05GSUdfU1lTX1VTRV9TSU9fVUFSVCkgewoJCXNjNTIwX21tY3ItPnVhcnRfaW50X21hcFswXSA9IFNDNTIwX0lSUV9ESVNBQkxFRDsJLyogZGlzYWJsZSBpbnRlcm5hbCBVQVJUMSBJTlQgKi8KCQlzYzUyMF9tbWNyLT51YXJ0X2ludF9tYXBbMV0gPSBTQzUyMF9JUlFfRElTQUJMRUQ7CS8qIGRpc2FibGUgaW50ZXJuYWwgVUFSVDIgSU5UICovCgkJc2M1MjBfbW1jci0+Z3BfaW50X21hcFszXSA9IFNDNTIwX0lSUTM7CQkvKiBTZXQgR1BJUlEzIChJU0EgSVJRMykgdG8gSVJRMyAqLwoJCXNjNTIwX21tY3ItPmdwX2ludF9tYXBbNF0gPSBTQzUyMF9JUlE0OwkJLyogU2V0IEdQSVJRNCAoSVNBIElSUTQpIHRvIElSUTQgKi8KCX0gZWxzZSB7CgkJc2M1MjBfbW1jci0+dWFydF9pbnRfbWFwWzBdID0gU0M1MjBfSVJRNDsJCS8qIFNldCBpbnRlcm5hbCBVQVJUMiBJTlQgdG8gSVJRNCAqLwoJCXNjNTIwX21tY3ItPnVhcnRfaW50X21hcFsxXSA9IFNDNTIwX0lSUTM7CQkvKiBTZXQgaW50ZXJuYWwgVUFSVDIgSU5UIHRvIElSUTMgKi8KCQlzYzUyMF9tbWNyLT5ncF9pbnRfbWFwWzNdID0gU0M1MjBfSVJRX0RJU0FCTEVEOwkvKiBkaXNhYmxlIEdQSVJRMyAoSVNBIElSUTMpICovCgkJc2M1MjBfbW1jci0+Z3BfaW50X21hcFs0XSA9IFNDNTIwX0lSUV9ESVNBQkxFRDsJLyogZGlzYWJsZSBHUElSUTQgKElTQSBJUlE0KSAqLwoJfQoKCXNjNTIwX21tY3ItPmdwX2ludF9tYXBbMV0gPSBTQzUyMF9JUlExOwkJCS8qIFNldCBHUElSUTEgKFNJTyBJUlExKSB0byBJUlExICovCglzYzUyMF9tbWNyLT5ncF9pbnRfbWFwWzVdID0gU0M1MjBfSVJRNTsJCQkvKiBTZXQgR1BJUlE1IChJU0EgSVJRNSkgdG8gSVJRNSAqLwoJc2M1MjBfbW1jci0+Z3BfaW50X21hcFs2XSA9IFNDNTIwX0lSUTY7CQkJLyogU2V0IEdQSVJRNiAoSVNBIElSUTYpIHRvIElSUTYgKi8KCXNjNTIwX21tY3ItPmdwX2ludF9tYXBbN10gPSBTQzUyMF9JUlE3OwkJCS8qIFNldCBHUElSUTcgKElTQSBJUlE3KSB0byBJUlE3ICovCglzYzUyMF9tbWNyLT5ncF9pbnRfbWFwWzhdID0gU0M1MjBfSVJRODsJCQkvKiBTZXQgR1BJUlE4IChTSU8gSVJROCkgdG8gSVJROCAqLwoJc2M1MjBfbW1jci0+Z3BfaW50X21hcFs5XSA9IFNDNTIwX0lSUTk7CQkJLyogU2V0IEdQSVJROSAoSVNBIElSUTIpIHRvIElSUTkgKi8KCXNjNTIwX21tY3ItPmdwX2ludF9tYXBbMF0gPSBTQzUyMF9JUlExMTsJCS8qIFNldCBHUElSUTAgKElTQSBJUlExMSkgdG8gSVJRMTAgKi8KCXNjNTIwX21tY3ItPmdwX2ludF9tYXBbMl0gPSBTQzUyMF9JUlExMjsJCS8qIFNldCBHUElSUTIgKElTQSBJUlExMikgdG8gSVJRMTIgKi8KCXNjNTIwX21tY3ItPmdwX2ludF9tYXBbMTBdID0gU0M1MjBfSVJRMTQ7CQkvKiBTZXQgR1BJUlExMCAoSVNBIElSUTE0KSB0byBJUlExNCAqLwoKCXNjNTIwX21tY3ItPnBjaWhvc3RtYXAgPSAweDExZjsJCQkJLyogTWFwIFBDSSBob3N0YnJpZGdlIElOVCB0byBOTUkgKi8KCXNjNTIwX21tY3ItPmVjY21hcCA9IDB4MTAwOwkJCQkvKiBNYXAgU0RSQU0gRUNDIGZhaWx1cmUgSU5UIHRvIE5NSSAqLwp9CgpzdGF0aWMgdm9pZCBzaWxlbmNlX3VhcnQoaW50IHBvcnQpCnsKCW91dGIoMCwgcG9ydCsxKTsKfQoKdm9pZCBzZXR1cF9hbGlfc2lvKGludCB1YXJ0X3ByaW1hcnkpCnsKCWFsaTUxMnhfaW5pdCgpOwoKCWFsaTUxMnhfc2V0X2ZkYyhBTElfRU5BQkxFRCwgMHgzZjIsIDYsIDApOwoJYWxpNTEyeF9zZXRfcHAoQUxJX0VOQUJMRUQsIDB4Mjc4LCA3LCAzKTsKCWFsaTUxMnhfc2V0X3VhcnQoQUxJX0VOQUJMRUQsIEFMSV9VQVJUMSwgdWFydF9wcmltYXJ5PzB4M2Y4OjB4M2U4LCA0KTsKCWFsaTUxMnhfc2V0X3VhcnQoQUxJX0VOQUJMRUQsIEFMSV9VQVJUMiwgdWFydF9wcmltYXJ5PzB4MmY4OjB4MmU4LCAzKTsKCWFsaTUxMnhfc2V0X3J0YyhBTElfRElTQUJMRUQsIDAsIDApOwoJYWxpNTEyeF9zZXRfa2JjKEFMSV9FTkFCTEVELCAxLCAxMik7CglhbGk1MTJ4X3NldF9jaW8oQUxJX0VOQUJMRUQpOwoKCS8qIElyRGEgcGlucyAqLwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMTIsIDEsIDAsIDApOwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMTMsIDEsIDAsIDApOwoKCS8qIFNTSSBjaGlwIHNlbGVjdCBwaW5zICovCglhbGk1MTJ4X2Npb19mdW5jdGlvbigxNCwgMCwgMCwgMCk7ICAvKiBTU0lfQ1MgKi8KCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDE1LCAwLCAwLCAwKTsgIC8qIFNTSV9NViAqLwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMTYsIDAsIDAsIDApOyAgLyogU1NJX1NQSSMgKi8KCgkvKiBCb2FyZCBSRVYgcGlucyAqLwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMjAsIDAsIDAsIDEpOwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMjEsIDAsIDAsIDEpOwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMjIsIDAsIDAsIDEpOwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMjMsIDAsIDAsIDEpOwp9CgoKLyogc2V0IHVwIHRoZSBJU0EgYnVzIHRpbWluZyBhbmQgc3lzdGVtIGFkZHJlc3MgbWFwcGluZ3MgKi8Kc3RhdGljIHZvaWQgYnVzX2luaXQodm9pZCkKewoKCS8qIHNldCB1cCB0aGUgR1AgSU8gcGlucyAqLwoJc2M1MjBfbW1jci0+cGlvcGZzMzFfMTYgPSAweGY3ZmY7CS8qIHNldCB0aGUgR1BJTyBwaW4gZnVuY3Rpb24gMzEtMTYgcmVnICovCglzYzUyMF9tbWNyLT5waW9wZnMxNV8wID0gMHhmZmZmOwkvKiBzZXQgdGhlIEdQSU8gcGluIGZ1bmN0aW9uIDE1LTAgcmVnICovCglzYzUyMF9tbWNyLT5jc3BmcyA9IDB4Zjg7CQkvKiBzZXQgdGhlIENTIHBpbiBmdW5jdGlvbiAgcmVnICovCglzYzUyMF9tbWNyLT5jbGtzZWwgPSAweDcwOwoKCXNjNTIwX21tY3ItPmdwY3NydCA9IDE7ICAgCQkvKiBzZXQgdGhlIEdQIENTIG9mZnNldCAqLwoJc2M1MjBfbW1jci0+Z3Bjc3B3ID0gMzsgICAJCS8qIHNldCB0aGUgR1AgQ1MgcHVsc2Ugd2lkdGggKi8KCXNjNTIwX21tY3ItPmdwY3NvZmYgPSAxOyAgCQkvKiBzZXQgdGhlIEdQIENTIG9mZnNldCAqLwoJc2M1MjBfbW1jci0+Z3ByZHcgPSAzOyAgICAJCS8qIHNldCB0aGUgUkQgcHVsc2Ugd2lkdGggKi8KCXNjNTIwX21tY3ItPmdwcmRvZmYgPSAxOyAgCQkvKiBzZXQgdGhlIEdQIFJEIG9mZnNldCAqLwoJc2M1MjBfbW1jci0+Z3B3cncgPSAzOyAgIAkJIC8qIHNldCB0aGUgR1AgV1IgcHVsc2Ugd2lkdGggKi8KCXNjNTIwX21tY3ItPmdwd3JvZmYgPSAxOyAJCSAvKiBzZXQgdGhlIEdQIFdSIG9mZnNldCAqLwoKCXNjNTIwX21tY3ItPmJvb3Rjc2N0bCA9IDB4MTgyMzsJCS8qIHNldCB1cCB0aW1pbmcgb2YgQk9PVENTICovCglzYzUyMF9tbWNyLT5yb21jczFjdGwgPSAweDE4MjM7CQkvKiBzZXQgdXAgdGltaW5nIG9mIFJPTUNTMSAqLwoJc2M1MjBfbW1jci0+cm9tY3MyY3RsID0gMHgxODIzOwkJLyogc2V0IHVwIHRpbWluZyBvZiBST01DUzIgKi8KCgkvKiBhZGp1c3QgdGhlIG1lbW9yeSBtYXA6CgkgKiBieSBkZWZhdWx0IHRoZSBmaXJzdCAyNTZNQiAoMHgwMDAwMDAwMCAtIDB4MGZmZmZmZmYpIGlzIG1hcHBlZCB0byBTRFJBTQoJICogYW5kIDI1Nk1CIHRvIDFHLTEyOGsgICgweDEwMDAwMDAgLSAweDM3ZmZmZmZmKSBpcyBtYXBwZWQgdG8gUENJIG1taW8KCSAqIHdlIG5lZWQgdG8gbWFwIDFHLTEyOGsgLSAxRyAoMHgzODAwMDAwMCAtIDB4M2ZmZmZmZmYpIHRvIENTMSAqLwoKCgkvKiBTUkFNID0gR1BDUzMgMTI4ayBAIGQwMDAwLWVmZmZmKi8KCXNjNTIwX21tY3ItPnBhclsyXSA9IDB4NGUwMDQwMGQ7CgoJLyogSURFMCA9IEdQQ1M2IDFmMC0xZjcgKi8KCXNjNTIwX21tY3ItPnBhclszXSA9IDB4MzgwODAxZjA7CgoJLyogSURFMSA9IEdQQ1M3IDNmNiAqLwoJc2M1MjBfbW1jci0+cGFyWzRdID0gMHgzYzAwMDNmNjsKCS8qIGJvb3RjcyAqLwoJc2M1MjBfbW1jci0+cGFyWzEyXSA9IDB4OGJmZmU4MDA7CgkvKiByb21jczIgKi8KCXNjNTIwX21tY3ItPnBhclsxM10gPSAweGNiZmZmMDAwOwoJLyogcm9tY3MxICovCglzYzUyMF9tbWNyLT5wYXJbMTRdID0gMHhhYmZmZjgwMDsKCS8qIDY4MCBMRURTICovCglzYzUyMF9tbWNyLT5wYXJbMTVdID0gMHgzMDAwMDY0MDsKCglzYzUyMF9tbWNyLT5hZGRkZWNjdGwgPSAwOwoKCWFzbSAoIndiaW52ZFxuIik7IC8qIEZsdXNoIGNhY2hlLCByZXEuIGFmdGVyIHNldHRpbmcgdGhlIHVuY2hhY2hlZCBhdHRyaWJ1dGUgb25hIFBBUiAqLwoKCWlmIChDT05GSUdfU1lTX1VTRV9TSU9fVUFSVCkgewoJCXNjNTIwX21tY3ItPmFkZGRlY2N0bCA9IHNjNTIwX21tY3ItPmFkZGRlY2N0bCB8IFVBUlQyX0RJUyB8IFVBUlQxX0RJUzsKCQlzZXR1cF9hbGlfc2lvKDEpOwoJfSBlbHNlIHsKCQlzYzUyMF9tbWNyLT5hZGRkZWNjdGwgPSBzYzUyMF9tbWNyLT5hZGRkZWNjdGwgJiB+KFVBUlQyX0RJU3xVQVJUMV9ESVMpOwoJCXNldHVwX2FsaV9zaW8oMCk7CgkJc2lsZW5jZV91YXJ0KDB4M2U4KTsKCQlzaWxlbmNlX3VhcnQoMHgyZTgpOwoJfQoKfQoKLyogR1BDUyB1c2FnZQogKiBHUENTMCAgICAgICBQSU8yNyAoTk1JKQogKiBHUENTMSAgICAgICBST01DUzEKICogR1BDUzIgICAgICAgUk9NQ1MyCiAqIEdQQ1MzICAgICAgIFNSQU1DUyAgICAgICBQQVIyCiAqIEdQQ1M0ICAgICAgIHVudXNlZCAgICAgICBQQVIzCiAqIEdQQ1M1ICAgICAgIHVudXNlZCAgICAgICBQQVI0CiAqIEdQQ1M2ICAgICAgIElERQogKiBHUENTNyAgICAgICBJREUKICovCgoKLyogcGFyIHVzYWdlOgogKiBQQVIwICAgbGVnYWN5X3ZpZGVvCiAqIFBBUjEgICBQQ0kgUk9NIG1hcHBpbmcKICogUEFSMiAgIFNSQU0KICogUEFSMyAgIElERQogKiBQQVI0ICAgSURFCiAqIFBBUjUgICBsZWdhY3lfdmlkZW8KICogUEFSNiAgIGxlZ2FjeV92aWRlbwogKiBQQVI3ICAgbGVnYWN5X3ZpZGVvCiAqIFBBUjggICBsZWdhY3lfdmlkZW8KICogUEFSOSAgIGxlZ2FjeV92aWRlbwogKiBQQVIxMCAgbGVnYWN5X3ZpZGVvCiAqIFBBUjExICBJU0FST00KICogUEFSMTIgIEJPT1RDUwogKiBQQVIxMyAgUk9NQ1MxCiAqIFBBUjE0ICBST01DUzIKICogUEFSMTUgIFBvcnQgMHg2ODAgTEVEIGRpc3BsYXkKICovCgovKgogKiBNaXNjZWxhbmVvdXMgcGxhdGZvcm0gZGVwZW5kZW50IGluaXRpYWxpc2F0aW9ucwogKi8KCmludCBib2FyZF9pbml0KHZvaWQpCnsKCWluaXRfc2M1MjAoKTsKCWJ1c19pbml0KCk7CglpcnFfaW5pdCgpOwoKCS8qIG1heCBkcml2ZSBjdXJyZW50IG9uIFNEUkFNICovCglzYzUyMF9tbWNyLT5kc2N0bCA9IDB4MDEwMDsKCgkvKiBlbnRlciBkZWJ1ZyBtb2RlIGFmdGVyIG5leHQgcmVzZXQgKG9ubHkgaWYganVtcGVyIGlzIGFsc28gc2V0KSAqLwoJc2M1MjBfbW1jci0+cmVzY2ZnID0gMHgwODsKCS8qIGNvbmZpZ3VyZSB0aGUgc29mdHdhcmUgdGltZXIgdG8gMzMuMzMzTUh6ICovCglzYzUyMF9tbWNyLT5zd3RtcmNmZyA9IDA7CglnZC0+YnVzX2NsayA9IDMzMzMzMDAwOwoKCXJldHVybiAwOwp9CgppbnQgZHJhbV9pbml0KHZvaWQpCnsKCWluaXRfc2M1MjBfZHJhbSgpOwoJcmV0dXJuIDA7Cn0KCnZvaWQgc2hvd19ib290X3Byb2dyZXNzKGludCB2YWwpCnsKCWlmICh2YWwgPCAtMzIpIHZhbCA9IC0xOyAgLyogbGV0IHRoaW5ncyBjb21wYXRpYmxlICovCglvdXRiKHZhbCYweGZmLCAweDgwKTsKCW91dGIoKHZhbCYweGZmMDApPj44LCAweDY4MCk7Cn0KCgppbnQgbGFzdF9zdGFnZV9pbml0KHZvaWQpCnsKCWludCBtaW5vcjsKCWludCBtYWpvcjsKCgltYWpvciA9IG1pbm9yID0gMDsKCW1ham9yIHw9IGFsaTUxMnhfY2lvX2luKDIzKT8yOjA7CgltYWpvciB8PSBhbGk1MTJ4X2Npb19pbigyMik/MTowOwoJbWlub3IgfD0gYWxpNTEyeF9jaW9faW4oMjEpPzI6MDsKCW1pbm9yIHw9IGFsaTUxMnhfY2lvX2luKDIwKT8xOjA7CgoJcHJpbnRmKCJBTUQgU0M1MjAgQ0RQIHJldmlzaW9uICVkLiVkXG4iLCBtYWpvciwgbWlub3IpOwoKCXJldHVybiAwOwp9CgoKdm9pZCBzc2lfY2hpcF9zZWxlY3QoaW50IGRldikKewoKCS8qIFNwdW5rIGJvYXJkOiBTUEkgRUVQUk9NIGlzIGFjdGl2ZS1sb3csIE1XIEVFUFJPTSBhbmQgQVVYIGFyZSBhY3RpdmUgaGlnaCAqLwoJc3dpdGNoIChkZXYpIHsKCWNhc2UgMTogLyogU1BJIEVFUFJPTSAqLwoJCWFsaTUxMnhfY2lvX291dCgxNiwgMCk7CgkJYnJlYWs7CgoJY2FzZSAyOiAvKiBNVyBFRVBST00gKi8KCQlhbGk1MTJ4X2Npb19vdXQoMTUsIDEpOwoJCWJyZWFrOwoKCWNhc2UgMzogLyogQVVYICovCgkJYWxpNTEyeF9jaW9fb3V0KDE0LCAxKTsKCQlicmVhazsKCgljYXNlIDA6CgkJYWxpNTEyeF9jaW9fb3V0KDE2LCAxKTsKCQlhbGk1MTJ4X2Npb19vdXQoMTUsIDApOwoJCWFsaTUxMnhfY2lvX291dCgxNCwgMCk7CgkJYnJlYWs7CgoJZGVmYXVsdDoKCQlwcmludGYoIklsbGVnYWwgU1NJIGRldmljZSByZXF1ZXN0ZWQ6ICVkXG4iLCBkZXYpOwoJfQp9Cgp2b2lkIHNwaV9lZXByb21fcHJvYmUoaW50IHgpCnsKfQoKaW50IHNwaV9lZXByb21fcmVhZChpbnQgeCwgaW50IG9mZnNldCwgdWNoYXIgKmJ1ZmZlciwgaW50IGxlbikKewogICAgICAgcmV0dXJuIDA7Cn0KCmludCBzcGlfZWVwcm9tX3dyaXRlKGludCB4LCBpbnQgb2Zmc2V0LCB1Y2hhciAqYnVmZmVyLCBpbnQgbGVuKQp7CiAgICAgICByZXR1cm4gMDsKfQoKdm9pZCBzcGlfaW5pdF9mKHZvaWQpCnsKI2lmZGVmIENPTkZJR19TWVNfU0M1MjBfQ0RQX1VTRV9TUEkKCXNwaV9lZXByb21fcHJvYmUoMSk7CiNlbmRpZgojaWZkZWYgQ09ORklHX1NZU19TQzUyMF9DRFBfVVNFX01XCgltd19lZXByb21fcHJvYmUoMik7CiNlbmRpZgp9Cgpzc2l6ZV90IHNwaV9yZWFkKHVjaGFyICphZGRyLCBpbnQgYWxlbiwgdWNoYXIgKmJ1ZmZlciwgaW50IGxlbikKewoJaW50IG9mZnNldDsKCWludCBpOwoJc3NpemVfdCByZXM7CgoJb2Zmc2V0ID0gMDsKCWZvciAoaT0wO2k8YWxlbjtpKyspIHsKCQlvZmZzZXQgPDw9IDg7CgkJb2Zmc2V0IHw9IGFkZHJbaV07Cgl9CgojaWZkZWYgQ09ORklHX1NZU19TQzUyMF9DRFBfVVNFX1NQSQoJcmVzID0gc3BpX2VlcHJvbV9yZWFkKDEsIG9mZnNldCwgYnVmZmVyLCBsZW4pOwojZW5kaWYKI2lmZGVmIENPTkZJR19TWVNfU0M1MjBfQ0RQX1VTRV9NVwoJcmVzID0gbXdfZWVwcm9tX3JlYWQoMiwgb2Zmc2V0LCBidWZmZXIsIGxlbik7CiNlbmRpZgojaWYgIWRlZmluZWQoQ09ORklHX1NZU19TQzUyMF9DRFBfVVNFX1NQSSkgJiYgIWRlZmluZWQoQ09ORklHX1NZU19TQzUyMF9DRFBfVVNFX01XKQoJcmVzID0gMDsKI2VuZGlmCglyZXR1cm4gcmVzOwp9Cgpzc2l6ZV90IHNwaV93cml0ZSh1Y2hhciAqYWRkciwgaW50IGFsZW4sIHVjaGFyICpidWZmZXIsIGludCBsZW4pCnsKCWludCBvZmZzZXQ7CglpbnQgaTsKCXNzaXplX3QgcmVzOwoKCW9mZnNldCA9IDA7Cglmb3IgKGk9MDtpPGFsZW47aSsrKSB7CgkJb2Zmc2V0IDw8PSA4OwoJCW9mZnNldCB8PSBhZGRyW2ldOwoJfQoKI2lmZGVmIENPTkZJR19TWVNfU0M1MjBfQ0RQX1VTRV9TUEkKCXJlcyA9IHNwaV9lZXByb21fd3JpdGUoMSwgb2Zmc2V0LCBidWZmZXIsIGxlbik7CiNlbmRpZgojaWZkZWYgQ09ORklHX1NZU19TQzUyMF9DRFBfVVNFX01XCglyZXMgPSBtd19lZXByb21fd3JpdGUoMiwgb2Zmc2V0LCBidWZmZXIsIGxlbik7CiNlbmRpZgojaWYgIWRlZmluZWQoQ09ORklHX1NZU19TQzUyMF9DRFBfVVNFX1NQSSkgJiYgIWRlZmluZWQoQ09ORklHX1NZU19TQzUyMF9DRFBfVVNFX01XKQoJcmVzID0gMDsKI2VuZGlmCglyZXR1cm4gcmVzOwp9CgppbnQgYm9hcmRfZXRoX2luaXQoYmRfdCAqYmlzKQp7CglyZXR1cm4gcGNpX2V0aF9pbml0KGJpcyk7Cn0K