I2lmbmRlZiBTTk1QX1NZU1RFTV9ICiNkZWZpbmUgU05NUF9TWVNURU1fSAoKI2lmbmRlZiBORVRfU05NUF9DT05GSUdfSAojZXJyb3IgIlBsZWFzZSBpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4gYmVmb3JlIHRoaXMgZmlsZSIKI2VuZGlmCgojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICAgICAgICAgICJDIiB7CiNlbmRpZgoKLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0cy4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIENvcHlyaWdodCAxOTkzIGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CgogICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAoKUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCmRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdApib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4Kc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBDTVUgbm90IGJlCnVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQpzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCgpDTVUgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORwpBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKQ01VIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgpBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCldIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUwpTT0ZUV0FSRS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKgogKiBwb3J0aW9ucyBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KCgogICAgLyoKICAgICAqIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGRhZW1vbi4gV2lsbCBmb3JrIGFuZCBjYWxsIHNldHNpZCgpLgogICAgICoKICAgICAqIFJldHVybnM6IC0xIDogZm9yayBmYWlsZWQKICAgICAqICAgICAgICAgICAwIDogTm8gZXJyb3JzCiAgICAgKi8KICAgIGludCBuZXRzbm1wX2RhZW1vbml6ZShpbnQgcXVpdF9pbW1lZGlhdGVseSwgaW50IHN0ZGVycl9sb2cpOwoKICAgIC8qCiAgICAgKiBEZWZpbml0aW9ucyBmb3IgdGhlIHN5c3RlbSBkZXBlbmRlbnQgbGlicmFyeSBmaWxlCiAgICAgKi8KI2lmbmRlZiBNU1ZDX1BFUkwKI2lmZGVmIFdJTjMyCgojaWZuZGVmIEhBVkVfRElSRU5UX0ggLyogTWluZ0dXIGhhcyBkaXJlbnQuaCBidXQgYWxzbyBkZWZpbmVzIFdJTjMyICovCiAgICAvKgogICAgICogc3RydWN0dXJlIG9mIGEgZGlyZWN0b3J5IGVudHJ5IAogICAgICovCiAgICB0eXBlZGVmIHN0cnVjdCBkaXJlY3QgewogICAgICAgIGxvbmcgICAgICAgICAgICBkX2lubzsgIC8qIGlub2RlIG51bWJlciAobm90IHVzZWQgYnkgTVMtRE9TKSAqLwogICAgICAgIGludCAgICAgICAgICAgICBkX25hbWxlbjsgICAgICAgLyogTmFtZSBsZW5ndGggKi8KICAgICAgICBjaGFyICAgICAgICAgICAgZF9uYW1lWzI1N107ICAgIC8qIGZpbGUgbmFtZSAqLwogICAgfSBfRElSRUNUOwoKICAgIC8qCiAgICAgKiBzdHJ1Y3R1cmUgZm9yIGRpciBvcGVyYXRpb25zIAogICAgICovCiAgICB0eXBlZGVmIHN0cnVjdCBfZGlyX3N0cnVjIHsKICAgICAgICBjaGFyICAgICAgICAgICAqc3RhcnQ7ICAvKiBTdGFydGluZyBwb3NpdGlvbiAqLwogICAgICAgIGNoYXIgICAgICAgICAgICpjdXJyOyAgIC8qIEN1cnJlbnQgcG9zaXRpb24gKi8KICAgICAgICBsb25nICAgICAgICAgICAgc2l6ZTsgICAvKiBTaXplIG9mIHN0cmluZyB0YWJsZSAqLwogICAgICAgIGxvbmcgICAgICAgICAgICBuZmlsZXM7IC8qIG51bWJlciBpZiBmaWxlbmFtZXMgaW4gdGFibGUgKi8KICAgICAgICBzdHJ1Y3QgZGlyZWN0ICAgZGlyc3RyOyAvKiBEaXJlY3Rvcnkgc3RydWN0dXJlIHRvIHJldHVybiAqLwogICAgfSBESVI7CgogICAgRElSICAgICAgICAgICAgKm9wZW5kaXIoY29uc3QgY2hhciAqZmlsZW5hbWUpOwogICAgc3RydWN0IGRpcmVjdCAgKnJlYWRkaXIoRElSICogZGlycCk7CiAgICBpbnQgICAgICAgICAgICAgY2xvc2VkaXIoRElSICogZGlycCk7CiNlbmRpZiAvKiBIQVZFX0RJUkVOVF9IICovCgojaWZuZGVmIEhBVkVfR0VUVElNRU9GREFZCiAgICBpbnQgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICosIHN0cnVjdCB0aW1lem9uZSAqdHopOwojZW5kaWYKI2lmbmRlZiBIQVZFX1NUUk5DQVNFQ01QCiAgICBpbnQgICAgICAgICAgICAgc3RyY2FzZWNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpOwogICAgaW50ICAgICAgICAgICAgIHN0cm5jYXNlY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgc2l6ZV90IG4pOwojZW5kaWYKCiAgICBjaGFyICAgICAgICAgICAqd2luc29ja19zdGFydHVwKHZvaWQpOwogICAgdm9pZCAgICAgICAgICAgIHdpbnNvY2tfY2xlYW51cCh2b2lkKTsKCiNkZWZpbmUgU09DS19TVEFSVFVQIHdpbnNvY2tfc3RhcnR1cCgpCiNkZWZpbmUgU09DS19DTEVBTlVQIHdpbnNvY2tfY2xlYW51cCgpCgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICFXSU4zMiAqLwoKI2RlZmluZSBTT0NLX1NUQVJUVVAKI2RlZmluZSBTT0NLX0NMRUFOVVAKCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV0lOMzIgKi8KI2VuZGlmCQkJCS8qIE1TVkNfUEVSTCAqLwoKI2luY2x1ZGUgPG5ldC1zbm1wL3R5cGVzLmg+ICAgICAvKiBGb3IgZGVmaW5pdGlvbiBvZiBpbl9hZGRyX3QgKi8KCiAgICBpbl9hZGRyX3QgICAgICAgZ2V0X215YWRkcih2b2lkKTsKICAgIGxvbmcgICAgICAgICAgICBnZXRfdXB0aW1lKHZvaWQpOwoKI2lmbmRlZiBIQVZFX1NUUkRVUAogICAgY2hhciAgICAgICAgICAgKnN0cmR1cChjb25zdCBjaGFyICopOwojZW5kaWYKI2lmbmRlZiBIQVZFX1NFVEVOVgogICAgaW50ICAgICAgICAgICAgIHNldGVudihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KTsKI2VuZGlmCgogICAgaW50ICAgICAgICAgICAgIGNhbGN1bGF0ZV90aW1lX2RpZmYoc3RydWN0IHRpbWV2YWwgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsICopOwogICAgdV9pbnQgICAgICAgICAgIGNhbGN1bGF0ZV9zZWN0aW1lX2RpZmYoc3RydWN0IHRpbWV2YWwgKm5vdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsICp0aGVuKTsKCiNpZm5kZWYgSEFWRV9TVFJDQVNFU1RSCiAgICBjaGFyICAgICAgICAgICAqc3RyY2FzZXN0cihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CiNlbmRpZgojaWZuZGVmIEhBVkVfU1RSVE9MCiAgICBsb25nICAgICAgICAgICAgc3RydG9sKGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgaW50KTsKI2VuZGlmCiNpZm5kZWYgSEFWRV9TVFJUT1VMCiAgICB1bnNpZ25lZCBsb25nICAgc3RydG91bChjb25zdCBjaGFyICosIGNoYXIgKiosIGludCk7CiNlbmRpZgojaWZuZGVmIEhBVkVfU1RSVE9LX1IKICAgIGNoYXIgICAgICAgICAgICpzdHJ0b2tfcihjaGFyICosIGNvbnN0IGNoYXIgKiwgY2hhciAqKik7CiNlbmRpZgojaWZuZGVmIEhBVkVfU05QUklOVEYKICAgIGludCAgICAgICAgICAgICBzbnByaW50ZihjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLCAuLi4pOwojZW5kaWYKCiAgICBpbnQgICAgICAgICAgICAgbWtkaXJoaWVyKGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBtb2RlX3QgbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNraXBsYXN0KTsKICAgIGNvbnN0IGNoYXIgICAgICpuZXRzbm1wX21rdGVtcCh2b2lkKTsKI2lmbmRlZiBIQVZFX1NUUkxDUFkKICAgIHNpemVfdCAgICAgICAgICAgIHN0cmxjcHkoY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CiNlbmRpZgojaWZuZGVmIEhBVkVfU1RSTENBVAogICAgTkVUU05NUF9JTVBPUlQKICAgIHNpemVfdCAgICAgICAgICAgIHN0cmxjYXQoY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CiNlbmRpZgoKICAgIGludCAgICAgICAgICAgICBuZXRzbm1wX29zX3ByZW1hdGNoKGNvbnN0IGNoYXIgKm9zcG1uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqb3NwbXJlbHByZWZpeCk7CiAgICBpbnQgICAgICAgICAgICAgbmV0c25tcF9vc19rZXJuZWxfd2lkdGgodm9pZCk7CgojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTTk1QX1NZU1RFTV9IICovCg==