LyogaXg4NyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBhcmNzaW5oLgogICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCiAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgoKICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHNlZQogICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwoKI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CgoJLnNlY3Rpb24gLnJvZGF0YQoKCS5hbGlnbiBBTElHTkFSRyg0KQoJLnR5cGUgaHVnZSxAb2JqZWN0Cmh1Z2U6CS50ZmxvYXQgMWUrNDkzMAoJQVNNX1NJWkVfRElSRUNUSVZFKGh1Z2UpCgkuYWxpZ24gQUxJR05BUkcoNCkKCS8qIFBsZWFzZSBub3RlIHRoYXQgd2UgdXNlIGRvdWJsZSB2YWx1ZSBmb3IgMS4wLiAgVGhpcyBudW1iZXIKCSAgIGhhcyBhbiBleGFjdCByZXByZXNlbnRhdGlvbiBhbmQgc28gd2UgZG9uJ3QgZ2V0IGFjY3VyYWN5CgkgICBwcm9ibGVtcy4gIFRoZSBhZHZhbnRhZ2UgaXMgdGhhdCB0aGUgY29kZSBpcyBzaW1wbGVyLiAgKi8KCS50eXBlIG9uZSxAb2JqZWN0Cm9uZToJLmRvdWJsZSAxLjAKCUFTTV9TSVpFX0RJUkVDVElWRShvbmUpCgkvKiBJdCBpcyBub3QgaW1wb3J0YW50IHRoYXQgdGhpcyBjb25zdGFudCBpcyBwcmVjaXNlLiAgSXQgaXMgb25seQoJICAgYSB2YWx1ZSB3aGljaCBpcyBrbm93biB0byBiZSBvbiB0aGUgc2FmZSBzaWRlIGZvciB1c2luZyB0aGUKCSAgIGZ5bDJ4cDEgaW5zdHJ1Y3Rpb24uICAqLwoJLnR5cGUgbGltaXQsQG9iamVjdApsaW1pdDoJLmRvdWJsZSAwLjI5CglBU01fU0laRV9ESVJFQ1RJVkUobGltaXQpCgojaWZkZWYgUElDCiNkZWZpbmUgTU8ob3ApIG9wIyNAR09UT0ZGKCVlZHgpCiNlbHNlCiNkZWZpbmUgTU8ob3ApIG9wCiNlbmRpZgoKCS50ZXh0CkVOVFJZKF9fYXNpbmhsKQoJbW92bAkxMiglZXNwKSwgJWVjeAoJbW92bAkkMHg3ZmZmLCAlZWF4CglhbmRsCSVlY3gsICVlYXgKCWFuZGwJJDB4ODAwMCwgJWVjeAoJbW92bAklZWF4LCAlZWR4CglvcmwJJDB4ZmZmZjgwMDAsICVlZHgKCWluY2wJJWVkeAoJanoJN2YJCQkvLyB4IGluILFJbmYgb3IgTmFOCgl4b3JsCSVlY3gsIDEyKCVlc3ApCglmbGR0CTQoJWVzcCkJCQkvLyB8eHwKCWNtcGwJJDB4M2ZkZSwgJWVheAoJamIJMmYJCQkvLyB8eHwgPCAyXi0zNAoJZmxkbG4yCQkJCS8vIGxvZygyKSA6IHx4fAoJY21wbAkkMHg0MDIwLCAlZWF4CglmeGNoCQkJCS8vIHx4fCA6IGxvZygyKQoJamEJM2YJCQkvLyB8eHwgPiAyXjM0CiNpZmRlZglQSUMKCUxPQURfUElDX1JFRyAoZHgpCiNlbmRpZgoJY21wbAkkMHg0MDAwLCAlZWF4CglqYQk1ZgkJCS8vIHx4fCA+IDIKCgkvLyAyXi0zNCA8PSB8eHwgPD0gMiA9PiB5ID0gc2lnbih4KSpsb2cxcCh8eHwrfHh8XjIvKDErc3FydCgxK3x4fF4yKSkpCglmbGQJJXN0CQkJLy8gfHh8IDogfHh8IDogbG9nKDIpCglmbXVsCSVzdCgxKQkJCS8vIHx4fF4yIDogfHh8IDogbG9nKDIpCglmbGQJJXN0CQkJLy8gfHh8XjIgOiB8eHxeMiA6IHx4fCA6IGxvZygyKQoJZmFkZGwJTU8ob25lKQkJCS8vIDErfHh8XjIgOiB8eHxeMiA6IHx4fCA6IGxvZygyKQoJZnNxcnQJCQkJLy8gc3FydCgxK3x4fF4yKSA6IHx4fF4yIDogfHh8IDogbG9nKDIpCglmYWRkbAlNTyhvbmUpCQkJLy8gMStzcXJ0KDErfHh8XjIpIDogfHh8XjIgOiB8eHwgOiBsb2coMikKCWZkaXZycAkJCQkvLyB8eHxeMi8oMStzcXJ0KDErfHh8XjIpKSA6IHx4fCA6IGxvZygyKQoJZmFkZHAJCQkJLy8gfHh8K3x4fF4yLygxK3NxcnQoMSt8eHxeMikpIDogbG9nKDIpCglmY29tbAlNTyhsaW1pdCkKCWZuc3RzdwoJc2FoZgoJamEJNmYKCWZ5bDJ4cDEKCWplY3h6CTRmCglmY2hzCjQ6CXJldAoKNzoJZmxkdAk0KCVlc3ApCglyZXQKCjY6CWZhZGRsCU1PKG9uZSkKCWZ5bDJ4CglqZWN4egk0ZgoJZmNocwo0OglyZXQKCgkvLyB8eHwgPCAyXi0zNCA9PiB5ID0geCAoaW5leGFjdCBpZmYgfHh8ICE9IDAuMCkKCS5hbGlnbiBBTElHTkFSRyg0KQoyOgojaWZkZWYJUElDCglMT0FEX1BJQ19SRUcgKGR4KQojZW5kaWYKCWplY3h6CTRmCglmY2hzCQkJCS8vIHgKNDoJZmxkCSVzdAkJCS8vIHggOiB4CglmbGR0CU1PKGh1Z2UpCQkvLyBodWdlIDogeCA6IHgKCWZhZGRwCQkJCS8vIGh1Z2UreCA6IHgKCWZzdHAJJXN0KDApCQkJLy8geAoJcmV0CgoJLy8gfHh8ID4gMl4zNCA9PiB5ID0gc2lnbih4KSAqIChsb2cofHh8KSArIGxvZygyKSkKCS5hbGlnbiBBTElHTkFSRyg0KQozOglmeWwyeAkJCQkvLyBsb2cofHh8KQoJZmxkbG4yCQkJCS8vIGxvZygyKSA6IGxvZyh8eHwpCglmYWRkcAkJCQkvLyBsb2cofHh8KStsb2coMikKCWplY3h6CTRmCglmY2hzCjQ6CXJldAoKCS8vIHx4fCA+IDIgPT4geSA9IHNpZ24oeCkgKiBsb2coMip8eHwgKyAxLyh8eHwrc3FydCh4KngrMSkpKQoJLmFsaWduIEFMSUdOQVJHKDQpCjU6CWZsZAklc3QJCQkvLyB8eHwgOiB8eHwgOiBsb2coMikKCWZhZGQJJXN0LCAlc3QoMSkJCS8vIHx4fCA6IDIqfHh8IDogbG9nKDIpCglmbGQJJXN0CQkJLy8gfHh8IDogfHh8IDogMip8eHwgOiBsb2coMikKCWZtdWwJJXN0KDEpCQkJLy8gfHh8XjIgOiB8eHwgOiAyKnx4fCA6IGxvZygyKQoJZmFkZGwJTU8ob25lKQkJCS8vIDErfHh8XjIgOiB8eHwgOiAyKnx4fCA6IGxvZygyKQoJZnNxcnQJCQkJLy8gc3FydCgxK3x4fF4yKSA6IHx4fCA6IDIqfHh8IDogbG9nKDIpCglmYWRkcAkJCQkvLyB8eHwrc3FydCgxK3x4fF4yKSA6IDIqfHh8IDogbG9nKDIpCglmZGl2cmwJTU8ob25lKQkJCS8vIDEvKHx4fCtzcXJ0KDErfHh8XjIpKSA6IDIqfHh8IDogbG9nKDIpCglmYWRkcAkJCQkvLyAyKnx4fCsxLyh8eHwrc3FydCgxK3x4fF4yKSkgOiBsb2coMikKCWZ5bDJ4CQkJCS8vIGxvZygyKnx4fCsxLyh8eHwrc3FydCgxK3x4fF4yKSkpCglqZWN4egk0ZgoJZmNocwo0OglyZXQKRU5EKF9fYXNpbmhsKQp3ZWFrX2FsaWFzIChfX2FzaW5obCwgYXNpbmhsKQo=