LyoKICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCiAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCiNpbmNsdWRlICJMVk1fVHlwZXMuaCIKI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKI2luY2x1ZGUgIlNjYWxhckFyaXRobWV0aWMuaCIKI2luY2x1ZGUgIkZpbHRlci5oIgoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgTFZNX1Bvd2VyMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIDEwWCB1c2luZyBhbiAxMXRoIG9yZGVyIHBvbHlub21pYWwuIEl0IHVzZXMgICovCi8qICAgdGhlIGZvbGxvd2luZyB0YWJsZSBvZiAzMi1iaXQgaW50ZWdlciBwb2x5bm9taWFsIGNvZWZmaWNpZW50czogICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgQ29lZmZpY2llbnQgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgQTAgICAgICAgICAgICAgNjcxMDI1NDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgQTEgICAgICAgICAgICAgMzA5MDMyOTk1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgQTIgICAgICAgICAgICAgNzEyMDk2MTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgQTMgICAgICAgICAgICAgMTA5Mjc5NzMzMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgQTQgICAgICAgICAgICAgMTI1MTYyNTEzNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgQTUgICAgICAgICAgICAgMTE1NDY0OTQ2MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgQTYgICAgICAgICAgICAgOTE1NjU0ODAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgQTcgICAgICAgICAgICAgNTk3ODgzNjgzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgQTggICAgICAgICAgICAgMjg0Mzc4MjMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgQTkgICAgICAgICAgICAgMTUwMjYyMDk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgQTEwICAgICAgICAgICAgMTI0ODk0NDcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgQTExICAgICAgICAgICAgNTA0NzcyNDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgQTEyICAgICAgICAgICAgLTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBZID0gKEEwICsgQTEqWCArIEEyKlgyICsgQTMqWDMgKyCFLi4gKyBBTip4TikgPDwgQU4rMSAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBYICAgICAgICAgICAgICAgaXMgdGhlIGlucHV0IHZhcmlhYmxlIGluIFEyLjMwIGZvcm1hdCAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgVGhlIHJlc3VsdCBvZiB0aGUgMTB4IGV4cGFuc2lvbiBpbiBROC4yNCBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICovCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgpMVk1fSU5UMzIgTFZNX1Bvd2VyMTAoTFZNX0lOVDMyICAgICBYKQp7CiAgICBMVk1fSU5UMzIgWSxDb2VmZmljaWVudHNbMTNdPXsgIDE2Nzc1NjM2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzcyNTgyNDksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3ODAyNDAzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjczMTk5MzMzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTI5MDYyODQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4ODY2MjM2NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjI4OTEzNzAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDk0NzA5MjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTA5NDU1OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM3NTY1NTI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEyMjM2MTgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjYxOTMxMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB9OwogICAgWT1MVk1fUG9seW5vbWlhbCgoTFZNX1VJTlQxNikxMSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29lZmZpY2llbnRzLAogICAgICAgICAgICAgICAgICAgICAgICBYKTsKICAgIHJldHVybiBZOwp9Cgo=