LyoKICogQ29weXJpZ2h0IChDKSAyMDAyIEFsZXhhbmRyZSBKdWxsaWFyZAogKiBDb3B5cmlnaHQgKEMpIDIwMDQgVmluY2VudCBC6XJvbgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgpjcHBfcXVvdGUoIiNpZiAhZGVmaW5lZChDT01fTk9fV0lORE9XU19IKSAmJiAhZGVmaW5lZChfX1dJTkVTUkNfXykiKQpjcHBfcXVvdGUoIiNpbmNsdWRlIDx3aW5kb3dzLmg+IikKY3BwX3F1b3RlKCIjaW5jbHVkZSA8b2xlMi5oPiIpCmNwcF9xdW90ZSgiI2VuZGlmIikKCmltcG9ydCAidW5rbnduLmlkbCI7CmltcG9ydCAib2JqaWRsLmlkbCI7CgppbnRlcmZhY2UgSURNT1F1YWxpdHlDb250cm9sOwppbnRlcmZhY2UgSURNT1ZpZGVvT3V0cHV0T3B0aW1pemF0aW9uczsKaW50ZXJmYWNlIElNZWRpYUJ1ZmZlcjsKaW50ZXJmYWNlIElNZWRpYU9iamVjdDsKaW50ZXJmYWNlIElNZWRpYU9iamVjdEluUGxhY2U7Cgp0eXBlZGVmIHN0cnVjdCBfRE1PTWVkaWFUeXBlCnsKICAgIEdVSUQgbWFqb3J0eXBlOwogICAgR1VJRCBzdWJ0eXBlOwogICAgQk9PTCBiRml4ZWRTaXplU2FtcGxlczsKICAgIEJPT0wgYlRlbXBvcmFsQ29tcHJlc3Npb247CiAgICBVTE9ORyBsU2FtcGxlU2l6ZTsKICAgIEdVSUQgZm9ybWF0dHlwZTsKICAgIElVbmtub3duICpwVW5rOwogICAgVUxPTkcgY2JGb3JtYXQ7CiAgICBCWVRFICpwYkZvcm1hdDsKfSBETU9fTUVESUFfVFlQRTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRW51bURNTyBpbnRlcmZhY2UKICovClsKICAgIG9iamVjdCwKICAgIHV1aWQoMkMzQ0Q5OEEtMkJGQS00QTUzLTlDMjctNTI0OUJBNjRCQTBGKSwKICAgIHBvaW50ZXJfZGVmYXVsdCh1bmlxdWUpCl0KaW50ZXJmYWNlIElFbnVtRE1PIDogSVVua25vd24KewogICAgW2xvY2FsXQogICAgSFJFU1VMVCBOZXh0KAogICAgICAgIFtpbl0gRFdPUkQgY0l0ZW1zVG9GZXRjaCwKICAgICAgICBbb3V0XSBDTFNJRCAqcENMU0lELAogICAgICAgIFtvdXRdIFdDSEFSICoqTmFtZXMsCiAgICAgICAgW291dF0gRFdPUkQgKnBjSXRlbXNGZXRjaGVkCiAgICApOwoKICAgIEhSRVNVTFQgU2tpcCgKICAgICAgICBbaW5dIERXT1JEIGNJdGVtc1RvU2tpcAogICAgKTsKCiAgICBIUkVTVUxUIFJlc2V0KCk7CgogICAgSFJFU1VMVCBDbG9uZSgKICAgICAgICBbb3V0XSBJRW51bURNTyAqKnBwRW51bQogICAgKTsKfQo=