I2lmbmRlZiBTTk1QX1NZU1RFTV9ICiNkZWZpbmUgU05NUF9TWVNURU1fSAoKI2lmbmRlZiBORVRfU05NUF9DT05GSUdfSAojZXJyb3IgIlBsZWFzZSBpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4gYmVmb3JlIHRoaXMgZmlsZSIKI2VuZGlmCgojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICAgICAgICAgICJDIiB7CiNlbmRpZgoKLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0cy4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIENvcHlyaWdodCAxOTkzIGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CgogICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAoKUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCmRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdApib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4Kc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBDTVUgbm90IGJlCnVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQpzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCgpDTVUgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORwpBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKQ01VIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgpBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCldIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUwpTT0ZUV0FSRS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKgogKiBwb3J0aW9ucyBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KCgogICAgLyoKICAgICAqIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGRhZW1vbi4gV2lsbCBmb3JrIGFuZCBjYWxsIHNldHNpZCgpLgogICAgICoKICAgICAqIFJldHVybnM6IC0xIDogZm9yayBmYWlsZWQKICAgICAqICAgICAgICAgICAwIDogTm8gZXJyb3JzCiAgICAgKi8KICAgIGludCBuZXRzbm1wX2RhZW1vbml6ZShpbnQgcXVpdF9pbW1lZGlhdGVseSwgaW50IHN0ZGVycl9sb2cpOwoKICAgIC8qCiAgICAgKiBEZWZpbml0aW9ucyBmb3IgdGhlIHN5c3RlbSBkZXBlbmRlbnQgbGlicmFyeSBmaWxlCiAgICAgKi8KI2lmbmRlZiBNU1ZDX1BFUkwKI2lmZGVmIFdJTjMyCgojaWZuZGVmIEhBVkVfRElSRU5UX0ggLyogTWluZ0dXIGhhcyBkaXJlbnQuaCBidXQgYWxzbyBkZWZpbmVzIFdJTjMyICovCiAgICAvKgogICAgICogc3RydWN0dXJlIG9mIGEgZGlyZWN0b3J5IGVudHJ5IAogICAgICovCiAgICB0eXBlZGVmIHN0cnVjdCBkaXJlY3QgewogICAgICAgIGxvbmcgICAgICAgICAgICBkX2lubzsgIC8qIGlub2RlIG51bWJlciAobm90IHVzZWQgYnkgTVMtRE9TKSAqLwogICAgICAgIGludCAgICAgICAgICAgICBkX25hbWxlbjsgICAgICAgLyogTmFtZSBsZW5ndGggKi8KICAgICAgICBjaGFyICAgICAgICAgICAgZF9uYW1lWzI1N107ICAgIC8qIGZpbGUgbmFtZSAqLwogICAgfSBfRElSRUNUOwoKICAgIC8qCiAgICAgKiBzdHJ1Y3R1cmUgZm9yIGRpciBvcGVyYXRpb25zIAogICAgICovCiAgICB0eXBlZGVmIHN0cnVjdCBfZGlyX3N0cnVjIHsKICAgICAgICBjaGFyICAgICAgICAgICAqc3RhcnQ7ICAvKiBTdGFydGluZyBwb3NpdGlvbiAqLwogICAgICAgIGNoYXIgICAgICAgICAgICpjdXJyOyAgIC8qIEN1cnJlbnQgcG9zaXRpb24gKi8KICAgICAgICBsb25nICAgICAgICAgICAgc2l6ZTsgICAvKiBTaXplIG9mIHN0cmluZyB0YWJsZSAqLwogICAgICAgIGxvbmcgICAgICAgICAgICBuZmlsZXM7IC8qIG51bWJlciBpZiBmaWxlbmFtZXMgaW4gdGFibGUgKi8KICAgICAgICBzdHJ1Y3QgZGlyZWN0ICAgZGlyc3RyOyAvKiBEaXJlY3Rvcnkgc3RydWN0dXJlIHRvIHJldHVybiAqLwogICAgfSBESVI7CgogICAgRElSICAgICAgICAgICAgKm9wZW5kaXIoY29uc3QgY2hhciAqZmlsZW5hbWUpOwogICAgc3RydWN0IGRpcmVjdCAgKnJlYWRkaXIoRElSICogZGlycCk7CiAgICBpbnQgICAgICAgICAgICAgY2xvc2VkaXIoRElSICogZGlycCk7CiNlbmRpZiAvKiBIQVZFX0RJUkVOVF9IICovCgojaWZuZGVmIEhBVkVfR0VUVElNRU9GREFZCiAgICBpbnQgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICosIHN0cnVjdCB0aW1lem9uZSAqdHopOwojZW5kaWYKI2lmbmRlZiBIQVZFX1NUUkNBU0VDTVAKICAgIGludCAgICAgICAgICAgICBzdHJjYXNlY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMik7CiNlbmRpZgojaWZuZGVmIEhBVkVfU1RSTkNBU0VDTVAKICAgIGludCAgICAgICAgICAgICBzdHJuY2FzZWNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIHNpemVfdCBuKTsKI2VuZGlmCgogICAgY2hhciAgICAgICAgICAgKndpbnNvY2tfc3RhcnR1cCh2b2lkKTsKICAgIHZvaWQgICAgICAgICAgICB3aW5zb2NrX2NsZWFudXAodm9pZCk7CgojZGVmaW5lIFNPQ0tfU1RBUlRVUCB3aW5zb2NrX3N0YXJ0dXAoKQojZGVmaW5lIFNPQ0tfQ0xFQU5VUCB3aW5zb2NrX2NsZWFudXAoKQoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhV0lOMzIgKi8KCiNkZWZpbmUgU09DS19TVEFSVFVQCiNkZWZpbmUgU09DS19DTEVBTlVQCgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdJTjMyICovCiNlbmRpZgkJCQkvKiBNU1ZDX1BFUkwgKi8KCiNpbmNsdWRlIDxuZXQtc25tcC90eXBlcy5oPiAgICAgLyogRm9yIGRlZmluaXRpb24gb2YgaW5fYWRkcl90ICovCgogICAgaW5fYWRkcl90ICAgICAgIGdldF9teWFkZHIodm9pZCk7CiAgICBsb25nICAgICAgICAgICAgZ2V0X3VwdGltZSh2b2lkKTsKCiNpZm5kZWYgSEFWRV9TVFJEVVAKICAgIGNoYXIgICAgICAgICAgICpzdHJkdXAoY29uc3QgY2hhciAqKTsKI2VuZGlmCiNpZm5kZWYgSEFWRV9TRVRFTlYKICAgIGludCAgICAgICAgICAgICBzZXRlbnYoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCk7CiNlbmRpZgoKICAgIGludCAgICAgICAgICAgICBjYWxjdWxhdGVfdGltZV9kaWZmKHN0cnVjdCB0aW1ldmFsICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCAqKTsKICAgIHVfaW50ICAgICAgICAgICBjYWxjdWxhdGVfc2VjdGltZV9kaWZmKHN0cnVjdCB0aW1ldmFsICpub3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCAqdGhlbik7CgojaWZuZGVmIEhBVkVfU1RSQ0FTRVNUUgogICAgY2hhciAgICAgICAgICAgKnN0cmNhc2VzdHIoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwojZW5kaWYKI2lmbmRlZiBIQVZFX1NUUlRPTAogICAgbG9uZyAgICAgICAgICAgIHN0cnRvbChjb25zdCBjaGFyICosIGNoYXIgKiosIGludCk7CiNlbmRpZgojaWZuZGVmIEhBVkVfU1RSVE9VTAogICAgdW5zaWduZWQgbG9uZyAgIHN0cnRvdWwoY29uc3QgY2hhciAqLCBjaGFyICoqLCBpbnQpOwojZW5kaWYKI2lmbmRlZiBIQVZFX1NUUlRPS19SCiAgICBjaGFyICAgICAgICAgICAqc3RydG9rX3IoY2hhciAqLCBjb25zdCBjaGFyICosIGNoYXIgKiopOwojZW5kaWYKI2lmbmRlZiBIQVZFX1NOUFJJTlRGCiAgICBpbnQgICAgICAgICAgICAgc25wcmludGYoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgLi4uKTsKI2VuZGlmCgogICAgaW50ICAgICAgICAgICAgIG1rZGlyaGllcihjb25zdCBjaGFyICpwYXRobmFtZSwgbW9kZV90IG1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBza2lwbGFzdCk7CiNpZm5kZWYgSEFWRV9TVFJMQ1BZCiAgICBzaXplX3QgICAgICAgICAgICBzdHJsY3B5KGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOwojZW5kaWYKCiAgICBpbnQgICAgICAgICAgICAgbmV0c25tcF9vc19wcmVtYXRjaChjb25zdCBjaGFyICpvc3BtbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm9zcG1yZWxwcmVmaXgpOwoKI2lmZGVmIF9fY3BsdXNwbHVzCn0KI2VuZGlmCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU05NUF9TWVNURU1fSCAqLwo=