Ly8gTW9yZ2VuR3JhdWVuIE1VRGxpYgovLwovLyBtYXN0ZXIvZnRwaW1wLmMgLS0gRlRQIEF2YXRhcgovLwovLyAkSWQ6IGZ0cGltcC5jIDY0NDAgMjAwNy0wOC0xOCAyMzowMDo0OVogWmVzc3RyYSAkCi8vCi8vIHNpZWhlIC9zZWN1cmUvZnRwZAoKI3ByYWdtYSBzdHJvbmdfdHlwZXMKCiNpbmNsdWRlICIvc2VjdXJlL21hc3Rlci5oIgojZGVmaW5lIEZUUEQgIi9zZWN1cmUvZnRwZCIKCi8vcHJpdmF0ZSBpbmhlcml0ICIvc3RkL3NoZWxscy9maWxlc3lzL2ZpbGVzeXMiOwpwcml2YXRlIGluaGVyaXQgIi9zZWN1cmUvbWlzYy9maWxlc3lzL2ZpbGVzeXMiOwoKc3RhdGljIHN0cmluZyB1c2VyOyAvLyBOYW1lIGRlcyB6dWdlaG9lcmlnZW4gVXNlcnMKCm5vbWFzayBwcml2YXRlIGludCBzZWN1cmVfaW1wY2FsbCgpIHsKICByZXR1cm4KICAgIGdldHVpZChwcmV2aW91c19vYmplY3QoKSkgPT0gUk9PVElEICYmCiAgICBnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSA9PSBST09USUQ7Cgp9CgovLyBOYWNoIGRlbSBBdWZydWYgdm9uIFNldFVzZXIgd2lyZCBkZXIgRmlsZW5hbWUgZ2VhZWRuZXJ0LCBzb2Rhc3MKLy8gZGFzIG5vcm1hbGUgY2xvbmVwIGluIGdldF9kaXIgbmljaHQgbWVociBnZWh0LiBIaWVyIGVpbiBlcnNhdHouCnByaXZhdGUgbm9tYXNrIGludCBteV9pc19jbG9uZSgpIHsKICByZXR1cm4gbWVtYmVyKG9iamVjdF9uYW1lKHRoaXNfb2JqZWN0KCkpLCc6Jyk+PTA7Cn0KCm5vbWFzayB2b2lkIGNyZWF0ZSgpIHsKICBpZiggIWNsb25lcCh0aGlzX29iamVjdCgpKSApIHsKICAgIHNldF9uZXh0X3Jlc2V0KCAtMSApOyAvLyBibHVlcHJpbnQgc29sbCBuaWNodCBzdGVyYmVuCiAgICByZXR1cm47CiAgfQogIC8vaWYoIHNlY3VyZV9pbXBjYWxsKCkgKSA6OmNyZWF0ZSgpOwp9Cgpub21hc2sgaW50IFNldFVzZXIoIHN0cmluZyBuYW1lICkgewogIGlmKCAhc2VjdXJlX2ltcGNhbGwoKSB8fCAhY2xvbmVwKHRoaXNfb2JqZWN0KCkpICkgcmV0dXJuIC0yOwogIGlmKCBzdHJpbmdwKHVzZXIpICYmIHVzZXIgIT0gIiIgKSB7CiAgICAvL3dyaXRlKCAiVXNlcj0iK3VzZXIrIlxuIiApOwogICAgcmV0dXJuIC0xOyAvLyBzY2hvbiBlaW4gbmFtZSBkYSEKICB9CiAgdXNlciA9IGxvd2VyX2Nhc2UobmFtZSk7CiAgc2V0ZXVpZCggdXNlciApOwogIHNldF9uZXh0X3Jlc2V0KCAxODAwICk7Cn0KCi8vIEdpYnQgZWluZW4gbmVnYXRpdmVuIFdlcnQgenVy/GNrLCB3ZW5uIGRpZSBEYXRlaSBuaWNodCBnZWxlc2VuIHdlcmRlbgovLyBrYW5uIG9kZXIgZWluZW4gc3RyaW5nLCBkZXIgZGllIGdlc2FtdGVuIERhdGVuIGRlcyBWZXJ6ZWljaG5pc3NlcwovLyBlbnRo5Gx0Lgpub21hc2sgbWl4ZWQgR2V0RGlyKHN0cmluZyBkaXIpCnsKICBtaXhlZCByZXQ7IHJldCA9ICIiOwogIGlmKCAhc2VjdXJlX2ltcGNhbGwoKSB8fCAhbXlfaXNfY2xvbmUoKSkgcmV0dXJuIC0yOwogIGlmKCAhc3RyaW5ncCh1c2VyKSB8fCB1c2VyPT0iIiApIHJldHVybiAtMTsKICBfbHNfb3V0cHV0KCBkaXIsICZyZXQsIHVzZXIsIDB4ODMgKTsKICBzZXRfbmV4dF9yZXNldCggMTgwMCApOwogIHJldHVybiByZXQ7Cn0KCm5vbWFzayB2b2lkIHJlc2V0KCkgewogIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOwp9Cgp2YXJhcmdzIG1peGVkIG1vdmUoKSB7CiAgcmV0dXJuIC0xOwp9CgovLyBGdWVyIGRpZSBNZWxkdW5nIGF1ZiBGVFAKbm9tYXNrIHN0cmluZyBuYW1lKCkgewogIHJldHVybiBjYXBpdGFsaXplKHVzZXIpOwp9Cg==