LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAyNS5zZWFyY2guY3BwIC0gdGVzdCBleGVyY2lzaW5nIDI1LjEuOSBbbGliLmFsZy5zZWFyY2hdCiAqCiAqICRJZCQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlICBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAqIGNvbnRyaWJ1dG9yICBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgIHRoZSBOT1RJQ0UgIGZpbGUgZGlzdHJpYnV0ZWQKICogd2l0aCAgdGhpcyAgd29yayAgZm9yICBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICByZWdhcmRpbmcgIGNvcHlyaWdodAogKiBvd25lcnNoaXAuICAgVGhlIEFTRiAgbGljZW5zZXMgdGhpcyAgZmlsZSB0byAgeW91IHVuZGVyICB0aGUgQXBhY2hlCiAqIExpY2Vuc2UsIFZlcnNpb24gIDIuMCAodGhlICAiTGljZW5zZSIpOyB5b3UgbWF5ICBub3QgdXNlICB0aGlzIGZpbGUKICogZXhjZXB0IGluICBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICAgWW91IG1heSBvYnRhaW4gIGEgY29weSBvZgogKiB0aGUgTGljZW5zZSBhdAogKgogKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyAgT0YgQU5ZICBLSU5ELCBlaXRoZXIgIGV4cHJlc3Mgb3IKICogaW1wbGllZC4gICBTZWUgIHRoZSBMaWNlbnNlICBmb3IgIHRoZSAgc3BlY2lmaWMgbGFuZ3VhZ2UgIGdvdmVybmluZwogKiBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqCiAqIENvcHlyaWdodCAxOTk0LTIwMDUgUm9ndWUgV2F2ZSBTb2Z0d2FyZS4KICogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDxhbGdvcml0aG0+ICAgIC8vIGZvciBzZWFyY2gsIHNlYXJjaF9uCiNpbmNsdWRlIDxjc3RyaW5nPiAgICAgIC8vIGZvciBzdHJsZW4KCiNpbmNsdWRlIDxyd19hbGdfdGVzdC5oPgojaW5jbHVkZSA8cndfdmFsdWUuaD4gICAvLyBmb3IgVXNlckNsYXNzCiNpbmNsdWRlIDxyd19kcml2ZXIuaD4gIC8vIGZvciByd190ZXN0KCkKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCl9SV1NURF9OQU1FU1BBQ0UgKHN0ZCkgeyAKCi8vIGRpc2FibGUgZXhwbGljaXQgaW5zdGFudGlhdGlvbiBmb3IgY29tcGlsZXJzIChsaWtlIE1TVkMpCi8vIHRoYXQgY2FuJ3QgaGFuZGxlIGl0CiNpZm5kZWYgX1JXU1REX05PX0VYUExJQ0lUX0lOU1RBTlRJQVRJT04KCi8vIGluc3RhbnRpYXRlIGVhY2ggYWxnb3JpdGhtIG9uIGFsbCBraW5kcyBvZiBpdGVyYXRvcnMKLy8gaXQgaXMgcmVxdWlyZWQgdG8gd29yayB3aXRoICh0aGUgYWxnb3JpdGhtIG1heSBkZWxlZ2F0ZQovLyB0byBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIHNwZWNpYWxpemVkIGZvciBlYWNoIGtpbmQKLy8gb2YgaXRlcmF0b3IpCnRlbXBsYXRlCkZ3ZEl0ZXI8ZXFfY29tcDxiYXNlPD4gPiA+CnNlYXJjaCAoRndkSXRlcjxlcV9jb21wPGJhc2U8PiA+ID4sIAogICAgICAgIEZ3ZEl0ZXI8ZXFfY29tcDxiYXNlPD4gPiA+LCAKICAgICAgICBGd2RJdGVyPGVxX2NvbXA8YmFzZTw+ID4gPiwgCiAgICAgICAgRndkSXRlcjxlcV9jb21wPGJhc2U8PiA+ID4pOwoKdGVtcGxhdGUKQmlkaXJJdGVyPGVxX2NvbXA8YmFzZTw+ID4gPgpzZWFyY2ggKEJpZGlySXRlcjxlcV9jb21wPGJhc2U8PiA+ID4sIAogICAgICAgIEJpZGlySXRlcjxlcV9jb21wPGJhc2U8PiA+ID4sIAogICAgICAgIEJpZGlySXRlcjxlcV9jb21wPGJhc2U8PiA+ID4sIAogICAgICAgIEJpZGlySXRlcjxlcV9jb21wPGJhc2U8PiA+ID4pOwoKdGVtcGxhdGUKUmFuZG9tQWNjZXNzSXRlcjxlcV9jb21wPGJhc2U8PiA+ID4Kc2VhcmNoIChSYW5kb21BY2Nlc3NJdGVyPGVxX2NvbXA8YmFzZTw+ID4gPiwgCiAgICAgICAgUmFuZG9tQWNjZXNzSXRlcjxlcV9jb21wPGJhc2U8PiA+ID4sIAogICAgICAgIFJhbmRvbUFjY2Vzc0l0ZXI8ZXFfY29tcDxiYXNlPD4gPiA+LCAKICAgICAgICBSYW5kb21BY2Nlc3NJdGVyPGVxX2NvbXA8YmFzZTw+ID4gPik7Cgp0ZW1wbGF0ZQpGd2RJdGVyPGVxX2NvbXA8YmFzZTw+ID4gPgpzZWFyY2ggKEZ3ZEl0ZXI8ZXFfY29tcDxiYXNlPD4gPiA+LCAKICAgICAgICBGd2RJdGVyPGVxX2NvbXA8YmFzZTw+ID4gPiwgCiAgICAgICAgRndkSXRlcjxlcV9jb21wPGJhc2U8PiA+ID4sIAogICAgICAgIEZ3ZEl0ZXI8ZXFfY29tcDxiYXNlPD4gPiA+LCAKICAgICAgICBiaW5hcnlfcHJlZGljYXRlPGVxX2NvbXA8YmFzZTw+ID4gPik7Cgp0ZW1wbGF0ZQpCaWRpckl0ZXI8ZXFfY29tcDxiYXNlPD4gPiA+CnNlYXJjaCAoQmlkaXJJdGVyPGVxX2NvbXA8YmFzZTw+ID4gPiwgCiAgICAgICAgQmlkaXJJdGVyPGVxX2NvbXA8YmFzZTw+ID4gPiwgCiAgICAgICAgQmlkaXJJdGVyPGVxX2NvbXA8YmFzZTw+ID4gPiwgCiAgICAgICAgQmlkaXJJdGVyPGVxX2NvbXA8YmFzZTw+ID4gPiwgCiAgICAgICAgYmluYXJ5X3ByZWRpY2F0ZTxlcV9jb21wPGJhc2U8PiA+ID4pOwoKdGVtcGxhdGUKUmFuZG9tQWNjZXNzSXRlcjxlcV9jb21wPGJhc2U8PiA+ID4Kc2VhcmNoIChSYW5kb21BY2Nlc3NJdGVyPGVxX2NvbXA8YmFzZTw+ID4gPiwgCiAgICAgICAgUmFuZG9tQWNjZXNzSXRlcjxlcV9jb21wPGJhc2U8PiA+ID4sIAogICAgICAgIFJhbmRvbUFjY2Vzc0l0ZXI8ZXFfY29tcDxiYXNlPD4gPiA+LCAKICAgICAgICBSYW5kb21BY2Nlc3NJdGVyPGVxX2NvbXA8YmFzZTw+ID4gPiwgCiAgICAgICAgYmluYXJ5X3ByZWRpY2F0ZTxlcV9jb21wPGJhc2U8PiA+ID4pOwoKdGVtcGxhdGUKRndkSXRlcjxlcV9jb21wPGJhc2U8PiA+ID4Kc2VhcmNoX24gKEZ3ZEl0ZXI8ZXFfY29tcDxiYXNlPD4gPiA+LCAKICAgICAgICAgIEZ3ZEl0ZXI8ZXFfY29tcDxiYXNlPD4gPiA+LCAKICAgICAgICAgIFNpemU8aW50PiwgY29uc3QgZXFfY29tcDxiYXNlPD4gPiYpOwoKdGVtcGxhdGUKQmlkaXJJdGVyPGVxX2NvbXA8YmFzZTw+ID4gPgpzZWFyY2hfbiAoQmlkaXJJdGVyPGVxX2NvbXA8YmFzZTw+ID4gPiwgCiAgICAgICAgICBCaWRpckl0ZXI8ZXFfY29tcDxiYXNlPD4gPiA+LCAKICAgICAgICAgIFNpemU8aW50PiwgY29uc3QgZXFfY29tcDxiYXNlPD4gPiYpOwoKdGVtcGxhdGUKUmFuZG9tQWNjZXNzSXRlcjxlcV9jb21wPGJhc2U8PiA+ID4Kc2VhcmNoX24gKFJhbmRvbUFjY2Vzc0l0ZXI8ZXFfY29tcDxiYXNlPD4gPiA+LCAKICAgICAgICAgIFJhbmRvbUFjY2Vzc0l0ZXI8ZXFfY29tcDxiYXNlPD4gPiA+LCAKICAgICAgICAgIFNpemU8aW50PiwgY29uc3QgZXFfY29tcDxiYXNlPD4gPiYpOwoKdGVtcGxhdGUKRndkSXRlcjxlcV9jb21wPGJhc2U8PiA+ID4Kc2VhcmNoX24gKEZ3ZEl0ZXI8ZXFfY29tcDxiYXNlPD4gPiA+LCAKICAgICAgICAgIEZ3ZEl0ZXI8ZXFfY29tcDxiYXNlPD4gPiA+LCAKICAgICAgICAgIFNpemU8aW50PiwgY29uc3QgZXFfY29tcDxiYXNlPD4gPiYsIAogICAgICAgICAgYmluYXJ5X3ByZWRpY2F0ZTxlcV9jb21wPGJhc2U8PiA+ID4pOwoKdGVtcGxhdGUKQmlkaXJJdGVyPGVxX2NvbXA8YmFzZTw+ID4gPgpzZWFyY2hfbiAoQmlkaXJJdGVyPGVxX2NvbXA8YmFzZTw+ID4gPiwgCiAgICAgICAgICBCaWRpckl0ZXI8ZXFfY29tcDxiYXNlPD4gPiA+LCAKICAgICAgICAgIFNpemU8aW50PiwgY29uc3QgZXFfY29tcDxiYXNlPD4gPiYsIAogICAgICAgICAgYmluYXJ5X3ByZWRpY2F0ZTxlcV9jb21wPGJhc2U8PiA+ID4pOwoKdGVtcGxhdGUKUmFuZG9tQWNjZXNzSXRlcjxlcV9jb21wPGJhc2U8PiA+ID4Kc2VhcmNoX24gKFJhbmRvbUFjY2Vzc0l0ZXI8ZXFfY29tcDxiYXNlPD4gPiA+LCAKICAgICAgICAgIFJhbmRvbUFjY2Vzc0l0ZXI8ZXFfY29tcDxiYXNlPD4gPiA+LCAKICAgICAgICAgIFNpemU8aW50PiwgY29uc3QgZXFfY29tcDxiYXNlPD4gPiYsIAogICAgICAgICAgYmluYXJ5X3ByZWRpY2F0ZTxlcV9jb21wPGJhc2U8PiA+ID4pOwoKI2VuZGlmIC8vIF9SV1NURF9OT19FWFBMSUNJVF9JTlNUQU5USUFUSU9OCgp9ICAgLy8gbmFtZXNwYWNlIHN0ZAoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+CnN0cnVjdCBFcXVhbGl0eVByZWRpY2F0ZQp7CiAgICBzdGF0aWMgc3RkOjpzaXplX3QgZnVuY2FsbHNfOwoKICAgIC8vIGR1bW15IGFyZ3VtZW50cyBwcm92aWRlZCB0byBwcmV2ZW50IHRoZSBjbGFzcwogICAgLy8gZnJvbSBiZWluZyBkZWZhdWx0IGNvbnN0cnVjdGlibGUKICAgIEVxdWFsaXR5UHJlZGljYXRlIChUKiAvKiBkdW1teSAqLywgVSogLyogZHVtbXkgKi8pIHsKICAgICAgICBmdW5jYWxsc18gPSAwOwogICAgfQoKICAgIC8vIHJldHVybiBhIHR5cGUgb3RoZXIgdGhhbiBib29sIGJ1dCBvbmUgdGhhdCBpcyBpbXBsaWNpdGx5CiAgICAvLyBjb252ZXJ0aWJsZSB0byBib29sIHRvIGRldGVjdCBpbmNvcnJlY3QgYXNzdW1wdGlvbnMKICAgIGNsYXNzIENvbnZlcnRpYmxlVG9Cb29sIHsKICAgICAgICBib29sIHJlc3VsdF87CiAgICBwdWJsaWM6CiAgICAgICAgQ29udmVydGlibGVUb0Jvb2wgKGJvb2wgcmVzKTogcmVzdWx0XyAocmVzKSB7IC8qIGVtcHR5ICovIH0KICAgICAgICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gcmVzdWx0XzsgfQogICAgfTsKCiAgICBDb252ZXJ0aWJsZVRvQm9vbCBvcGVyYXRvcigpIChjb25zdCBUICZ4LCBjb25zdCBVICZ5KSAvKiBub24tY29uc3QgKi8gewogICAgICAgICsrZnVuY2FsbHNfOwogICAgICAgIHJldHVybiB4ID09IHk7CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4Kc3RkOjpzaXplX3QgRXF1YWxpdHlQcmVkaWNhdGU8VCwgVT46OmZ1bmNhbGxzXzsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8vIHRhZ3MgdG8gc2VsZWN0IHByZWRpY2F0ZSBvciBub24tcHJlZGljYXRlIHZlcnNpb25zCnRlbXBsYXRlIDxjbGFzcyBUPgpzdHJ1Y3QgUHJlZGljYXRlVGFnIHsKICAgIGVudW0geyBwcmVkX2lueCA9IDEgfTsKICAgIGludCBkdW1teTsKCiAgICB0eXBlZGVmIEVxdWFsaXR5UHJlZGljYXRlPFQsIFQ+IFByZWRpY2F0ZTsKfTsKCnRlbXBsYXRlIDxjbGFzcyBUPgpzdHJ1Y3QgTm9uUHJlZGljYXRlVGFnIHsKICAgIGVudW0geyBwcmVkX2lueCA9IDAgfTsKICAgIGludCBkdW1teTsKCiAgICAvLyBkdW1teSBwcmVkaWNhdGUgdG8gYmUgdXNlZCBmb3Igbm9uLXByZWRpY2F0ZQogICAgLy8gdmVyc2lvbnMgYXMgYSBwbGFjZWhvbGRlcgogICAgc3RydWN0IER1bW15UHJlZGljYXRlIHsKICAgICAgICBEdW1teVByZWRpY2F0ZShUKiwgVCopIHt9CgogICAgICAgIGJvb2wgb3BlcmF0b3IoKSAoY29uc3QgVCYgLCBjb25zdCBUJiApIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgc3RhdGljIHN0ZDo6c2l6ZV90IGZ1bmNhbGxzXzsKICAgIH07CgogICAgdHlwZWRlZiBEdW1teVByZWRpY2F0ZSBQcmVkaWNhdGU7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4Kc3RkOjpzaXplX3QgTm9uUHJlZGljYXRlVGFnPFQ+OjpEdW1teVByZWRpY2F0ZTo6ZnVuY2FsbHNfOwoKCiNpZiBkZWZpbmVkIChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPD0gMTMwMAovLyB0byBwcmV2ZW50IE1TVkMgNy4wIGVycm9yIExOSzIwMDE6IHVucmVzb2x2ZWQgZXh0ZXJuYWwgc3ltYm9sICJwdWJsaWM6Ci8vIHN0YXRpYyB1bnNpZ25lZCBpbnQKLy8gTm9uUHJlZGljYXRlVGFnPHN0cnVjdCBVc2VyQ2xhc3M+OjpEdW1teVByZWRpY2F0ZTo6ZnVuY2FsbHNfIgpzdGQ6OnNpemVfdCBOb25QcmVkaWNhdGVUYWc8VXNlckNsYXNzPjo6RHVtbXlQcmVkaWNhdGU6OmZ1bmNhbGxzXzsKI2VuZGlmCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovLyBleGVyY2lzZXMgc3RkOjpzZWFyY2goKQp0ZW1wbGF0ZSAKPGNsYXNzIEZvcndhcmRJdGVyYXRvcjEsIGNsYXNzIEZvcndhcmRJdGVyYXRvcjIsIGNsYXNzIFQsIGNsYXNzIFByZWRUYWc+CnZvaWQgdGVzdF9zZWFyY2ggKGludCBsaW5lLCAKICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc2VxMSwgY29uc3QgY2hhciAqc2VxMiwgCiAgICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90IG9mZiwgCiAgICAgICAgICAgICAgICAgIEZvcndhcmRJdGVyYXRvcjEgaXQxLCBGb3J3YXJkSXRlcmF0b3IyIGl0MiwKICAgICAgICAgICAgICAgICAgY29uc3QgVCogLCBQcmVkVGFnIHByZWRfdGFnKQp7CiAgICBjb25zdCBjaGFyKiBjb25zdCBmbmFtZSA9ICJzZWFyY2giOwogICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGl0MW5hbWUgID0gdHlwZV9uYW1lIChpdDEsIChUKikwKTsKICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBpdDJuYW1lICA9IHR5cGVfbmFtZSAoaXQyLCAoVCopMCk7CiAgICBzdGF0aWMgY29uc3QgY2hhciogY29uc3QgcHJlZG5hbWUgPSAKICAgICAgICBwcmVkX3RhZy5wcmVkX2lueCA/ICJCaW5hcnlQcmVkaWNhdGUiIDogIm9wZXJhdG9yIDwoKSI7CgogICAgY29uc3Qgc3RkOjpzaXplX3QgbnNlcTEgPSBzdGQ6OnN0cmxlbiAoc2VxMSk7CiAgICBjb25zdCBzdGQ6OnNpemVfdCBuc2VxMiA9IHN0ZDo6c3RybGVuIChzZXEyKTsKCiAgICAvLyBjb25zdHJ1Y3QgYSBzZXF1ZW5jZSBvZiBgbnNyYycgZWxlbWVudHMgdG8gcGFzcyB0byBzZWFyY2gKICAgIFQqIGNvbnN0IHhzZXExID0gVDo6ZnJvbV9jaGFyIChzZXExLCBuc2VxMSk7CiAgICBUKiBjb25zdCB4c2VxMiA9IFQ6OmZyb21fY2hhciAoc2VxMiwgbnNlcTIpOwoKICAgIC8vIGNvbnN0cnVjdCBpdGVyYXRvcnMgcG9pbnRpbmcgdG8gdGhlIGJlZ2lubmluZyBhbmQgZW5kCiAgICAvLyBvZiB0aGUgc291cmNlIHNlcXVlbmNlcwogICAgY29uc3QgRm9yd2FyZEl0ZXJhdG9yMSBmaXJzdDEgPSAKICAgICAgICBtYWtlX2l0ZXIgKHhzZXExLCB4c2VxMSwgeHNlcTEgKyBuc2VxMSwgaXQxKTsKICAgIGNvbnN0IEZvcndhcmRJdGVyYXRvcjEgbGFzdDEgID0gCiAgICAgICAgbWFrZV9pdGVyICh4c2VxMSArIG5zZXExLCB4c2VxMSwgeHNlcTEgKyBuc2VxMSwgaXQxKTsKCiAgICBjb25zdCBGb3J3YXJkSXRlcmF0b3IxIGV4cGVjdGVkID0gX1JXU1REX1NJWkVfTUFYID09IG9mZiA/CiAgICAgICAgICBsYXN0MQogICAgICAgIDogbWFrZV9pdGVyICh4c2VxMSArIG9mZiwgeHNlcTEsIHhzZXExICsgb2ZmLCBpdDEpOwoKICAgIF9SV1NURF9VTlVTRUQgKGV4cGVjdGVkKTsKCiAgICBjb25zdCBGb3J3YXJkSXRlcmF0b3IyIGZpcnN0MiA9IAogICAgICAgIG1ha2VfaXRlciAoeHNlcTIsIHhzZXEyLCB4c2VxMiArIG5zZXEyLCBpdDIpOwogICAgY29uc3QgRm9yd2FyZEl0ZXJhdG9yMiBsYXN0MiAgPSAKICAgICAgICBtYWtlX2l0ZXIgKHhzZXEyICsgbnNlcTIsIHhzZXEyLCB4c2VxMiArIG5zZXEyLCBpdDIpOwoKICAgIFQ6Om5fdG90YWxfb3BfZXFfID0gMDsKICAgIFByZWRUYWc6OlByZWRpY2F0ZTo6ZnVuY2FsbHNfID0gMDsKCiAgICB0eXBlbmFtZSBQcmVkVGFnOjpQcmVkaWNhdGUgcHJlZCgwLCAwKTsKCiAgICBjb25zdCBGb3J3YXJkSXRlcmF0b3IxIHJlc3VsdCA9IHByZWRfdGFnLnByZWRfaW54ID8KICAgICAgICBzdGQ6OnNlYXJjaCAoZmlyc3QxLCBsYXN0MSwgZmlyc3QyLCBsYXN0MiwgcHJlZCkgCiAgICAgIDogc3RkOjpzZWFyY2ggKGZpcnN0MSwgbGFzdDEsIGZpcnN0MiwgbGFzdDIpOwoKICAgIF9SV1NURF9VTlVTRUQgKHJlc3VsdCk7CgogICAgLy8gMjUuMS45LCBwMjoKICAgIC8vIGNoZWNrIHRoZSByZXR1cm5lZCBpdGVyYXRvcgogICAgcndfYXNzZXJ0IChyZXN1bHQuY3VyXyA9PSBleHBlY3RlZC5jdXJfLCAwLCBsaW5lLCAKICAgICAgICAgICAgICAgInN0ZDo6JXM8JXMsICVzJXs/fSwgJXMlezt9PiAoXCIlc1wiLCAuLi4sIFwiJXNcIikgIgogICAgICAgICAgICAgICAiZm91bmQgc3Vic2VxdWVuY2UgYXQgJXRkLCBleHBlY3RlZCBhdCAlez99ZW5kJXs7fSV6dSV7O30iLAogICAgICAgICAgICAgICBmbmFtZSwgaXQxbmFtZSwgaXQybmFtZSwgcHJlZF90YWcucHJlZF9pbngsIHByZWRuYW1lLAogICAgICAgICAgICAgICBzZXExLCBzZXEyLCByZXN1bHQuY3VyXyAtIGZpcnN0MS5jdXJfLCAKICAgICAgICAgICAgICAgX1JXU1REX1NJWkVfTUFYID09IG9mZiwgb2ZmKTsKIAogICAgLy8gMjUuMS45LCBwMzoKICAgIC8vIENvbXBsZXhpdHk6IEF0IG1vc3QgKGxhc3QxIK0gZmlyc3QxKSAqIChsYXN0MiCtIGZpcnN0MikKICAgIC8vIGFwcGxpY2F0aW9ucyBvZiB0aGUgY29ycmVzcG9uZGluZyBwcmVkaWNhdGUgb3Igb3BlcmF0b3IKICAgIGNvbnN0IHN0ZDo6c2l6ZV90IG1heF9vcF9lcSA9IG5zZXExICogbnNlcTI7CiAgICBjb25zdCBzdGQ6OnNpemVfdCBvcF9jYWxsZWQgPSBwcmVkX3RhZy5wcmVkX2lueCA/IAogICAgICAgIFByZWRUYWc6OlByZWRpY2F0ZTo6ZnVuY2FsbHNfCiAgICAgIDogVDo6bl90b3RhbF9vcF9lcV87CgogICAgcndfYXNzZXJ0IChvcF9jYWxsZWQgPD0gbWF4X29wX2VxLCAwLCBsaW5lLAogICAgICAgICAgICAgICAic3RkOjolczwlcywgJXMlez99LCAlcyV7O30+IChcIiVzXCIsIC4uLiwgXCIlc1wiKSAiCiAgICAgICAgICAgICAgICJjYWxsZWQgJXMgJXp1IHRpbWVzLCBleHBlY3RlZCBubyBtb3JlIHRoYW4gJXp1IiwKICAgICAgICAgICAgICAgZm5hbWUsIGl0MW5hbWUsIGl0Mm5hbWUsIHByZWRfdGFnLnByZWRfaW54LCBwcmVkbmFtZSwKICAgICAgICAgICAgICAgc2VxMSwgc2VxMiwgcHJlZG5hbWUsIG9wX2NhbGxlZCwgbWF4X29wX2VxKTsKCiAgICBkZWxldGVbXSB4c2VxMTsKICAgIGRlbGV0ZVtdIHhzZXEyOwp9Cgp0ZW1wbGF0ZSAKPGNsYXNzIEZvcndhcmRJdGVyYXRvcjEsIGNsYXNzIEZvcndhcmRJdGVyYXRvcjIsIGNsYXNzIFQsIGNsYXNzIFByZWRUYWc+CnZvaWQgdGVzdF9zZWFyY2ggKEZvcndhcmRJdGVyYXRvcjEgaXQxLCBGb3J3YXJkSXRlcmF0b3IyIGl0MiwgCiAgICAgICAgICAgICAgICAgIGNvbnN0IFQqICwgUHJlZFRhZyBwcmVkX3RhZykKewogICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGl0MW5hbWUgID0gdHlwZV9uYW1lIChpdDEsIChUKikwKTsKICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBpdDJuYW1lICA9IHR5cGVfbmFtZSAoaXQyLCAoVCopMCk7CiAgICBzdGF0aWMgY29uc3QgY2hhciogY29uc3QgcHJlZG5hbWUgPSAiRXF1YWxpdHlQcmVkaWNhdGUiOwoKICAgIGlmIChwcmVkX3RhZy5wcmVkX2lueCkgeyAgLy8gdXNlIHByZWRpY2F0ZQogICAgICAgIHJ3X2luZm8gKDAsIDAsIDAsIAogICAgICAgICAgICAgICAgICJzdGQ6OnNlYXJjaCAoJXMsICUxJHMsICVzLCAlMiRzLCAlcykiLAogICAgICAgICAgICAgICAgIGl0MW5hbWUsIGl0Mm5hbWUsIHByZWRuYW1lKTsKICAgIH0KICAgIGVsc2UgeyAgIC8vIG5vdCB1c2UgcHJlZGljYXRlCiAgICAgICAgcndfaW5mbyAoMCwgMCwgMCwgCiAgICAgICAgICAgICAgICAgInN0ZDo6c2VhcmNoICglcywgJTEkcywgJXMsICUyJHMpIiwKICAgICAgICAgICAgICAgICBpdDFuYW1lLCBpdDJuYW1lKTsKICAgIH0KCiNkZWZpbmUgVEVTVChzZXExLCBzZXEyLCBvZmYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB0ZXN0X3NlYXJjaCAoX19MSU5FX18sIHNlcTEsIHNlcTIsIHN0ZDo6c2l6ZV90IChvZmYpLCAgICAgICBcCiAgICAgICAgICAgICAgICAgaXQxLCBpdDIsIChUKikwLCBwcmVkX3RhZykgICAKCiAgICAvLwogICAgLy8gICAgKy0tLS0tLS0tLS0tLS0tLSBzZXF1ZW5jZSB0byBzZWFyY2ggdGhyb3VnaAogICAgLy8gICAgfCAgICArLS0tLS0tLS0tLSBzdWJzZXF1ZW5jZSB0byBzZWFyY2ggZm9yCiAgICAvLyAgICB8ICAgIHwgICAgICArLS0tIG1hdGNoIGZvdW5kIGF0IG9mZnNldAogICAgLy8gICAgdiAgICB2ICAgICAgdgogICAgVEVTVCAoIiIsICIiLCAgICAgMCk7CiAgICBURVNUICgiIiwgImEiLCAgIC0xKTsKICAgIFRFU1QgKCIiLCAiYWIiLCAgLTEpOwogICAgVEVTVCAoIiIsICJhYmMiLCAtMSk7CgogICAgVEVTVCAoImEiLCAgImFiIiwgICAtMSk7CiAgICBURVNUICgiYSIsICAiYSIsICAgICAwKTsKICAgIFRFU1QgKCJhYiIsICAiYiIsICAgIDEpOwogICAgVEVTVCAoImFiIiwgICJiYiIsICAtMSk7CgogICAgVEVTVCAoImFiYyIsICJhIiwgIDApOwogICAgVEVTVCAoImFiYyIsICJiIiwgIDEpOwogICAgVEVTVCAoImFiYyIsICJjIiwgIDIpOwoKICAgIFRFU1QgKCJhYmMiLCAiYWMiLCAtMSk7CiAgICBURVNUICgiYWJjIiwgImFiIiwgIDApOwogICAgVEVTVCAoImFiYyIsICJiYyIsICAxKTsKICAgIFRFU1QgKCJhYmMiLCAiY2QiLCAtMSk7CiAgICBURVNUICgiYWJjIiwgImFiYyIsIDApOwoKICAgIFRFU1QgKCJhYmNkIiwgImFiIiwgICAwKTsKICAgIFRFU1QgKCJhYmNkIiwgImJjIiwgICAxKTsKICAgIFRFU1QgKCJhYmNkIiwgImNkIiwgICAyKTsKICAgIFRFU1QgKCJhYmNkIiwgImFiYyIsICAwKTsKICAgIFRFU1QgKCJhYmNkIiwgImJjZCIsICAxKTsKICAgIFRFU1QgKCJhYmNkIiwgImJjZSIsIC0xKTsKCiAgICBURVNUICgiYWJjZGUiLCAiIiwgIDApOwogICAgVEVTVCAoImFiY2RlIiwgImEiLCAwKTsKICAgIFRFU1QgKCJhYmNkZSIsICJiIiwgMSk7CiAgICBURVNUICgiYWJjZGUiLCAiYyIsIDIpOwogICAgVEVTVCAoImFiY2RlIiwgImQiLCAzKTsKICAgIFRFU1QgKCJhYmNkZSIsICJlIiwgNCk7CgogICAgVEVTVCAoImFiY2RlIiwgImFiIiwgIDApOwogICAgVEVTVCAoImFiY2RlIiwgImJjIiwgIDEpOwogICAgVEVTVCAoImFiY2RlIiwgImNkIiwgIDIpOwogICAgVEVTVCAoImFiY2RlIiwgImRlIiwgIDMpOwogICAgVEVTVCAoImFiY2RlIiwgImVmIiwgLTEpOwoKICAgIFRFU1QgKCJhYmNkZSIsICJhYmMiLCAgMCk7CiAgICBURVNUICgiYWJjZGUiLCAiYmNkIiwgIDEpOwogICAgVEVTVCAoImFiY2RlIiwgImNkZSIsICAyKTsKICAgIFRFU1QgKCJhYmNkZSIsICJkZWYiLCAtMSk7CgogICAgVEVTVCAoImFiY2RlIiwgImFiY2QiLCAgMCk7CiAgICBURVNUICgiYWJjZGUiLCAiYmNkZSIsICAxKTsKICAgIFRFU1QgKCJhYmNkZSIsICJjZGVmIiwgLTEpOwoKICAgIFRFU1QgKCJhYmNkZSIsICJhYmNkZSIsICAwKTsKICAgIFRFU1QgKCJhYmNkZSIsICJiY2RlZiIsIC0xKTsKCiAgICBURVNUICgiYWJjYWJmZyIsICJhYiIsICAwKTsKICAgIFRFU1QgKCJhYmNiY2ZnIiwgImJjIiwgIDEpOwogICAgVEVTVCAoImFiY2RlY2QiLCAiY2QiLCAgMik7CiAgICBURVNUICgiYWJjZGVkZSIsICJkZSIsICAzKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8vIGV4ZXJjaXNlcyBzdGQ6OnNlYXJjaF9uKCkKdGVtcGxhdGUgPGNsYXNzIEZvcndhcmRJdGVyYXRvciwgY2xhc3MgVCwgY2xhc3MgU2l6ZSwgY2xhc3MgUHJlZFRhZz4Kdm9pZCB0ZXN0X3NlYXJjaF9uIChpbnQgbGluZSwgY29uc3QgY2hhciAqc2VxLCBTaXplIGNudCwgY29uc3QgY2hhciB2YWwsCiAgICAgICAgICAgICAgICAgICAgc3RkOjpzaXplX3Qgb2ZmLCBGb3J3YXJkSXRlcmF0b3IgaXQsIAogICAgICAgICAgICAgICAgICAgIGNvbnN0IFQqICwgUHJlZFRhZyBwcmVkX3RhZykKewogICAgY29uc3QgY2hhciogY29uc3QgZm5hbWUgPSAic2VhcmNoX24iOwogICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGl0bmFtZSAgPSB0eXBlX25hbWUgKGl0LCAoVCopMCk7CiAgICBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qgc3puYW1lICA9ICJTaXplIjsKICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCB0bmFtZSAgID0gIlVzZXJDbGFzcyI7CiAgICBzdGF0aWMgY29uc3QgY2hhciogY29uc3QgcHJlZG5hbWUgPSAKICAgICAgICBwcmVkX3RhZy5wcmVkX2lueCA/ICJCaW5hcnlQcmVkaWNhdGUiIDogIm9wZXJhdG9yIDwoKSI7CgogICAgY29uc3Qgc3RkOjpzaXplX3QgbnNlcSA9IHN0ZDo6c3RybGVuIChzZXEpOwoKICAgIC8vIGNvbnN0cnVjdCBhIHNlcXVlbmNlIG9mIGBuc3JjJyBlbGVtZW50cyB0byBwYXNzIHRvIHNlYXJjaF9uCiAgICBUKiBjb25zdCB4c2VxID0gVDo6ZnJvbV9jaGFyIChzZXEsIG5zZXEpOwoKICAgIC8vIGNvbnN0cnVjdCBpdGVyYXRvcnMgcG9pbnRpbmcgdG8gdGhlIGJlZ2lubmluZyBhbmQgZW5kCiAgICAvLyBvZiB0aGUgc291cmNlIHNlcXVlbmNlCiAgICBjb25zdCBGb3J3YXJkSXRlcmF0b3IgZmlyc3QgPSAKICAgICAgICBtYWtlX2l0ZXIgKHhzZXEsIHhzZXEsIHhzZXEgKyBuc2VxLCBpdCk7CiAgICBjb25zdCBGb3J3YXJkSXRlcmF0b3IgbGFzdCAgPSAKICAgICAgICBtYWtlX2l0ZXIgKHhzZXEgKyBuc2VxLCB4c2VxLCB4c2VxICsgbnNlcSwgaXQpOwoKICAgIGNvbnN0IEZvcndhcmRJdGVyYXRvciBleHBlY3RlZCA9IF9SV1NURF9TSVpFX01BWCA9PSBvZmYgPwogICAgICAgICAgbGFzdAogICAgICAgIDogbWFrZV9pdGVyICh4c2VxICsgb2ZmLCB4c2VxLCB4c2VxICsgb2ZmLCBpdCk7CgogICAgX1JXU1REX1VOVVNFRCAoZXhwZWN0ZWQpOwoKICAgIFQgdmFsdWU7CiAgICB2YWx1ZS5kYXRhXy52YWxfID0gdmFsOwoKICAgIFQ6Om5fdG90YWxfb3BfZXFfID0gMDsKICAgIFByZWRUYWc6OlByZWRpY2F0ZTo6ZnVuY2FsbHNfID0gMDsKCiAgICB0eXBlbmFtZSBQcmVkVGFnOjpQcmVkaWNhdGUgcHJlZCgwLCAwKTsKCiAgICBjb25zdCBGb3J3YXJkSXRlcmF0b3IgcmVzdWx0ID0gcHJlZF90YWcucHJlZF9pbnggPwogICAgICAgIHN0ZDo6c2VhcmNoX24gKGZpcnN0LCBsYXN0LCBjbnQsIHZhbHVlLCBwcmVkKSAKICAgICAgOiBzdGQ6OnNlYXJjaF9uIChmaXJzdCwgbGFzdCwgY250LCB2YWx1ZSk7CgogICAgX1JXU1REX1VOVVNFRCAocmVzdWx0KTsKCiAgICAvLyAyNS4xLjksIHA2OgogICAgLy8gY2hlY2sgdGhlIHJldHVybmVkIGl0ZXJhdG9yCiAgICByd19hc3NlcnQgKHJlc3VsdC5jdXJfID09IGV4cGVjdGVkLmN1cl8sIDAsIGxpbmUsIAogICAgICAgICAgICAgICAic3RkOjolczwlcywgJXMsICVzJXs/fSwgJXMlezt9PiAoXCIlc1wiLCAuLi4sICVkLCAnJWMnKSAiCiAgICAgICAgICAgICAgICJmb3VuZCBzdWJzZXF1ZW5jZSBhdCAldGQsIGV4cGVjdGVkIGF0ICV7P31lbmQlezp9JXp1JXs7fSIsCiAgICAgICAgICAgICAgIGZuYW1lLCBpdG5hbWUsIHN6bmFtZSwgdG5hbWUsIHByZWRfdGFnLnByZWRfaW54LCBwcmVkbmFtZSwKICAgICAgICAgICAgICAgc2VxLCBpbnQgKGNudCksIHZhbCwgcmVzdWx0LmN1cl8gLSBmaXJzdC5jdXJfLCAKICAgICAgICAgICAgICAgX1JXU1REX1NJWkVfTUFYID09IG9mZiwgb2ZmKTsKIAogICAgLy8gMjUuMS45LCBwNzoKICAgIC8vIENvbXBsZXhpdHk6IEF0IG1vc3QgKGxhc3QgrSBmaXJzdCkgKiBjb3VudAogICAgLy8gYXBwbGljYXRpb25zIG9mIHRoZSBjb3JyZXNwb25kaW5nIHByZWRpY2F0ZSBvciBvcGVyYXRvci4KICAgIC8vIEluIHJlYWwgY2FzZXMgdGhlIGNvbXBsZXhpdHkgc2hvdWxkIGJlIGF0IG1vc3QgKGxhc3QgrSBmaXJzdCkKICAgIGNvbnN0IHN0ZDo6c2l6ZV90IG1heF9vcF9lcSA9IG5zZXEgKiBjbnQ7CiAgICBjb25zdCBzdGQ6OnNpemVfdCBvcF9jYWxsZWQgPSBwcmVkX3RhZy5wcmVkX2lueCA/IAogICAgICAgIFByZWRUYWc6OlByZWRpY2F0ZTo6ZnVuY2FsbHNfCiAgICAgIDogVDo6bl90b3RhbF9vcF9lcV87CgogICAgcndfYXNzZXJ0IChvcF9jYWxsZWQgPD0gbWF4X29wX2VxLCAwLCBsaW5lLAogICAgICAgICAgICAgICAic3RkOjolczwlcywgJXMsICVzJXs/fSwgJXMlezt9PiAoXCIlc1wiLCAuLi4sICVkLCAnJWMnKSAiCiAgICAgICAgICAgICAgICJjYWxsZWQgJXMgJXp1IHRpbWVzLCBleHBlY3RlZCBubyBtb3JlIHRoYW4gJXp1IiwKICAgICAgICAgICAgICAgZm5hbWUsIGl0bmFtZSwgc3puYW1lLCB0bmFtZSwgcHJlZF90YWcucHJlZF9pbngsIHByZWRuYW1lLAogICAgICAgICAgICAgICBzZXEsIGludCAoY250KSwgdmFsLCBwcmVkbmFtZSwgb3BfY2FsbGVkLCBtYXhfb3BfZXEpOwoKICAgIGRlbGV0ZVtdIHhzZXE7Cn0KCnRlbXBsYXRlIDxjbGFzcyBGb3J3YXJkSXRlcmF0b3IsIGNsYXNzIFQsIGNsYXNzIFNpemUsIGNsYXNzIFByZWRUYWc+CnZvaWQgdGVzdF9zZWFyY2hfbiAoRm9yd2FyZEl0ZXJhdG9yIGl0LCBjb25zdCBUKiAsIAogICAgICAgICAgICAgICAgICAgIGNvbnN0IFNpemUqICwgUHJlZFRhZyBwcmVkX3RhZykKewogICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGl0bmFtZSAgID0gdHlwZV9uYW1lIChpdCwgKFQqKTApOwogICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IHN6bmFtZSAgID0gIlNpemUiOwogICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IHRuYW1lICAgID0gIlVzZXJDbGFzcyI7CiAgICBzdGF0aWMgY29uc3QgY2hhciogY29uc3QgcHJlZG5hbWUgPSAiRXF1YWxpdHlQcmVkaWNhdGUiOwoKICAgIGlmIChwcmVkX3RhZy5wcmVkX2lueCkgeyAgLy8gdXNlIHByZWRpY2F0ZQogICAgICAgIHJ3X2luZm8gKDAsIDAsIDAsIAogICAgICAgICAgICAgICAgICJzdGQ6OnNlYXJjaF9uICglcywgJTEkcywgJXMsIGNvbnN0ICVzJiwgJXMpIiwKICAgICAgICAgICAgICAgICBpdG5hbWUsIHN6bmFtZSwgdG5hbWUsIHByZWRuYW1lKTsKICAgIH0KICAgIGVsc2UgeyAgIC8vIG5vdCB1c2UgcHJlZGljYXRlCiAgICAgICAgcndfaW5mbyAoMCwgMCwgMCwgCiAgICAgICAgICAgICAgICAgInN0ZDo6c2VhcmNoX24gKCVzLCAlMSRzLCAlcywgY29uc3QgJXMmKSIsCiAgICAgICAgICAgICAgICAgaXRuYW1lLCBzem5hbWUsIHRuYW1lKTsKICAgIH0KCiN1bmRlZiBURVNUCiNkZWZpbmUgVEVTVChzZXEsIG4sIHZhbCwgb2ZmKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB0ZXN0X3NlYXJjaF9uIChfX0xJTkVfXywgc2VxLCBTaXplKG4sIDApLCB2YWwsIHN0ZDo6c2l6ZV90IChvZmYpLCBcCiAgICAgICAgICAgICAgICAgICBpdCwgKFQqKTAsIHByZWRfdGFnKQoKICAgIC8vCiAgICAvLyAgICArLS0tLS0tLS0tLS0tLS0tLS0gc2VxdWVuY2UgdG8gc2VhcmNoIHRocm91Z2gKICAgIC8vICAgIHwgICAgKy0tLS0tLS0tLS0tLSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMKICAgIC8vICAgIHwgICAgfCAgICstLS0tLS0tLSBlbGVtZW50IHZhbHVlIHRvIG1hdGNoCiAgICAvLyAgICB8ICAgIHwgICB8ICAgICstLS0gbWF0Y2ggZm91bmQgYXQgb2Zmc2V0CiAgICAvLyAgICB2ICAgIHYgICB2ICAgIHYKICAgIFRFU1QgKCIiLCAgMCwgJ3gnLCAgMCk7CiAgICBURVNUICgiIiwgIDEsICd4JywgLTEpOwogICAgVEVTVCAoIiIsICAyLCAneCcsIC0xKTsKICAgIFRFU1QgKCIiLCAtMSwgJ3gnLCAtMSk7CgogICAgVEVTVCAoIkEiLCAwLCAnQicsICAwKTsKICAgIFRFU1QgKCJBIiwgMCwgJ0EnLCAgMCk7CiAgICBURVNUICgiQSIsIDEsICdCJywgLTEpOwogICAgVEVTVCAoIkEiLCAxLCAnQScsICAwKTsKCiAgICBURVNUICgiQUIiLCAxLCAnQScsICAwKTsKICAgIFRFU1QgKCJBQiIsIDIsICdBJywgLTEpOwogICAgVEVTVCAoIkFCIiwgMSwgJ0InLCAgMSk7CiAgICBURVNUICgiQUIiLCAyLCAnQicsIC0xKTsKCiAgICBURVNUICgiQUJDIiwgMCwgJ0EnLCAwKTsKICAgIFRFU1QgKCJBQkMiLCAwLCAnQicsIDApOwogICAgVEVTVCAoIkFCQyIsIDAsICdDJywgMCk7CiAgICBURVNUICgiQUJDIiwgMCwgJ0QnLCAwKTsKCiAgICBURVNUICgiQUJDIiwgMSwgJ0EnLCAgMCk7CiAgICBURVNUICgiQUJDIiwgMSwgJ0InLCAgMSk7CiAgICBURVNUICgiQUJDIiwgMSwgJ0MnLCAgMik7CiAgICBURVNUICgiQUJDIiwgMSwgJ0QnLCAtMSk7CgogICAgVEVTVCAoIkFCQyIsIDIsICdBJywgLTEpOwogICAgVEVTVCAoIkFCQyIsIDIsICdCJywgLTEpOwogICAgVEVTVCAoIkFCQyIsIDIsICdDJywgLTEpOwogICAgVEVTVCAoIkFCQyIsIDIsICdEJywgLTEpOwoKICAgIFRFU1QgKCJBQkMiLCAtMSwgJ0EnLCAtMSk7CiAgICBURVNUICgiQUJDIiwgLTIsICdCJywgLTEpOwogICAgVEVTVCAoIkFCQyIsIC0zLCAnQycsIC0xKTsKICAgIFRFU1QgKCJBQkMiLCAtNCwgJ0QnLCAtMSk7CgogICAgVEVTVCAoIkFCQUQiLCAxLCAnQScsIDApOwogICAgVEVTVCAoIkFCQ0IiLCAxLCAnQicsIDEpOwogICAgVEVTVCAoIkFCQ0MiLCAxLCAnQycsIDIpOwoKICAgIFRFU1QgKCJBQkFBQ0FBQUQiLCAyLCAnQScsIDIpOwogICAgVEVTVCAoIkFCQ0JCREJCQiIsIDIsICdCJywgMyk7CgogICAgVEVTVCAoIkFCQUFDQUFERSIsIDMsICdBJywgLTEpOwogICAgVEVTVCAoIkFCQ0JCREJCRSIsIDMsICdCJywgLTEpOwogICAgVEVTVCAoIkFCQUFDQUFBRCIsIDMsICdBJywgIDUpOwogICAgVEVTVCAoIkFCQ0JCREJCQiIsIDMsICdCJywgIDYpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBleHRlcm4gKi8gaW50IHJ3X29wdF9ub19zZWFyY2g7ICAgICAgICAgICAgIC8vIC0tbm8tc2VhcmNoCi8qIGV4dGVybiAqLyBpbnQgcndfb3B0X25vX3NlYXJjaF9uOyAgICAgICAgICAgLy8gLS1uby1zZWFyY2hfbgovKiBleHRlcm4gKi8gaW50IHJ3X29wdF9ub19md2RfaXRlcjsgICAgICAgICAgIC8vIC0tbm8tRm9yd2FyZEl0ZXJhdG9yCi8qIGV4dGVybiAqLyBpbnQgcndfb3B0X25vX2JpZGlyX2l0ZXI7ICAgICAgICAgLy8gLS1uby1CaWRpcmVjdGlvbmFsSXRlcmF0b3IKLyogZXh0ZXJuICovIGludCByd19vcHRfbm9fcm5kX2l0ZXI7ICAgICAgICAgICAvLyAtLW5vLVJhbmRvbUFjY2Vzc0l0ZXJhdG9yCi8qIGV4dGVybiAqLyBpbnQgcndfb3B0X25vX3ByZWRpY2F0ZTsgICAgICAgICAgLy8gLS1uby1QcmVkaWNhdGUKCgp0ZW1wbGF0ZSA8Y2xhc3MgRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBULCBjbGFzcyBQcmVkVGFnPgp2b2lkIHRlc3Rfc2VhcmNoIChGb3J3YXJkSXRlcmF0b3IgaXQsIGNvbnN0IFQqLCBQcmVkVGFnIHByZWRfdGFnKQp7CiAgICBpZiAocndfb3B0X25vX2Z3ZF9pdGVyKSB7CiAgICAgICAgcndfbm90ZSAoMCwgX19GSUxFX18sIF9fTElORV9fLCAiRm9yd2FyZEl0ZXJhdG9yIHRlc3QgZGlzYWJsZWQiKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHRlc3Rfc2VhcmNoIChpdCwgRndkSXRlcjxUPigpLCAoVCopMCwgcHJlZF90YWcpOwogICAgfQoKICAgIGlmIChyd19vcHRfbm9fYmlkaXJfaXRlcikgewogICAgICAgIHJ3X25vdGUgKDAsIF9fRklMRV9fLCBfX0xJTkVfXywgIkJpZGlyZWN0aW9uYWxJdGVyYXRvciB0ZXN0IGRpc2FibGVkIik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICB0ZXN0X3NlYXJjaCAoaXQsIEJpZGlySXRlcjxUPigpLCAoVCopMCwgcHJlZF90YWcpOwogICAgfQoKICAgIGlmIChyd19vcHRfbm9fcm5kX2l0ZXIpIHsKICAgICAgICByd19ub3RlICgwLCBfX0ZJTEVfXywgX19MSU5FX18sICAiUmFuZG9tQWNjZXNzSXRlcmF0b3IgdGVzdCBkaXNhYmxlZCIpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVzdF9zZWFyY2ggKGl0LCBSYW5kb21BY2Nlc3NJdGVyPFQ+KCksIChUKikwLCBwcmVkX3RhZyk7CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBQcmVkVGFnPgp2b2lkIHRlc3Rfc2VhcmNoIChjb25zdCBUKiwgUHJlZFRhZyBwcmVkX3RhZykKewogICAgcndfaW5mbyAoMCwgMCwgMCwKICAgICAgICAgICAgICJ0ZW1wbGF0ZSA8Y2xhc3MgJXMsIGNsYXNzICUxJHMlez99LCBjbGFzcyAlcyV7O30+ICIKICAgICAgICAgICAgICJzdGQ6OnNlYXJjaCAoJTEkcywgJTEkcywgJTEkcywgJTEkcyV7P30sICUzJHMlezt9KSIsCiAgICAgICAgICAgICAiRm9yd2FyZEl0ZXJhdG9yIiwgcHJlZF90YWcucHJlZF9pbngsICJCaW5hcnlQcmVkaWNhdGUiLAogICAgICAgICAgICAgcHJlZF90YWcucHJlZF9pbngpOwoKICAgIGlmIChyd19vcHRfbm9fZndkX2l0ZXIpIHsKICAgICAgICByd19ub3RlICgwLCBfX0ZJTEVfXywgX19MSU5FX18sICJGb3J3YXJkSXRlcmF0b3IgdGVzdCBkaXNhYmxlZCIpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVzdF9zZWFyY2ggKEZ3ZEl0ZXI8VD4oKSwgKFQqKTAsIHByZWRfdGFnKTsKICAgIH0KCiAgICBpZiAocndfb3B0X25vX2JpZGlyX2l0ZXIpIHsKICAgICAgICByd19ub3RlICgwLCBfX0ZJTEVfXywgX19MSU5FX18sICJCaWRpcmVjdGlvbmFsSXRlcmF0b3IgdGVzdCBkaXNhYmxlZCIpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVzdF9zZWFyY2ggKEJpZGlySXRlcjxUPigpLCAoVCopMCwgcHJlZF90YWcpOwogICAgfQoKICAgIGlmIChyd19vcHRfbm9fcm5kX2l0ZXIpIHsKICAgICAgICByd19ub3RlICgwLCBfX0ZJTEVfXywgX19MSU5FX18sICJSYW5kb21BY2Nlc3NJdGVyYXRvciB0ZXN0IGRpc2FibGVkIik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICB0ZXN0X3NlYXJjaCAoUmFuZG9tQWNjZXNzSXRlcjxUPigpLCAoVCopMCwgcHJlZF90YWcpOwogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgU2l6ZSwgY2xhc3MgUHJlZFRhZz4Kdm9pZCB0ZXN0X3NlYXJjaF9uKGNvbnN0IFQqICwgU2l6ZSogLCBQcmVkVGFnIHByZWRfdGFnKQp7CiAgICByd19pbmZvICgwLCAwLCAwLAogICAgICAgICAgICAgInRlbXBsYXRlIDxjbGFzcyAlcywgY2xhc3MgJXMsIGNsYXNzICVzJXs/fSwgY2xhc3MgJXMlezt9PiAiCiAgICAgICAgICAgICAic3RkOjpzZWFyY2hfbiAoJTEkcywgJTEkcywgJTIkcywgJXMlez99LCAlNCRzJXs7fSkiLAogICAgICAgICAgICAgIkZvcndhcmRJdGVyYXRvciIsICJTaXplIiwgIlQiLCAKICAgICAgICAgICAgIHByZWRfdGFnLnByZWRfaW54LCAiQmluYXJ5UHJlZGljYXRlIiwgImNvbnN0IFQmIiwgCiAgICAgICAgICAgICBwcmVkX3RhZy5wcmVkX2lueCk7CgogICAgaWYgKHJ3X29wdF9ub19md2RfaXRlcikgewogICAgICAgIHJ3X25vdGUgKDAsIF9fRklMRV9fLCBfX0xJTkVfXywgIkZvcndhcmRJdGVyYXRvciB0ZXN0IGRpc2FibGVkIik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICB0ZXN0X3NlYXJjaF9uIChGd2RJdGVyPFQ+KCksIChUKikwLCAoU2l6ZSopMCwgcHJlZF90YWcpOwogICAgfQoKICAgIGlmIChyd19vcHRfbm9fYmlkaXJfaXRlcikgewogICAgICAgIHJ3X25vdGUgKDAsIF9fRklMRV9fLCBfX0xJTkVfXywgIkJpZGlyZWN0aW9uYWxJdGVyYXRvciB0ZXN0IGRpc2FibGVkIik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICB0ZXN0X3NlYXJjaF9uIChCaWRpckl0ZXI8VD4oKSwgKFQqKTAsIChTaXplKikwLCBwcmVkX3RhZyk7CiAgICB9CgogICAgaWYgKHJ3X29wdF9ub19ybmRfaXRlcikgewogICAgICAgIHJ3X25vdGUgKDAsIF9fRklMRV9fLCBfX0xJTkVfXywgIlJhbmRvbUFjY2Vzc0l0ZXJhdG9yIHRlc3QgZGlzYWJsZWQiKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHRlc3Rfc2VhcmNoX24gKFJhbmRvbUFjY2Vzc0l0ZXI8VD4oKSwgKFQqKTAsIChTaXplKikwLCBwcmVkX3RhZyk7CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnRlbXBsYXRlIDxjbGFzcyBUPgp2b2lkIHRlc3Rfc2VhcmNoIChjb25zdCBUKikKewogICAgTm9uUHJlZGljYXRlVGFnPFQ+IG5vbl9wcmVkaWNhdGVfdGFnID0geyBmYWxzZSB9OwogICAgUHJlZGljYXRlVGFnPFQ+IHByZWRpY2F0ZV90YWcgPSB7IHRydWUgfTsKCiAgICB0ZXN0X3NlYXJjaCAoKFQqKTAsIG5vbl9wcmVkaWNhdGVfdGFnKTsKCiAgICBpZiAocndfb3B0X25vX3ByZWRpY2F0ZSkgewogICAgICAgIHJ3X25vdGUgKDAsIF9fRklMRV9fLCBfX0xJTkVfXywgInN0ZDo6c2VhcmNoIHByZWRpY2F0ZSB0ZXN0IGRpc2FibGVkIik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICB0ZXN0X3NlYXJjaCAoKFQqKTAsIHByZWRpY2F0ZV90YWcpOwogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp0ZW1wbGF0ZSA8Y2xhc3MgVD4Kdm9pZCB0ZXN0X3NlYXJjaF9uIChjb25zdCBUKikKewogICAgTm9uUHJlZGljYXRlVGFnPFQ+IG5vbl9wcmVkaWNhdGVfdGFnID0geyBmYWxzZSB9OwogICAgUHJlZGljYXRlVGFnPFQ+IHByZWRpY2F0ZV90YWcgPSB7IHRydWUgfTsKCiAgICB0ZXN0X3NlYXJjaF9uICgoVCopMCwgKFNpemU8aW50PiopMCwgbm9uX3ByZWRpY2F0ZV90YWcpOwoKICAgIGlmIChyd19vcHRfbm9fcHJlZGljYXRlKSB7CiAgICAgICAgcndfbm90ZSAoMCwgX19GSUxFX18sIF9fTElORV9fLAogICAgICAgICAgICAgICAgICJzdGQ6OnNlYXJjaF9uIHByZWRpY2F0ZSB0ZXN0IGRpc2FibGVkIik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICB0ZXN0X3NlYXJjaF9uICgoVCopMCwgKFNpemU8aW50PiopMCwgcHJlZGljYXRlX3RhZyk7CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBpbnQKcnVuX3Rlc3QgKGludCwgY2hhcipbXSkKewogICAgaWYgKHJ3X29wdF9ub19zZWFyY2gpIHsKICAgICAgICByd19ub3RlICgwLCBfX0ZJTEVfXywgX19MSU5FX18sICAic3RkOjpzZWFyY2ggdGVzdCBkaXNhYmxlZCIpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVzdF9zZWFyY2ggKChVc2VyQ2xhc3MqKTApOwogICAgfQoKICAgIGlmIChyd19vcHRfbm9fc2VhcmNoX24pIHsKICAgICAgICByd19ub3RlICgwLCBfX0ZJTEVfXywgX19MSU5FX18sICAic3RkOjpzZWFyY2hfbiB0ZXN0IGRpc2FibGVkIik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICB0ZXN0X3NlYXJjaF9uICgoVXNlckNsYXNzKikwKTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKaW50IG1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCnsKICAgIHJldHVybiByd190ZXN0IChhcmdjLCBhcmd2LCBfX0ZJTEVfXywKICAgICAgICAgICAgICAgICAgICAibGliLmFsZy5zZWFyY2giLAogICAgICAgICAgICAgICAgICAgIDAgLyogbm8gY29tbWVudCAqLywgcnVuX3Rlc3QsCiAgICAgICAgICAgICAgICAgICAgInwtbm8tc2VhcmNoIyAiCiAgICAgICAgICAgICAgICAgICAgInwtbm8tc2VhcmNoX24jICIKICAgICAgICAgICAgICAgICAgICAifC1uby1Gb3J3YXJkSXRlcmF0b3IjICIKICAgICAgICAgICAgICAgICAgICAifC1uby1CaWRpcmVjdGlvbmFsSXRlcmF0b3IjICIKICAgICAgICAgICAgICAgICAgICAifC1uby1SYW5kb21BY2Nlc3NJdGVyYXRvciMgIgogICAgICAgICAgICAgICAgICAgICJ8LW5vLVByZWRpY2F0ZSIsICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAmcndfb3B0X25vX3NlYXJjaCwKICAgICAgICAgICAgICAgICAgICAmcndfb3B0X25vX3NlYXJjaF9uLAogICAgICAgICAgICAgICAgICAgICZyd19vcHRfbm9fZndkX2l0ZXIsCiAgICAgICAgICAgICAgICAgICAgJnJ3X29wdF9ub19iaWRpcl9pdGVyLAogICAgICAgICAgICAgICAgICAgICZyd19vcHRfbm9fcm5kX2l0ZXIsCiAgICAgICAgICAgICAgICAgICAgJnJ3X29wdF9ub19wcmVkaWNhdGUpOwp9Cg==