Ly8KLy8gQ29weXJpZ2h0IKkgMjAxMiBMaW5hcm8gTGltaXRlZAovLwovLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgZ2xtYXJrMiBPcGVuR0wgKEVTKSAyLjAgYmVuY2htYXJrLgovLwovLyBnbG1hcmsyIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCi8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLy8gRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKLy8gdmVyc2lvbi4KLy8KLy8gZ2xtYXJrMiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKLy8gV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwovLyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCi8vIGRldGFpbHMuCi8vCi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLy8gZ2xtYXJrMi4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLy8KLy8gQXV0aG9yczoKLy8gIEplc3NlIEJhcmtlcgovLwojaWZuZGVmIFNDRU5FX1JFRlJBQ1RfCiNkZWZpbmUgU0NFTkVfUkVGUkFDVF8KCiNpbmNsdWRlICJzY2VuZS5oIgojaW5jbHVkZSAic3RhY2suaCIKCi8vCi8vIFRvIGNyZWF0ZSBhIHNoYWRvdyBtYXAsIHdlIG5lZWQgYSBmcmFtZWJ1ZmZlciBvYmplY3Qgc2V0IHVwIGZvciBhIAovLyBkZXB0aC1vbmx5IHBhc3MuICBUaGUgcmVuZGVyIHRhcmdldCBjYW4gdGhlbiBiZSBib3VuZCBhcyBhIHRleHR1cmUsCi8vIGFuZCB0aGUgZGVwdGggdmFsdWVzIHNhbXBsZWQgZnJvbSB0aGF0IHRleHR1cmUgY2FuIGJlIHVzZWQgaW4gdGhlCi8vIGRpc3RhbmNlLWZyb20tbGlnaHQgY29tcHV0YXRpb25zIHdoZW4gcmVuZGVyaW5nIHRoZSBzaGFkb3cgb24gdGhlCi8vIGdyb3VuZCBiZWxvdyB0aGUgcmVuZGVyZWQgb2JqZWN0LgovLwpjbGFzcyBEaXN0YW5jZVJlbmRlclRhcmdldAp7CiAgICBlbnVtCiAgICB7CiAgICAgICAgREVQVEggPSAwLAogICAgICAgIENPTE9SCiAgICB9OwogICAgUHJvZ3JhbSBwcm9ncmFtXzsKICAgIHVuc2lnbmVkIGludCBjYW52YXNfd2lkdGhfOwogICAgdW5zaWduZWQgaW50IGNhbnZhc19oZWlnaHRfOwogICAgdW5zaWduZWQgaW50IHdpZHRoXzsKICAgIHVuc2lnbmVkIGludCBoZWlnaHRfOwogICAgdW5zaWduZWQgaW50IHRleF9bMl07CiAgICB1bnNpZ25lZCBpbnQgZmJvXzsKcHVibGljOgogICAgRGlzdGFuY2VSZW5kZXJUYXJnZXQoKSA6CiAgICAgICAgY2FudmFzX3dpZHRoXygwKSwKICAgICAgICBjYW52YXNfaGVpZ2h0XygwKSwKICAgICAgICB3aWR0aF8oMCksCiAgICAgICAgaGVpZ2h0XygwKSwKICAgICAgICBmYm9fKDApCiAgICB7CiAgICAgICAgdGV4X1tERVBUSF0gPSB0ZXhfW0NPTE9SXSA9IDA7CiAgICB9CiAgICB+RGlzdGFuY2VSZW5kZXJUYXJnZXQoKSB7fQogICAgYm9vbCBzZXR1cCh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQpOwogICAgdm9pZCB0ZWFyZG93bigpOwogICAgdm9pZCBlbmFibGUoY29uc3QgTGliTWF0cml4OjptYXQ0JiBtdnApOwogICAgdm9pZCBkaXNhYmxlKCk7CiAgICB1bnNpZ25lZCBpbnQgZGVwdGhUZXh0dXJlKCkgeyByZXR1cm4gdGV4X1tERVBUSF07IH0KICAgIHVuc2lnbmVkIGludCBjb2xvclRleHR1cmUoKSB7IHJldHVybiB0ZXhfW0NPTE9SXTsgfQogICAgUHJvZ3JhbSYgcHJvZ3JhbSgpIHsgcmV0dXJuIHByb2dyYW1fOyB9Cn07CgpjbGFzcyBSZWZyYWN0UHJpdmF0ZQp7CiAgICBDYW52YXMmIGNhbnZhc187CiAgICBEaXN0YW5jZVJlbmRlclRhcmdldCBkZXB0aFRhcmdldF87CiAgICBQcm9ncmFtIHByb2dyYW1fOwogICAgTGliTWF0cml4OjpTdGFjazQgbW9kZWx2aWV3XzsKICAgIExpYk1hdHJpeDo6U3RhY2s0IHByb2plY3Rpb25fOwogICAgTGliTWF0cml4OjptYXQ0IGxpZ2h0XzsKICAgIE1lc2ggbWVzaF87CiAgICBMaWJNYXRyaXg6OnZlYzMgY2VudGVyVmVjXzsKICAgIGJvb2wgb3JpZW50TW9kZWxfOwogICAgZmxvYXQgb3JpZW50YXRpb25BbmdsZV87CiAgICBMaWJNYXRyaXg6OnZlYzMgb3JpZW50YXRpb25WZWNfOwogICAgZmxvYXQgcmFkaXVzXzsKICAgIGZsb2F0IHJvdGF0aW9uXzsKICAgIGZsb2F0IHJvdGF0aW9uU3BlZWRfOwogICAgdW5zaWduZWQgaW50IHRleHR1cmVfOwogICAgYm9vbCB1c2VWYm9fOwogICAgCnB1YmxpYzoKICAgIFJlZnJhY3RQcml2YXRlKENhbnZhcyYgY2FudmFzKSA6CiAgICAgICAgY2FudmFzXyhjYW52YXMpLAogICAgICAgIG9yaWVudE1vZGVsXyhmYWxzZSksCiAgICAgICAgb3JpZW50YXRpb25BbmdsZV8oMC4wKSwKICAgICAgICByYWRpdXNfKDAuMCksCiAgICAgICAgcm90YXRpb25fKDAuMCksCiAgICAgICAgcm90YXRpb25TcGVlZF8oMzYuMCksCiAgICAgICAgdGV4dHVyZV8oMCksCiAgICAgICAgdXNlVmJvXyh0cnVlKSB7fQogICAgflJlZnJhY3RQcml2YXRlKCkge30KCiAgICBib29sIHNldHVwKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBTY2VuZTo6T3B0aW9uPiYgb3B0aW9ucyk7CiAgICB2b2lkIHRlYXJkb3duKCk7CiAgICB2b2lkIHVwZGF0ZShkb3VibGUgZWxhcHNlZFRpbWUpOwogICAgdm9pZCBkcmF3KCk7Cn07CgojZW5kaWYgLy8gU0NFTkVfUkVGUkFDVF8K