LyogbWVtcmVnaW9uLmgKICoKICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAogKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKICogZGV0YWlscy4KICovCgojaWZuZGVmIF9fTUVNUkVHSU9OX0hfXwojZGVmaW5lIF9fTUVNUkVHSU9OX0hfXwoKI2luY2x1ZGUgInRpbXNrbW9kLmgiCgovKiBNRU1SRUdJT04gaXMgYW4gb3BhcXVlIHN0cnVjdHVyZSB0byB1c2Vycy4KICogRmllbGRzIGFyZSBkZWNsYXJlZCBvbmx5IGluIHRoZSBpbXBsZW1lbnRhdGlvbiAuYyBmaWxlcy4KICovCnR5cGVkZWYgc3RydWN0IE1FTVJFR0lPTl9UYWcgTUVNUkVHSU9OOwoKTUVNUkVHSU9OICp2aXNvcl9tZW1yZWdpb25fY3JlYXRlKEhPU1RBRERSRVNTIHBoeXNhZGRyLCB1bG9uZyBuYnl0ZXMpOwpNRU1SRUdJT04gKnZpc29yX21lbXJlZ2lvbl9jcmVhdGVfb3ZlcmxhcHBlZChNRU1SRUdJT04gKnBhcmVudCwKCQkJCQkgICAgIHVsb25nIG9mZnNldCwgdWxvbmcgbmJ5dGVzKTsKaW50IHZpc29yX21lbXJlZ2lvbl9yZXNpemUoTUVNUkVHSU9OICptZW1yZWdpb24sIHVsb25nIG5ld3NpemUpOwppbnQgdmlzb3JfbWVtcmVnaW9uX3JlYWQoTUVNUkVHSU9OICptZW1yZWdpb24sCgkJICAgdWxvbmcgb2Zmc2V0LCB2b2lkICpkZXN0LCB1bG9uZyBuYnl0ZXMpOwppbnQgdmlzb3JfbWVtcmVnaW9uX3dyaXRlKE1FTVJFR0lPTiAqbWVtcmVnaW9uLAoJCQkgIHVsb25nIG9mZnNldCwgdm9pZCAqc3JjLCB1bG9uZyBuYnl0ZXMpOwp2b2lkIHZpc29yX21lbXJlZ2lvbl9kZXN0cm95KE1FTVJFR0lPTiAqbWVtcmVnaW9uKTsKSE9TVEFERFJFU1Mgdmlzb3JfbWVtcmVnaW9uX2dldF9waHlzYWRkcihNRU1SRUdJT04gKm1lbXJlZ2lvbik7CnVsb25nIHZpc29yX21lbXJlZ2lvbl9nZXRfbmJ5dGVzKE1FTVJFR0lPTiAqbWVtcmVnaW9uKTsKdm9pZCBtZW1yZWdpb25fZHVtcChNRU1SRUdJT04gKm1lbXJlZ2lvbiwgY2hhciAqcywKCQkgICAgdWxvbmcgb2ZmLCB1bG9uZyBsZW4sIHN0cnVjdCBzZXFfZmlsZSAqc2VxKTsKdm9pZCAqdmlzb3JfbWVtcmVnaW9uX2dldF9wb2ludGVyKE1FTVJFR0lPTiAqbWVtcmVnaW9uKTsKCiNlbmRpZgo=