LyogcGFyc2VyLmgKICoKICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAogKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKICogZGV0YWlscy4KICovCgojaWZuZGVmIF9fUEFSU0VSX0hfXwojZGVmaW5lIF9fUEFSU0VSX0hfXwoKI2luY2x1ZGUgInVuaWtsb2cuaCIKI2luY2x1ZGUgInRpbXNrbW9kLmgiCiNpbmNsdWRlICJjaGFubmVsLmgiCgp0eXBlZGVmIGVudW0gewoJUEFSU0VSU1RSSU5HX0lOSVRJQVRPUiwKCVBBUlNFUlNUUklOR19UQVJHRVQsCglQQVJTRVJTVFJJTkdfQ09OTkVDVElPTiwKCVBBUlNFUlNUUklOR19OQU1FLAp9IFBBUlNFUl9XSElDSF9TVFJJTkc7Cgp0eXBlZGVmIHN0cnVjdCBQQVJTRVJfQ09OVEVYVF9UYWcgUEFSU0VSX0NPTlRFWFQ7CgpQQVJTRVJfQ09OVEVYVCAqcGFyc2VyX2luaXQoVTY0IGFkZHIsIFUzMiBieXRlcywgQk9PTCBpc0xvY2FsLCBCT09MICp0cnlBZ2Fpbik7ClBBUlNFUl9DT05URVhUICpwYXJzZXJfaW5pdF9ieXRlU3RyZWFtKFU2NCBhZGRyLCBVMzIgYnl0ZXMsIEJPT0wgaXNMb2NhbCwKCQkJCSAgICAgICBCT09MICp0cnlBZ2Fpbik7CnZvaWQgcGFyc2VyX3BhcmFtX3N0YXJ0KFBBUlNFUl9DT05URVhUICpjdHgsIFBBUlNFUl9XSElDSF9TVFJJTkcgd2hpY2hfc3RyaW5nKTsKdm9pZCAqcGFyc2VyX3BhcmFtX2dldChQQVJTRVJfQ09OVEVYVCAqY3R4LCBjaGFyICpuYW0sIGludCBuYW1lc2l6ZSk7CnZvaWQgKnBhcnNlcl9zdHJpbmdfZ2V0KFBBUlNFUl9DT05URVhUICpjdHgpOwpHVUlEIHBhcnNlcl9pZF9nZXQoUEFSU0VSX0NPTlRFWFQgKmN0eCk7CmNoYXIgKnBhcnNlcl9zaW1wbGVTdHJpbmdfZ2V0KFBBUlNFUl9DT05URVhUICpjdHgpOwp2b2lkICpwYXJzZXJfYnl0ZVN0cmVhbV9nZXQoUEFSU0VSX0NPTlRFWFQgKmN0eCwgdWxvbmcgKm5ieXRlcyk7CnZvaWQgcGFyc2VyX2RvbmUoUEFSU0VSX0NPTlRFWFQgKmN0eCk7CgojZW5kaWYK