LyoKICogQ29weXJpZ2h0IDIwMDIgTWljaGFlbCBH/G5uZXdpZwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaWZuZGVmIF9fQVZJRklMRV9QUklWQVRFX0gKI2RlZmluZSBfX0FWSUZJTEVfUFJJVkFURV9ICgojaWZuZGVmIE1BWF9BVklTVFJFQU1TCiNkZWZpbmUgTUFYX0FWSVNUUkVBTVMgOAojZW5kaWYKCiNpZm5kZWYgY29tcHR5cGVESUIKI2RlZmluZSBjb21wdHlwZURJQiAgbW1pb0ZPVVJDQygnRCcsJ0knLCdCJywnICcpCiNlbmRpZgoKI2lmbmRlZiBESUJXSURUSEJZVEVTCiNkZWZpbmUgV0lEVEhCWVRFUyhpKSAgICAgKCgoaSszMSkmKH4zMSkpLzgpCiNkZWZpbmUgRElCV0lEVEhCWVRFUyhiaSkgV0lEVEhCWVRFUygoYmkpLmJpV2lkdGggKiAoYmkpLmJpQml0Q291bnQpCiNlbmRpZgoKI2lmbmRlZiBESUJQVFIKI2RlZmluZSBESUJQVFIobHApICAgICAgKChMUEJZVEUpKGxwKSArIChscCktPmJpU2l6ZSArIFwKICAgICAgICAgICAgICAgICAgICAgICAgIChscCktPmJpQ2xyVXNlZCAqIHNpemVvZihSR0JRVUFEKSkKI2VuZGlmCgojZGVmaW5lIElERF9TQVZFT1BUSU9OUyAgICAgIDB4MDEwMAojZGVmaW5lIElEQ19JTlRFUkxFQVZFICAgICAgIDB4MDExMAojZGVmaW5lIElEQ19JTlRFUkxFQVZFRVZFUlkgIDB4MDExMQojZGVmaW5lIElEQ19TVFJFQU0gICAgICAgICAgIDB4MDExMgojZGVmaW5lIElEQ19PUFRJT05TICAgICAgICAgIDB4MDExMwojZGVmaW5lIElEQ19GT1JNQVRURVhUICAgICAgIDB4MDExNAoKI2RlZmluZSBJRFNfV0FWRVNUUkVBTUZPUk1BVCAweDAxMDAKI2RlZmluZSBJRFNfV0FWRUZJTEVUWVBFICAgICAweDAxMDEKI2RlZmluZSBJRFNfQUxMTVVMVElNRURJQSAgICAweDAxODQKI2RlZmluZSBJRFNfQUxMRklMRVMgICAgICAgICAweDAxODUKI2RlZmluZSBJRFNfVklERU8gICAgICAgICAgICAweDAxODkKI2RlZmluZSBJRFNfQVVESU8gICAgICAgICAgICAweDAxOTAKI2RlZmluZSBJRFNfQVZJU1RSRUFNRk9STUFUICAweDAxOTEKI2RlZmluZSBJRFNfQVZJRklMRVRZUEUgICAgICAweDAxOTIKI2RlZmluZSBJRFNfVU5DT01QUkVTU0VEICAgICAweDAxOTMKCkRFRklORV9BVklHVUlEKENMU0lEX0lDTVN0cmVhbSwgMHgwMDAyMDAwMSwgMCwgMCk7CkRFRklORV9BVklHVUlEKENMU0lEX1dBVkZpbGUsICAgMHgwMDAyMDAwMywgMCwgMCk7CkRFRklORV9BVklHVUlEKENMU0lEX0FDTVN0cmVhbSwgMHgwMDAyMDAwRiwgMCwgMCk7CkRFRklORV9BVklHVUlEKElJRF9JRWRpdFN0cmVhbUludGVybmFsLCAweDAwMDIwMDBBLDAsMCk7CgpleHRlcm4gSE1PRFVMRSBBVklGSUxFX2hNb2R1bGU7CgpleHRlcm4gSFJFU1VMVCBBVklGSUxFX0NyZWF0ZUFWSUZpbGUoUkVGSUlEIHJpaWQsIExQVk9JRCAqcHBvYmopOwpleHRlcm4gSFJFU1VMVCBBVklGSUxFX0NyZWF0ZVdBVkZpbGUoUkVGSUlEIHJpaWQsIExQVk9JRCAqcHBvYmopOwpleHRlcm4gSFJFU1VMVCBBVklGSUxFX0NyZWF0ZUFDTVN0cmVhbShSRUZJSUQgcmlpZCwgTFBWT0lEICpwcG9iaik7CmV4dGVybiBIUkVTVUxUIEFWSUZJTEVfQ3JlYXRlSUNNU3RyZWFtKFJFRklJRCByaWlkLCBMUFZPSUQgKnBwb2JqKTsKZXh0ZXJuIFBBVklFRElUU1RSRUFNIEFWSUZJTEVfQ3JlYXRlRWRpdFN0cmVhbShQQVZJU1RSRUFNIHBzdHJlYW0pOwpleHRlcm4gUEdFVEZSQU1FIEFWSUZJTEVfQ3JlYXRlR2V0RnJhbWUoUEFWSVNUUkVBTSBwc3RyZWFtKTsKZXh0ZXJuIFBBVklGSUxFICBBVklGSUxFX0NyZWF0ZUFWSVRlbXBGaWxlKGludCBuU3RyZWFtcyxQQVZJU1RSRUFNICpwcFN0cmVhbXMpOwoKZXh0ZXJuIExQQ1dTVFIgIEFWSUZJTEVfQmFzZW5hbWVXKExQQ1dTVFIgc3pGaWxlTmFtZSk7CgojZW5kaWYK