Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8vIE9wZW5HTCBNYXRoZW1hdGljcyAoZ2xtLmctdHJ1Yy5uZXQpCi8vLwovLy8gQ29weXJpZ2h0IChjKSAyMDA1IC0gMjAxNCBHLVRydWMgQ3JlYXRpb24gKHd3dy5nLXRydWMubmV0KQovLy8KLy8vIFRoaXMgaGFsZiBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBPcGVuRVhSIHdoaWNoIGlzIENvcHlyaWdodCAoYykgMjAwMiwgCi8vLyBJbmR1c3RyaWFsIExpZ2h0ICYgTWFnaWMsIGEgZGl2aXNpb24gb2YgTHVjYXMgRGlnaXRhbCBMdGQuIExMQwovLy8KLy8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKLy8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCi8vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCi8vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCi8vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKLy8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci8vLyAKLy8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCi8vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLy8vIAovLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLy8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAovLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCi8vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCi8vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAovLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgovLy8gVEhFIFNPRlRXQVJFLgovLy8KLy8vIEByZWYgY29yZQovLy8gQGZpbGUgZ2xtL2NvcmUvdHlwZV9oYWxmLmlubAovLy8gQGRhdGUgMjAwOC0wOC0xNyAvIDIwMTEtMDYtMTUKLy8vIEBhdXRob3IgQ2hyaXN0b3BoZSBSaWNjaW8KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCm5hbWVzcGFjZSBnbG17Cm5hbWVzcGFjZSBkZXRhaWwKewoJR0xNX0ZVTkNfUVVBTElGSUVSIGZsb2F0IG92ZXJmbG93KCkKCXsKCQl2b2xhdGlsZSBmbG9hdCBmID0gMWUxMDsKCgkJZm9yKGludCBpID0gMDsgaSA8IDEwOyArK2kpCQoJCQlmICo9IGY7ICAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBvdmVyZmxvdyBiZWZvcmUKCQkJCQkJCQkvLyB0aGUgZm9yrWxvb3AgdGVybWluYXRlcwoJCXJldHVybiBmOwoJfQoKCXVuaW9uIHVpZjMyCgl7CgkJR0xNX0ZVTkNfUVVBTElGSUVSIHVpZjMyKCkgOgoJCQlpKDApCgkJe30KCgkJR0xNX0ZVTkNfUVVBTElGSUVSIHVpZjMyKGZsb2F0IGYpIDoKCQkJZihmKQoJCXt9CgoJCUdMTV9GVU5DX1FVQUxJRklFUiB1aWYzMih1aW50MzIgaSkgOgoJCQlpKGkpCgkJe30KCgkJZmxvYXQgZjsKCQl1aW50MzIgaTsKCX07CgoJR0xNX0ZVTkNfUVVBTElGSUVSIGZsb2F0IHRvRmxvYXQzMihoZGF0YSB2YWx1ZSkKCXsKCQlpbnQgcyA9ICh2YWx1ZSA+PiAxNSkgJiAweDAwMDAwMDAxOwoJCWludCBlID0gKHZhbHVlID4+IDEwKSAmIDB4MDAwMDAwMWY7CgkJaW50IG0gPSAgdmFsdWUgICAgICAgICYgMHgwMDAwMDNmZjsKCgkJaWYoZSA9PSAwKQoJCXsKCQkJaWYobSA9PSAwKQoJCQl7CgkJCQkvLwoJCQkJLy8gUGx1cyBvciBtaW51cyB6ZXJvCgkJCQkvLwoKCQkJCWRldGFpbDo6dWlmMzIgcmVzdWx0OwoJCQkJcmVzdWx0LmkgPSAodW5zaWduZWQgaW50KShzIDw8IDMxKTsKCQkJCXJldHVybiByZXN1bHQuZjsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCS8vCgkJCQkvLyBEZW5vcm1hbGl6ZWQgbnVtYmVyIC0tIHJlbm9ybWFsaXplIGl0CgkJCQkvLwoKCQkJCXdoaWxlKCEobSAmIDB4MDAwMDA0MDApKQoJCQkJewoJCQkJCW0gPDw9IDE7CgkJCQkJZSAtPSAgMTsKCQkJCX0KCgkJCQllICs9IDE7CgkJCQltICY9IH4weDAwMDAwNDAwOwoJCQl9CgkJfQoJCWVsc2UgaWYoZSA9PSAzMSkKCQl7CgkJCWlmKG0gPT0gMCkKCQkJewoJCQkJLy8KCQkJCS8vIFBvc2l0aXZlIG9yIG5lZ2F0aXZlIGluZmluaXR5CgkJCQkvLwoKCQkJCXVpZjMyIHJlc3VsdDsKCQkJCXJlc3VsdC5pID0gKHVuc2lnbmVkIGludCkoKHMgPDwgMzEpIHwgMHg3ZjgwMDAwMCk7CgkJCQlyZXR1cm4gcmVzdWx0LmY7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkvLwoJCQkJLy8gTmFuIC0tIHByZXNlcnZlIHNpZ24gYW5kIHNpZ25pZmljYW5kIGJpdHMKCQkJCS8vCgoJCQkJdWlmMzIgcmVzdWx0OwoJCQkJcmVzdWx0LmkgPSAodW5zaWduZWQgaW50KSgocyA8PCAzMSkgfCAweDdmODAwMDAwIHwgKG0gPDwgMTMpKTsKCQkJCXJldHVybiByZXN1bHQuZjsKCQkJfQoJCX0KCgkJLy8KCQkvLyBOb3JtYWxpemVkIG51bWJlcgoJCS8vCgoJCWUgPSBlICsgKDEyNyAtIDE1KTsKCQltID0gbSA8PCAxMzsKCgkJLy8KCQkvLyBBc3NlbWJsZSBzLCBlIGFuZCBtLgoJCS8vCgoJCXVpZjMyIFJlc3VsdDsKCQlSZXN1bHQuaSA9ICh1bnNpZ25lZCBpbnQpKChzIDw8IDMxKSB8IChlIDw8IDIzKSB8IG0pOwoJCXJldHVybiBSZXN1bHQuZjsKCX0KCglHTE1fRlVOQ19RVUFMSUZJRVIgaGRhdGEgdG9GbG9hdDE2KGZsb2F0IGNvbnN0ICYgZikKCXsKCQl1aWYzMiBFbnRyeTsKCQlFbnRyeS5mID0gZjsKCQlpbnQgaSA9IChpbnQpRW50cnkuaTsKCgkJLy8KCQkvLyBPdXIgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCBmLCBpcyByZXByZXNlbnRlZCBieSB0aGUgYml0CgkJLy8gcGF0dGVybiBpbiBpbnRlZ2VyIGkuICBEaXNhc3NlbWJsZSB0aGF0IGJpdCBwYXR0ZXJuIGludG8KCQkvLyB0aGUgc2lnbiwgcywgdGhlIGV4cG9uZW50LCBlLCBhbmQgdGhlIHNpZ25pZmljYW5kLCBtLgoJCS8vIFNoaWZ0IHMgaW50byB0aGUgcG9zaXRpb24gd2hlcmUgaXQgd2lsbCBnbyBpbiBpbiB0aGUKCQkvLyByZXN1bHRpbmcgaGFsZiBudW1iZXIuCgkJLy8gQWRqdXN0IGUsIGFjY291bnRpbmcgZm9yIHRoZSBkaWZmZXJlbnQgZXhwb25lbnQgYmlhcwoJCS8vIG9mIGZsb2F0IGFuZCBoYWxmICgxMjcgdmVyc3VzIDE1KS4KCQkvLwoKCQlpbnQgcyA9ICAoaSA+PiAxNikgJiAweDAwMDA4MDAwOwoJCWludCBlID0gKChpID4+IDIzKSAmIDB4MDAwMDAwZmYpIC0gKDEyNyAtIDE1KTsKCQlpbnQgbSA9ICAgaSAgICAgICAgJiAweDAwN2ZmZmZmOwoKCQkvLwoJCS8vIE5vdyByZWFzc2VtYmxlIHMsIGUgYW5kIG0gaW50byBhIGhhbGY6CgkJLy8KCgkJaWYoZSA8PSAwKQoJCXsKCQkJaWYoZSA8IC0xMCkKCQkJewoJCQkJLy8KCQkJCS8vIEUgaXMgbGVzcyB0aGFuIC0xMC4gIFRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBmIGlzCgkJCQkvLyBsZXNzIHRoYW4gaGFsZl9NSU4gKGYgbWF5IGJlIGEgc21hbGwgbm9ybWFsaXplZAoJCQkJLy8gZmxvYXQsIGEgZGVub3JtYWxpemVkIGZsb2F0IG9yIGEgemVybykuCgkJCQkvLwoJCQkJLy8gV2UgY29udmVydCBmIHRvIGEgaGFsZiB6ZXJvLgoJCQkJLy8KCgkJCQlyZXR1cm4gaGRhdGEocyk7CgkJCX0KCgkJCS8vCgkJCS8vIEUgaXMgYmV0d2VlbiAtMTAgYW5kIDAuICBGIGlzIGEgbm9ybWFsaXplZCBmbG9hdCwKCQkJLy8gd2hvc2UgbWFnbml0dWRlIGlzIGxlc3MgdGhhbiBfX2hhbGZfTlJNX01JTi4KCQkJLy8KCQkJLy8gV2UgY29udmVydCBmIHRvIGEgZGVub3JtYWxpemVkIGhhbGYuCgkJCS8vIAoKCQkJbSA9IChtIHwgMHgwMDgwMDAwMCkgPj4gKDEgLSBlKTsKCgkJCS8vCgkJCS8vIFJvdW5kIHRvIG5lYXJlc3QsIHJvdW5kICIwLjUiIHVwLgoJCQkvLwoJCQkvLyBSb3VuZGluZyBtYXkgY2F1c2UgdGhlIHNpZ25pZmljYW5kIHRvIG92ZXJmbG93IGFuZCBtYWtlCgkJCS8vIG91ciBudW1iZXIgbm9ybWFsaXplZC4gIEJlY2F1c2Ugb2YgdGhlIHdheSBhIGhhbGYncyBiaXRzCgkJCS8vIGFyZSBsYWlkIG91dCwgd2UgZG9uJ3QgaGF2ZSB0byB0cmVhdCB0aGlzIGNhc2Ugc2VwYXJhdGVseTsKCQkJLy8gdGhlIGNvZGUgYmVsb3cgd2lsbCBoYW5kbGUgaXQgY29ycmVjdGx5LgoJCQkvLyAKCgkJCWlmKG0gJiAweDAwMDAxMDAwKSAKCQkJCW0gKz0gMHgwMDAwMjAwMDsKCgkJCS8vCgkJCS8vIEFzc2VtYmxlIHRoZSBoYWxmIGZyb20gcywgZSAoemVybykgYW5kIG0uCgkJCS8vCgoJCQlyZXR1cm4gaGRhdGEocyB8IChtID4+IDEzKSk7CgkJfQoJCWVsc2UgaWYoZSA9PSAweGZmIC0gKDEyNyAtIDE1KSkKCQl7CgkJCWlmKG0gPT0gMCkKCQkJewoJCQkJLy8KCQkJCS8vIEYgaXMgYW4gaW5maW5pdHk7IGNvbnZlcnQgZiB0byBhIGhhbGYKCQkJCS8vIGluZmluaXR5IHdpdGggdGhlIHNhbWUgc2lnbiBhcyBmLgoJCQkJLy8KCgkJCQlyZXR1cm4gaGRhdGEocyB8IDB4N2MwMCk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkvLwoJCQkJLy8gRiBpcyBhIE5BTjsgd2UgcHJvZHVjZSBhIGhhbGYgTkFOIHRoYXQgcHJlc2VydmVzCgkJCQkvLyB0aGUgc2lnbiBiaXQgYW5kIHRoZSAxMCBsZWZ0bW9zdCBiaXRzIG9mIHRoZQoJCQkJLy8gc2lnbmlmaWNhbmQgb2YgZiwgd2l0aCBvbmUgZXhjZXB0aW9uOiBJZiB0aGUgMTAKCQkJCS8vIGxlZnRtb3N0IGJpdHMgYXJlIGFsbCB6ZXJvLCB0aGUgTkFOIHdvdWxkIHR1cm4gCgkJCQkvLyBpbnRvIGFuIGluZmluaXR5LCBzbyB3ZSBoYXZlIHRvIHNldCBhdCBsZWFzdCBvbmUKCQkJCS8vIGJpdCBpbiB0aGUgc2lnbmlmaWNhbmQuCgkJCQkvLwoKCQkJCW0gPj49IDEzOwoKCQkJCXJldHVybiBoZGF0YShzIHwgMHg3YzAwIHwgbSB8IChtID09IDApKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQkvLwoJCQkvLyBFIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLiAgRiBpcyBhIG5vcm1hbGl6ZWQgZmxvYXQuCgkJCS8vIFdlIHRyeSB0byBjb252ZXJ0IGYgdG8gYSBub3JtYWxpemVkIGhhbGYuCgkJCS8vCgoJCQkvLwoJCQkvLyBSb3VuZCB0byBuZWFyZXN0LCByb3VuZCAiMC41IiB1cAoJCQkvLwoKCQkJaWYobSAmICAweDAwMDAxMDAwKQoJCQl7CgkJCQltICs9IDB4MDAwMDIwMDA7CgoJCQkJaWYobSAmIDB4MDA4MDAwMDApCgkJCQl7CgkJCQkJbSA9ICAwOyAgICAgLy8gb3ZlcmZsb3cgaW4gc2lnbmlmaWNhbmQsCgkJCQkJZSArPSAxOyAgICAgLy8gYWRqdXN0IGV4cG9uZW50CgkJCQl9CgkJCX0KCgkJCS8vCgkJCS8vIEhhbmRsZSBleHBvbmVudCBvdmVyZmxvdwoJCQkvLwoKCQkJaWYgKGUgPiAzMCkKCQkJewoJCQkJb3ZlcmZsb3coKTsgICAgICAgIC8vIENhdXNlIGEgaGFyZHdhcmUgZmxvYXRpbmcgcG9pbnQgb3ZlcmZsb3c7CgoJCQkJcmV0dXJuIGhkYXRhKHMgfCAweDdjMDApOwoJCQkJLy8gaWYgdGhpcyByZXR1cm5zLCB0aGUgaGFsZiBiZWNvbWVzIGFuCgkJCX0gICAvLyBpbmZpbml0eSB3aXRoIHRoZSBzYW1lIHNpZ24gYXMgZi4KCgkJCS8vCgkJCS8vIEFzc2VtYmxlIHRoZSBoYWxmIGZyb20gcywgZSBhbmQgbS4KCQkJLy8KCgkJCXJldHVybiBoZGF0YShzIHwgKGUgPDwgMTApIHwgKG0gPj4gMTMpKTsKCQl9Cgl9Cgp9Ly9uYW1lc3BhY2UgZGV0YWlsCn0vL25hbWVzcGFjZSBnbG0K