LyoKICogIEEgdGVzdCBwcm9ncmFtIGZvciBib29zdC9yYXRpb25hbC5ocHAuCiAqICBDaGFuZ2UgdGhlIHR5cGVkZWYgYXQgdGhlIGJlZ2lubmluZyBvZiBydW5fdGVzdHMoKSB0byB0cnkgb3V0IGRpZmZlcmVudAogKiAgaW50ZWdlciB0eXBlcy4gIChUaGVzZSB0ZXN0cyBhcmUgZGVzaWduZWQgb25seSBmb3Igc2lnbmVkIGludGVnZXIKICogIHR5cGVzLiAgVGhleSBzaG91bGQgd29yayBmb3Igc2hvcnQsIGludCBhbmQgbG9uZy4pCiAqCiAqICAoQykgQ29weXJpZ2h0IFN0ZXBoZW4gU2lsdmVyLCAyMDAxLiBQZXJtaXNzaW9uIHRvIGNvcHksIHVzZSwgbW9kaWZ5LCBzZWxsCiAqICBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGlzIGdyYW50ZWQgcHJvdmlkZWQgdGhpcyBjb3B5cmlnaHQgbm90aWNlCiAqICBhcHBlYXJzIGluIGFsbCBjb3BpZXMuIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IKICogIGltcGxpZWQgd2FycmFudHksIGFuZCB3aXRoIG5vIGNsYWltIGFzIHRvIGl0cyBzdWl0YWJpbGl0eSBmb3IgYW55IHB1cnBvc2UuCiAqCiAqICBJbmNvcnBvcmF0ZWQgaW50byB0aGUgYm9vc3QgcmF0aW9uYWwgbnVtYmVyIGxpYnJhcnksIGFuZCBtb2RpZmllZCBhbmQKICogIGV4dGVuZGVkLCBieSBQYXVsIE1vb3JlLCB3aXRoIHBlcm1pc3Npb24uCiAqLwoKLy8gUmV2aXNpb24gSGlzdG9yeQovLyAwNSBOb3YgMDYgIEFkZCB0ZXN0aW5nIG9mIHplcm8tdmFsdWVkIGRlbm9taW5hdG9ycyAmIGRpdmlzb3JzOyBjYXN0aW5nIHdpdGgKLy8gICAgICAgICAgICB0eXBlcyB0aGF0IGFyZSBub3QgaW1wbGljaXRseSBjb252ZXJ0aWJsZSAoRGFyeWxlIFdhbGtlcikKLy8gMDQgTm92IDA2ICBSZXNvbHZlIEdDRCBpc3N1ZSB3aXRoIGRlcHJlY2lhdGlvbiAoRGFyeWxlIFdhbGtlcikKLy8gMDIgTm92IDA2ICBBZGQgdGVzdGluZyBmb3Igb3BlcmF0b3I8KGludF90eXBlKSB3LyB1bnNpZ25lZHMgKERhcnlsZSBXYWxrZXIpCi8vIDMxIE9jdCAwNiAgQWRkIHRlc3RpbmcgZm9yIG9wZXJhdG9yPChyYXRpb25hbCkgb3ZlcmZsb3cgKERhcnlsZSBXYWxrZXIpCi8vIDE4IE9jdCAwNiAgVmFyaW91cyBmaXhlcyBmb3Igb2xkIGNvbXBpbGVycyAoSm9hcXXtbiBNIEzzcGV6IE118W96KQovLyAyNyBEZWMgMDUgIEFkZCB0ZXN0aW5nIGZvciBCb29sZWFuIGNvbnZlcnNpb24gb3BlcmF0b3IgKERhcnlsZSBXYWxrZXIpCi8vIDI0IERlYyAwNSAgQ2hhbmdlIGNvZGUgdG8gdXNlIEJvb3N0LlRlc3QgKERhcnlsZSBXYWxrZXIpCi8vIDA0IE1hciAwMSAgUGF0Y2hlcyBmb3IgSW50ZWwgQysrIGFuZCBHQ0MgKERhdmlkIEFicmFoYW1zKQoKI2RlZmluZSBCT09TVF9URVNUX01BSU4gICJCb29zdDo6UmF0aW9uYWwgdW5pdCB0ZXN0cyIKCiNpbmNsdWRlIDxib29zdC9jb25maWcuaHBwPgojaW5jbHVkZSA8Ym9vc3QvbXBsL2xpc3QuaHBwPgojaW5jbHVkZSA8Ym9vc3Qvb3BlcmF0b3JzLmhwcD4KI2luY2x1ZGUgPGJvb3N0L3ByZXByb2Nlc3Nvci9zdHJpbmdpemUuaHBwPgojaW5jbHVkZSA8Ym9vc3QvbWF0aC9jb21tb25fZmFjdG9yX3J0LmhwcD4KCiNpbmNsdWRlIDxib29zdC9yYXRpb25hbC5ocHA+CgojaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgojaW5jbHVkZSA8Ym9vc3QvdGVzdC9mbG9hdGluZ19wb2ludF9jb21wYXJpc29uLmhwcD4KI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdGVzdF9jYXNlX3RlbXBsYXRlLmhwcD4KCiNpbmNsdWRlIDxjbGltaXRzPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpc3RyZWFtPgojaW5jbHVkZSA8bGltaXRzPgojaW5jbHVkZSA8b3N0cmVhbT4KI2luY2x1ZGUgPHNzdHJlYW0+CiNpbmNsdWRlIDxzdGRleGNlcHQ+CiNpbmNsdWRlIDxzdHJpbmc+CgovLyBXZSBjYW4gb3ZlcnJpZGUgdGhpcyBvbiB0aGUgY29tcGlsZSwgYXMgLURJTlRfVFlQRT1zaG9ydCBvciB3aGF0ZXZlci4KLy8gVGhlIGRlZmF1bHQgdGVzdCBpcyBhZ2FpbnN0IHJhdGlvbmFsPGxvbmc+LgojaWZuZGVmIElOVF9UWVBFCiNkZWZpbmUgSU5UX1RZUEUgbG9uZwojZW5kaWYKCm5hbWVzcGFjZSB7CgpjbGFzcyBNeU92ZXJmbG93aW5nVW5zaWduZWQ7CgovLyBUaGlzIGlzIGEgdHJpdmlhbCB1c2VyLWRlZmluZWQgd3JhcHBlciBhcm91bmQgdGhlIGJ1aWx0IGluIGludCB0eXBlLgovLyBJdCBjYW4gYmUgdXNlZCBhcyBhIHRlc3QgdHlwZSBmb3IgcmF0aW9uYWw8PgpjbGFzcyBNeUludCA6IGJvb3N0OjpvcGVyYXRvcnM8TXlJbnQ+CnsKICAgIGZyaWVuZCBjbGFzcyBNeU92ZXJmbG93aW5nVW5zaWduZWQ7CiAgICBpbnQgdmFsOwpwdWJsaWM6CiAgICBNeUludChpbnQgbiA9IDApIDogdmFsKG4pIHt9CiAgICBmcmllbmQgTXlJbnQgb3BlcmF0b3IrIChjb25zdCBNeUludCYpOwogICAgZnJpZW5kIE15SW50IG9wZXJhdG9yLSAoY29uc3QgTXlJbnQmKTsKICAgIE15SW50JiBvcGVyYXRvcis9IChjb25zdCBNeUludCYgcmhzKSB7IHZhbCArPSByaHMudmFsOyByZXR1cm4gKnRoaXM7IH0KICAgIE15SW50JiBvcGVyYXRvci09IChjb25zdCBNeUludCYgcmhzKSB7IHZhbCAtPSByaHMudmFsOyByZXR1cm4gKnRoaXM7IH0KICAgIE15SW50JiBvcGVyYXRvcio9IChjb25zdCBNeUludCYgcmhzKSB7IHZhbCAqPSByaHMudmFsOyByZXR1cm4gKnRoaXM7IH0KICAgIE15SW50JiBvcGVyYXRvci89IChjb25zdCBNeUludCYgcmhzKSB7IHZhbCAvPSByaHMudmFsOyByZXR1cm4gKnRoaXM7IH0KICAgIE15SW50JiBvcGVyYXRvciU9IChjb25zdCBNeUludCYgcmhzKSB7IHZhbCAlPSByaHMudmFsOyByZXR1cm4gKnRoaXM7IH0KICAgIE15SW50JiBvcGVyYXRvcnw9IChjb25zdCBNeUludCYgcmhzKSB7IHZhbCB8PSByaHMudmFsOyByZXR1cm4gKnRoaXM7IH0KICAgIE15SW50JiBvcGVyYXRvciY9IChjb25zdCBNeUludCYgcmhzKSB7IHZhbCAmPSByaHMudmFsOyByZXR1cm4gKnRoaXM7IH0KICAgIE15SW50JiBvcGVyYXRvcl49IChjb25zdCBNeUludCYgcmhzKSB7IHZhbCBePSByaHMudmFsOyByZXR1cm4gKnRoaXM7IH0KICAgIGNvbnN0IE15SW50JiBvcGVyYXRvcisrKCkgeyArK3ZhbDsgcmV0dXJuICp0aGlzOyB9CiAgICBjb25zdCBNeUludCYgb3BlcmF0b3ItLSgpIHsgLS12YWw7IHJldHVybiAqdGhpczsgfQogICAgYm9vbCBvcGVyYXRvcjwgKGNvbnN0IE15SW50JiByaHMpIGNvbnN0IHsgcmV0dXJuIHZhbCA8IHJocy52YWw7IH0KICAgIGJvb2wgb3BlcmF0b3I9PSAoY29uc3QgTXlJbnQmIHJocykgY29uc3QgeyByZXR1cm4gdmFsID09IHJocy52YWw7IH0KICAgIGJvb2wgb3BlcmF0b3IhICgpIGNvbnN0IHsgcmV0dXJuICF2YWw7IH0KICAgIGZyaWVuZCBzdGQ6OmlzdHJlYW0mIG9wZXJhdG9yPj4oc3RkOjppc3RyZWFtJiwgTXlJbnQmKTsKICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiwgY29uc3QgTXlJbnQmKTsKfTsKCmlubGluZSBNeUludCBvcGVyYXRvcisoY29uc3QgTXlJbnQmIHJocykgeyByZXR1cm4gcmhzOyB9CmlubGluZSBNeUludCBvcGVyYXRvci0oY29uc3QgTXlJbnQmIHJocykgeyByZXR1cm4gTXlJbnQoLXJocy52YWwpOyB9CmlubGluZSBzdGQ6OmlzdHJlYW0mIG9wZXJhdG9yPj4oc3RkOjppc3RyZWFtJiBpcywgTXlJbnQmIGkpIHsgaXMgPj4gaS52YWw7IHJldHVybiBpczsgfQppbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IE15SW50JiBpKSB7IG9zIDw8IGkudmFsOyByZXR1cm4gb3M7IH0KaW5saW5lIE15SW50IGFicyhNeUludCByaHMpIHsgaWYgKHJocyA8IE15SW50KCkpIHJocyA9IC1yaHM7IHJldHVybiByaHM7IH0KCi8vIFRoaXMgaXMgYW4gInVuc2lnbmVkIiB3cmFwcGVyLCB0aGF0IHRocm93cyBvbiBvdmVyZmxvdy4gIEl0IGNhbiBiZSB1c2VkIHRvCi8vIHRlc3QgcmF0aW9uYWw8PiB3aGVuIGFuIG9wZXJhdGlvbiBnb2VzIG91dCBvZiBib3VuZHMuCmNsYXNzIE15T3ZlcmZsb3dpbmdVbnNpZ25lZAogICAgOiBwcml2YXRlIGJvb3N0Ojp1bml0X3N0ZXBwYWJsZTxNeU92ZXJmbG93aW5nVW5zaWduZWQ+CiAgICAsIHByaXZhdGUgYm9vc3Q6Om9yZGVyZWRfZXVjbGlkaWFuX3Jpbmdfb3BlcmF0b3JzMTxNeU92ZXJmbG93aW5nVW5zaWduZWQ+CnsKICAgIC8vIEhlbHBlciB0eXBlLWFsaWFzZXMKICAgIHR5cGVkZWYgTXlPdmVyZmxvd2luZ1Vuc2lnbmVkICBzZWxmX3R5cGU7CiAgICB0eXBlZGVmIHVuc2lnbmVkIHNlbGZfdHlwZTo6KiAgYm9vbF90eXBlOwoKICAgIC8vIE1lbWJlciBkYXRhCiAgICB1bnNpZ25lZCAgdl87CgpwdWJsaWM6CiAgICAvLyBFeGNlcHRpb24gYmFzZSBjbGFzcwogICAgY2xhc3MgZXhjZXB0aW9uX2Jhc2UgIHsgcHJvdGVjdGVkOiB2aXJ0dWFsIH5leGNlcHRpb25fYmFzZSgpIHRocm93KCkge30gfTsKCiAgICAvLyBEaXZpZGUtYnktemVybyBleGNlcHRpb24gY2xhc3MKICAgIGNsYXNzIGRpdmlkZV9ieV8wX2Vycm9yCiAgICAgICAgOiBwdWJsaWMgdmlydHVhbCBleGNlcHRpb25fYmFzZQogICAgICAgICwgcHVibGljICAgICAgICAgc3RkOjpkb21haW5fZXJyb3IKICAgIHsKICAgIHB1YmxpYzoKICAgICAgICBleHBsaWNpdCAgZGl2aWRlX2J5XzBfZXJyb3IoIHN0ZDo6c3RyaW5nIGNvbnN0ICZ3ICkKICAgICAgICAgIDogc3RkOjpkb21haW5fZXJyb3IoIHcgKSAge30KCiAgICAgICAgdmlydHVhbCAgfmRpdmlkZV9ieV8wX2Vycm9yKCkgdGhyb3coKSAge30KICAgIH07CgogICAgLy8gT3ZlcmZsb3cgZXhjZXB0aW9uIGNsYXNzCiAgICBjbGFzcyBvdmVyZmxvd2luZ19lcnJvcgogICAgICAgIDogcHVibGljIHZpcnR1YWwgZXhjZXB0aW9uX2Jhc2UKICAgICAgICAsIHB1YmxpYyAgICAgICAgIHN0ZDo6b3ZlcmZsb3dfZXJyb3IKICAgIHsKICAgIHB1YmxpYzoKICAgICAgICBleHBsaWNpdCAgb3ZlcmZsb3dpbmdfZXJyb3IoIHN0ZDo6c3RyaW5nIGNvbnN0ICZ3ICkKICAgICAgICAgIDogc3RkOjpvdmVyZmxvd19lcnJvciggdyApICB7fQoKICAgICAgICB2aXJ0dWFsICB+b3ZlcmZsb3dpbmdfZXJyb3IoKSB0aHJvdygpICB7fQogICAgfTsKCiAgICAvLyBMaWZldGltZSBtYW5hZ2VtZW50ICh1c2UgYXV0b21hdGljIGR0ciAmIGNvcHktY3RyKQogICAgICAgICAgICAgIE15T3ZlcmZsb3dpbmdVbnNpZ25lZCggdW5zaWduZWQgdiA9IDAgKSAgOiB2XyggdiApICB7fQogICAgZXhwbGljaXQgIE15T3ZlcmZsb3dpbmdVbnNpZ25lZCggTXlJbnQgY29uc3QgJm0gKSAgOiB2XyggbS52YWwgKSAge30KCiAgICAvLyBPcGVyYXRvcnMgKHVzZSBhdXRvbWF0aWMgY29weS1hc3NpZ25tZW50KTsgYXJpdGhtZXRpYyAmIGNvbXBhcmlzb24gb25seQogICAgc2VsZl90eXBlICYgIG9wZXJhdG9yICsrKCkKICAgIHsKICAgICAgICBpZiAoIHRoaXMtPnZfID09IFVJTlRfTUFYICkgIHRocm93IG92ZXJmbG93aW5nX2Vycm9yKCAiaW5jcmVtZW50IiApOwogICAgICAgIGVsc2UgKyt0aGlzLT52XzsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgICBzZWxmX3R5cGUgJiAgb3BlcmF0b3IgLS0oKQogICAgewogICAgICAgIGlmICggIXRoaXMtPnZfICkgIHRocm93IG92ZXJmbG93aW5nX2Vycm9yKCAiZGVjcmVtZW50IiApOwogICAgICAgIGVsc2UgLS10aGlzLT52XzsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgb3BlcmF0b3IgYm9vbF90eXBlKCkgY29uc3QgIHsgcmV0dXJuIHRoaXMtPnZfID8gJnNlbGZfdHlwZTo6dl8gOiAwOyB9CgogICAgYm9vbCAgICAgICBvcGVyYXRvciAhKCkgY29uc3QgIHsgcmV0dXJuICF0aGlzLT52XzsgfQogICAgc2VsZl90eXBlICBvcGVyYXRvciArKCkgY29uc3QgIHsgcmV0dXJuIHNlbGZfdHlwZSggK3RoaXMtPnZfICk7IH0KICAgIHNlbGZfdHlwZSAgb3BlcmF0b3IgLSgpIGNvbnN0ICB7IHJldHVybiBzZWxmX3R5cGUoIC10aGlzLT52XyApOyB9CgogICAgYm9vbCAgb3BlcmF0b3IgIDwoc2VsZl90eXBlIGNvbnN0ICZyKSBjb25zdCAgeyByZXR1cm4gdGhpcy0+dl8gPCAgci52XzsgfQogICAgYm9vbCAgb3BlcmF0b3IgPT0oc2VsZl90eXBlIGNvbnN0ICZyKSBjb25zdCAgeyByZXR1cm4gdGhpcy0+dl8gPT0gci52XzsgfQoKICAgIHNlbGZfdHlwZSAmICBvcGVyYXRvciAqPSggc2VsZl90eXBlIGNvbnN0ICZyICkKICAgIHsKICAgICAgICBpZiAoIHIudl8gJiYgdGhpcy0+dl8gPiBVSU5UX01BWCAvIHIudl8gKQogICAgICAgIHsKICAgICAgICAgICAgdGhyb3cgb3ZlcmZsb3dpbmdfZXJyb3IoICJvdmVyc2l6ZWQgZmFjdG9ycyIgKTsKICAgICAgICB9CiAgICAgICAgdGhpcy0+dl8gKj0gci52XzsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgICBzZWxmX3R5cGUgJiAgb3BlcmF0b3IgLz0oIHNlbGZfdHlwZSBjb25zdCAmciApCiAgICB7CiAgICAgICAgaWYgKCAhci52XyApICB0aHJvdyBkaXZpZGVfYnlfMF9lcnJvciggImRpdmlzaW9uIiApOwogICAgICAgIHRoaXMtPnZfIC89IHIudl87CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQogICAgc2VsZl90eXBlICYgIG9wZXJhdG9yICU9KCBzZWxmX3R5cGUgY29uc3QgJnIgKQogICAgewogICAgICAgIGlmICggIXIudl8gKSAgdGhyb3cgZGl2aWRlX2J5XzBfZXJyb3IoICJtb2R1bHVzIiApOwogICAgICAgIHRoaXMtPnZfICU9IHIudl87CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQogICAgc2VsZl90eXBlICYgIG9wZXJhdG9yICs9KCBzZWxmX3R5cGUgY29uc3QgJnIgKQogICAgewogICAgICAgIGlmICggdGhpcy0+dl8gPiBVSU5UX01BWCAtIHIudl8gKQogICAgICAgIHsKICAgICAgICAgICAgdGhyb3cgb3ZlcmZsb3dpbmdfZXJyb3IoICJvdmVyc2l6ZWQgYWRkZW5kcyIgKTsKICAgICAgICB9CiAgICAgICAgdGhpcy0+dl8gKz0gci52XzsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgICBzZWxmX3R5cGUgJiAgb3BlcmF0b3IgLT0oIHNlbGZfdHlwZSBjb25zdCAmciApCiAgICB7CiAgICAgICAgaWYgKCB0aGlzLT52XyA8IHIudl8gKQogICAgICAgIHsKICAgICAgICAgICAgdGhyb3cgb3ZlcmZsb3dpbmdfZXJyb3IoICJvdmVyc2l6ZWQgc3VidHJhaGVuZCIgKTsKICAgICAgICB9CiAgICAgICAgdGhpcy0+dl8gLT0gci52XzsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgLy8gSW5wdXQgJiBvdXRwdXQKICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgQ2gsIGNsYXNzIFRyID4KICAgIGZyaWVuZCAgc3RkOjpiYXNpY19pc3RyZWFtPENoLCBUcj4gJgogICAgb3BlcmF0b3IgPj4oIHN0ZDo6YmFzaWNfaXN0cmVhbTxDaCwgVHI+ICZpLCBzZWxmX3R5cGUgJnggKQogICAgeyByZXR1cm4gaSA+PiB4LnZfOyB9CgogICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBDaCwgY2xhc3MgVHIgPgogICAgZnJpZW5kICBzdGQ6OmJhc2ljX29zdHJlYW08Q2gsIFRyPiAmCiAgICBvcGVyYXRvciA8PCggc3RkOjpiYXNpY19vc3RyZWFtPENoLCBUcj4gJm8sIHNlbGZfdHlwZSBjb25zdCAmeCApCiAgICB7IHJldHVybiBvIDw8IHgudl87IH0KCn07ICAvLyBNeU92ZXJmbG93aW5nVW5zaWduZWQKCmlubGluZSBNeU92ZXJmbG93aW5nVW5zaWduZWQgYWJzKCBNeU92ZXJmbG93aW5nVW5zaWduZWQgY29uc3QgJnggKSB7IHJldHVybiB4OyB9Cgp9IC8vIG5hbWVzcGFjZQoKCi8vIFNwZWNpYWxpemUgbnVtZXJpY19saW1pdHMgZm9yIHRoZSBjdXN0b20gdHlwZXMKbmFtZXNwYWNlIHN0ZAp7Cgp0ZW1wbGF0ZSA8ID4KY2xhc3MgbnVtZXJpY19saW1pdHM8IE15SW50ID4KewogICAgdHlwZWRlZiBudW1lcmljX2xpbWl0czxpbnQ+ICBsaW1pdHNfdHlwZTsKCnB1YmxpYzoKICAgIHN0YXRpYyBjb25zdCBib29sIGlzX3NwZWNpYWxpemVkID0gbGltaXRzX3R5cGU6OmlzX3NwZWNpYWxpemVkOwoKICAgIHN0YXRpYyBNeUludCBtaW4gQk9PU1RfUFJFVkVOVF9NQUNST19TVUJTVElUVVRJT04gKCkgdGhyb3coKSAgeyByZXR1cm4gKGxpbWl0c190eXBlOjptaW4pKCk7IH0KICAgIHN0YXRpYyBNeUludCBtYXggQk9PU1RfUFJFVkVOVF9NQUNST19TVUJTVElUVVRJT04gKCkgdGhyb3coKSAgeyByZXR1cm4gKGxpbWl0c190eXBlOjptYXgpKCk7IH0KCiAgICBzdGF0aWMgY29uc3QgaW50IGRpZ2l0cyAgICAgID0gbGltaXRzX3R5cGU6OmRpZ2l0czsKICAgIHN0YXRpYyBjb25zdCBpbnQgZGlnaXRzMTAgICAgPSBsaW1pdHNfdHlwZTo6ZGlnaXRzMTA7CiAgICBzdGF0aWMgY29uc3QgYm9vbCBpc19zaWduZWQgID0gbGltaXRzX3R5cGU6OmlzX3NpZ25lZDsKICAgIHN0YXRpYyBjb25zdCBib29sIGlzX2ludGVnZXIgPSBsaW1pdHNfdHlwZTo6aXNfaW50ZWdlcjsKICAgIHN0YXRpYyBjb25zdCBib29sIGlzX2V4YWN0ICAgPSBsaW1pdHNfdHlwZTo6aXNfZXhhY3Q7CiAgICBzdGF0aWMgY29uc3QgaW50IHJhZGl4ICAgICAgID0gbGltaXRzX3R5cGU6OnJhZGl4OwogICAgc3RhdGljIE15SW50IGVwc2lsb24oKSB0aHJvdygpICAgICAgeyByZXR1cm4gbGltaXRzX3R5cGU6OmVwc2lsb24oKTsgfQogICAgc3RhdGljIE15SW50IHJvdW5kX2Vycm9yKCkgdGhyb3coKSAgeyByZXR1cm4gbGltaXRzX3R5cGU6OnJvdW5kX2Vycm9yKCk7IH0KCiAgICBzdGF0aWMgY29uc3QgaW50IG1pbl9leHBvbmVudCAgID0gbGltaXRzX3R5cGU6Om1pbl9leHBvbmVudDsKICAgIHN0YXRpYyBjb25zdCBpbnQgbWluX2V4cG9uZW50MTAgPSBsaW1pdHNfdHlwZTo6bWluX2V4cG9uZW50MTA7CiAgICBzdGF0aWMgY29uc3QgaW50IG1heF9leHBvbmVudCAgID0gbGltaXRzX3R5cGU6Om1heF9leHBvbmVudDsKICAgIHN0YXRpYyBjb25zdCBpbnQgbWF4X2V4cG9uZW50MTAgPSBsaW1pdHNfdHlwZTo6bWF4X2V4cG9uZW50MTA7CgogICAgc3RhdGljIGNvbnN0IGJvb2wgaGFzX2luZmluaXR5ICAgICAgICAgICAgID0gbGltaXRzX3R5cGU6Omhhc19pbmZpbml0eTsKICAgIHN0YXRpYyBjb25zdCBib29sIGhhc19xdWlldF9OYU4gICAgICAgICAgICA9IGxpbWl0c190eXBlOjpoYXNfcXVpZXRfTmFOOwogICAgc3RhdGljIGNvbnN0IGJvb2wgaGFzX3NpZ25hbGluZ19OYU4gICAgICAgID0gbGltaXRzX3R5cGU6Omhhc19zaWduYWxpbmdfTmFOOwogICAgc3RhdGljIGNvbnN0IGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtID0gbGltaXRzX3R5cGU6Omhhc19kZW5vcm07CiAgICBzdGF0aWMgY29uc3QgYm9vbCBoYXNfZGVub3JtX2xvc3MgICAgICAgICAgPSBsaW1pdHNfdHlwZTo6aGFzX2Rlbm9ybV9sb3NzOwoKICAgIHN0YXRpYyBNeUludCBpbmZpbml0eSgpIHRocm93KCkgICAgICB7IHJldHVybiBsaW1pdHNfdHlwZTo6aW5maW5pdHkoKTsgfQogICAgc3RhdGljIE15SW50IHF1aWV0X05hTigpIHRocm93KCkgICAgIHsgcmV0dXJuIGxpbWl0c190eXBlOjpxdWlldF9OYU4oKTsgfQogICAgc3RhdGljIE15SW50IHNpZ25hbGluZ19OYU4oKSB0aHJvdygpIHtyZXR1cm4gbGltaXRzX3R5cGU6OnNpZ25hbGluZ19OYU4oKTt9CiAgICBzdGF0aWMgTXlJbnQgZGVub3JtX21pbigpIHRocm93KCkgICAgeyByZXR1cm4gbGltaXRzX3R5cGU6OmRlbm9ybV9taW4oKTsgfQoKICAgIHN0YXRpYyBjb25zdCBib29sIGlzX2llYzU1OSAgPSBsaW1pdHNfdHlwZTo6aXNfaWVjNTU5OwogICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfYm91bmRlZCA9IGxpbWl0c190eXBlOjppc19ib3VuZGVkOwogICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfbW9kdWxvICA9IGxpbWl0c190eXBlOjppc19tb2R1bG87CgogICAgc3RhdGljIGNvbnN0IGJvb2wgdHJhcHMgICAgICAgICAgICAgICAgICAgID0gbGltaXRzX3R5cGU6OnRyYXBzOwogICAgc3RhdGljIGNvbnN0IGJvb2wgdGlueW5lc3NfYmVmb3JlICAgICAgICAgID0gbGltaXRzX3R5cGU6OnRpbnluZXNzX2JlZm9yZTsKICAgIHN0YXRpYyBjb25zdCBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZSA9IGxpbWl0c190eXBlOjpyb3VuZF9zdHlsZTsKCn07ICAvLyBzdGQ6Om51bWVyaWNfbGltaXRzPE15SW50PgoKdGVtcGxhdGUgPCA+CmNsYXNzIG51bWVyaWNfbGltaXRzPCBNeU92ZXJmbG93aW5nVW5zaWduZWQgPgp7CiAgICB0eXBlZGVmIG51bWVyaWNfbGltaXRzPHVuc2lnbmVkPiAgbGltaXRzX3R5cGU7CgpwdWJsaWM6CiAgICBzdGF0aWMgY29uc3QgYm9vbCBpc19zcGVjaWFsaXplZCA9IGxpbWl0c190eXBlOjppc19zcGVjaWFsaXplZDsKCiAgICBzdGF0aWMgTXlPdmVyZmxvd2luZ1Vuc2lnbmVkIG1pbiBCT09TVF9QUkVWRU5UX01BQ1JPX1NVQlNUSVRVVElPTiAoKSB0aHJvdygpICB7IHJldHVybiAobGltaXRzX3R5cGU6Om1pbikoKTsgfQogICAgc3RhdGljIE15T3ZlcmZsb3dpbmdVbnNpZ25lZCBtYXggQk9PU1RfUFJFVkVOVF9NQUNST19TVUJTVElUVVRJT04gKCkgdGhyb3coKSAgeyByZXR1cm4gKGxpbWl0c190eXBlOjptYXgpKCk7IH0KCiAgICBzdGF0aWMgY29uc3QgaW50IGRpZ2l0cyAgICAgID0gbGltaXRzX3R5cGU6OmRpZ2l0czsKICAgIHN0YXRpYyBjb25zdCBpbnQgZGlnaXRzMTAgICAgPSBsaW1pdHNfdHlwZTo6ZGlnaXRzMTA7CiAgICBzdGF0aWMgY29uc3QgYm9vbCBpc19zaWduZWQgID0gbGltaXRzX3R5cGU6OmlzX3NpZ25lZDsKICAgIHN0YXRpYyBjb25zdCBib29sIGlzX2ludGVnZXIgPSBsaW1pdHNfdHlwZTo6aXNfaW50ZWdlcjsKICAgIHN0YXRpYyBjb25zdCBib29sIGlzX2V4YWN0ICAgPSBsaW1pdHNfdHlwZTo6aXNfZXhhY3Q7CiAgICBzdGF0aWMgY29uc3QgaW50IHJhZGl4ICAgICAgID0gbGltaXRzX3R5cGU6OnJhZGl4OwogICAgc3RhdGljIE15T3ZlcmZsb3dpbmdVbnNpZ25lZCBlcHNpbG9uKCkgdGhyb3coKQogICAgICAgIHsgcmV0dXJuIGxpbWl0c190eXBlOjplcHNpbG9uKCk7IH0KICAgIHN0YXRpYyBNeU92ZXJmbG93aW5nVW5zaWduZWQgcm91bmRfZXJyb3IoKSB0aHJvdygpCiAgICAgICAge3JldHVybiBsaW1pdHNfdHlwZTo6cm91bmRfZXJyb3IoKTt9CgogICAgc3RhdGljIGNvbnN0IGludCBtaW5fZXhwb25lbnQgICA9IGxpbWl0c190eXBlOjptaW5fZXhwb25lbnQ7CiAgICBzdGF0aWMgY29uc3QgaW50IG1pbl9leHBvbmVudDEwID0gbGltaXRzX3R5cGU6Om1pbl9leHBvbmVudDEwOwogICAgc3RhdGljIGNvbnN0IGludCBtYXhfZXhwb25lbnQgICA9IGxpbWl0c190eXBlOjptYXhfZXhwb25lbnQ7CiAgICBzdGF0aWMgY29uc3QgaW50IG1heF9leHBvbmVudDEwID0gbGltaXRzX3R5cGU6Om1heF9leHBvbmVudDEwOwoKICAgIHN0YXRpYyBjb25zdCBib29sIGhhc19pbmZpbml0eSAgICAgICAgICAgICA9IGxpbWl0c190eXBlOjpoYXNfaW5maW5pdHk7CiAgICBzdGF0aWMgY29uc3QgYm9vbCBoYXNfcXVpZXRfTmFOICAgICAgICAgICAgPSBsaW1pdHNfdHlwZTo6aGFzX3F1aWV0X05hTjsKICAgIHN0YXRpYyBjb25zdCBib29sIGhhc19zaWduYWxpbmdfTmFOICAgICAgICA9IGxpbWl0c190eXBlOjpoYXNfc2lnbmFsaW5nX05hTjsKICAgIHN0YXRpYyBjb25zdCBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSA9IGxpbWl0c190eXBlOjpoYXNfZGVub3JtOwogICAgc3RhdGljIGNvbnN0IGJvb2wgaGFzX2Rlbm9ybV9sb3NzICAgICAgICAgID0gbGltaXRzX3R5cGU6Omhhc19kZW5vcm1fbG9zczsKCiAgICBzdGF0aWMgTXlPdmVyZmxvd2luZ1Vuc2lnbmVkIGluZmluaXR5KCkgdGhyb3coKQogICAgICAgIHsgcmV0dXJuIGxpbWl0c190eXBlOjppbmZpbml0eSgpOyB9CiAgICBzdGF0aWMgTXlPdmVyZmxvd2luZ1Vuc2lnbmVkIHF1aWV0X05hTigpIHRocm93KCkKICAgICAgICB7IHJldHVybiBsaW1pdHNfdHlwZTo6cXVpZXRfTmFOKCk7IH0KICAgIHN0YXRpYyBNeU92ZXJmbG93aW5nVW5zaWduZWQgc2lnbmFsaW5nX05hTigpIHRocm93KCkKICAgICAgICB7IHJldHVybiBsaW1pdHNfdHlwZTo6c2lnbmFsaW5nX05hTigpOyB9CiAgICBzdGF0aWMgTXlPdmVyZmxvd2luZ1Vuc2lnbmVkIGRlbm9ybV9taW4oKSB0aHJvdygpCiAgICAgICAgeyByZXR1cm4gbGltaXRzX3R5cGU6OmRlbm9ybV9taW4oKTsgfQoKICAgIHN0YXRpYyBjb25zdCBib29sIGlzX2llYzU1OSAgPSBsaW1pdHNfdHlwZTo6aXNfaWVjNTU5OwogICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfYm91bmRlZCA9IGxpbWl0c190eXBlOjppc19ib3VuZGVkOwogICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfbW9kdWxvICA9IGxpbWl0c190eXBlOjppc19tb2R1bG87CgogICAgc3RhdGljIGNvbnN0IGJvb2wgdHJhcHMgICAgICAgICAgICAgICAgICAgID0gbGltaXRzX3R5cGU6OnRyYXBzOwogICAgc3RhdGljIGNvbnN0IGJvb2wgdGlueW5lc3NfYmVmb3JlICAgICAgICAgID0gbGltaXRzX3R5cGU6OnRpbnluZXNzX2JlZm9yZTsKICAgIHN0YXRpYyBjb25zdCBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZSA9IGxpbWl0c190eXBlOjpyb3VuZF9zdHlsZTsKCn07ICAvLyBzdGQ6Om51bWVyaWNfbGltaXRzPE15T3ZlcmZsb3dpbmdVbnNpZ25lZD4KCn0gIC8vIG5hbWVzcGFjZSBzdGQKCgpuYW1lc3BhY2UgewoKLy8gVGhpcyBmaXh0dXJlIHJlcGxhY2VzIHRoZSBjaGVjayBvZiByYXRpb25hbCdzIHBhY2tpbmcgYXQgdGhlIHN0YXJ0IG9mIG1haW4uCmNsYXNzIHJhdGlvbmFsX3NpemVfY2hlY2sKewogICAgdHlwZWRlZiBJTlRfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50X3R5cGU7CiAgICB0eXBlZGVmIDo6Ym9vc3Q6OnJhdGlvbmFsPGludF90eXBlPiAgcmF0aW9uYWxfdHlwZTsKCnB1YmxpYzoKICAgIHJhdGlvbmFsX3NpemVfY2hlY2soKQogICAgewogICAgICAgIHVzaW5nIDo6c3RkOjpjb3V0OwoKICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgIGludF9uYW1lID0gQk9PU1RfUFBfU1RSSU5HSVpFKCBJTlRfVFlQRSApOwoKICAgICAgICBjb3V0IDw8ICJSdW5uaW5nIHRlc3RzIGZvciBib29zdDo6cmF0aW9uYWw8IiA8PCBpbnRfbmFtZSA8PCAiPlxuXG4iOwoKICAgICAgICBjb3V0IDw8ICJJbXBsZW1lbnRhdGlvbiBpc3N1ZTogdGhlIG1pbmltYWwgc2l6ZSBmb3IgYSByYXRpb25hbFxuIgogICAgICAgICAgICAgPDwgImlzIHR3aWNlIHRoZSBzaXplIG9mIHRoZSB1bmRlcmx5aW5nIGludGVnZXIgdHlwZS5cblxuIjsKCiAgICAgICAgY291dCA8PCAiQ2hlY2tpbmcgdG8gc2VlIGlmIHNwYWNlIGlzIGJlaW5nIHdhc3RlZC5cbiIKICAgICAgICAgICAgIDw8ICJcdHNpemVvZigiIDw8IGludF9uYW1lIDw8ICIpID09ICIgPDwgc2l6ZW9mKCBpbnRfdHlwZSApCiAgICAgICAgICAgICA8PCAiXG4iOwogICAgICAgIGNvdXQgPDwgICJcdHNpemVvZihib29zdDo6cmF0aW9uYWw8IiA8PCBpbnRfbmFtZSA8PCAiPikgPT0gIgogICAgICAgICAgICAgPDwgc2l6ZW9mKCByYXRpb25hbF90eXBlICkgPDwgIlxuXG4iOwoKICAgICAgICBjb3V0IDw8ICJJbXBsZW1lbnRhdGlvbiBoYXMgIgogICAgICAgICAgICAgPDwgKCAKICAgICAgICAgICAgICAgICAgKHNpemVvZiggcmF0aW9uYWxfdHlwZSApID4gMnUgKiBzaXplb2YoIGludF90eXBlICkpCiAgICAgICAgICAgICAgICAgID8gImluY2x1ZGVkIHBhZGRpbmcgYnl0ZXMiCiAgICAgICAgICAgICAgICAgIDogIm1pbmltYWwgc2l6ZSIKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgIDw8ICJcblxuIjsKICAgIH0KfTsKCi8vIFRoaXMgZml4dHVyZSBncm91cHMgYWxsIHRoZSBjb21tb24gc2V0dGluZ3MuCmNsYXNzIG15X2NvbmZpZ3VyYXRpb24KewpwdWJsaWM6CiAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQgPgogICAgY2xhc3MgaG9vawogICAgewogICAgcHVibGljOgogICAgICAgIHR5cGVkZWYgOjpib29zdDo6cmF0aW9uYWw8VD4gIHJhdGlvbmFsX3R5cGU7CgogICAgcHJpdmF0ZToKICAgICAgICBzdHJ1Y3QgcGFydHMgeyByYXRpb25hbF90eXBlIHBhcnRzX1sgOSBdOyB9OwoKICAgICAgICBzdGF0aWMgIHBhcnRzICBnZW5lcmF0ZV9yYXRpb25hbHMoKQogICAgICAgIHsKICAgICAgICAgICAgcmF0aW9uYWxfdHlwZSAgcjEsIHIyKCAwICksIHIzKCAxICksIHI0KCAtMyApLCByNSggNywgMiApLAogICAgICAgICAgICAgICAgICAgICAgICAgICByNiggNSwgMTUgKSwgcjcoIDE0LCAtMjEgKSwgcjgoIC00LCA2ICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHI5KCAtMTQsIC03MCApOwogICAgICAgICAgICBwYXJ0cyByZXN1bHQ7CiAgICAgICAgICAgIHJlc3VsdC5wYXJ0c19bMF0gPSByMTsKICAgICAgICAgICAgcmVzdWx0LnBhcnRzX1sxXSA9IHIyOwogICAgICAgICAgICByZXN1bHQucGFydHNfWzJdID0gcjM7CiAgICAgICAgICAgIHJlc3VsdC5wYXJ0c19bM10gPSByNDsKICAgICAgICAgICAgcmVzdWx0LnBhcnRzX1s0XSA9IHI1OwogICAgICAgICAgICByZXN1bHQucGFydHNfWzVdID0gcjY7CiAgICAgICAgICAgIHJlc3VsdC5wYXJ0c19bNl0gPSByNzsKICAgICAgICAgICAgcmVzdWx0LnBhcnRzX1s3XSA9IHI4OwogICAgICAgICAgICByZXN1bHQucGFydHNfWzhdID0gcjk7CgogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgcGFydHMgIHBfOyAgLy8gT3JkZXIgRGVwZW5kZW5jeQoKICAgIHB1YmxpYzoKICAgICAgICByYXRpb25hbF90eXBlICAoICZyXyApWyA5IF07ICAvLyBPcmRlciBEZXBlbmRlbmN5CgogICAgICAgIGhvb2soKSA6IHBfKCBnZW5lcmF0ZV9yYXRpb25hbHMoKSApLCByXyggcF8ucGFydHNfICkge30KICAgIH07Cn07CgovLyBJbnN0ZWFkIG9mIGNvbnRyb2xsaW5nIHRoZSBpbnRlZ2VyIHR5cGUgbmVlZGVkIHdpdGggYSAjZGVmaW5lLCB1c2UgYSBsaXN0IG9mCi8vIGFsbCBhdmFpbGFibGUgdHlwZXMuICBTaW5jZSB0aGUgaGVhZGVycyAjaW5jbHVkZWQgZG9uJ3QgY2hhbmdlIGJlY2F1c2Ugb2YgdGhlCi8vIGludGVnZXIgI2RlZmluZSwgb25seSB0aGUgYnVpbHQtaW4gdHlwZXMgYW5kIE15SW50IGFyZSBhdmFpbGFibGUuICAoQW55IG90aGVyCi8vIGFyYml0cmFyeSBpbnRlZ2VyIHR5cGUgaW50cm9kdWNlZCBieSB0aGUgI2RlZmluZSB3b3VsZCBnZXQgY29tcGlsZXIgZXJyb3JzCi8vIGJlY2F1c2UgaXRzIGhlYWRlciBjYW4ndCBiZSAjaW5jbHVkZWQuKQp0eXBlZGVmIDo6Ym9vc3Q6Om1wbDo6bGlzdDxzaG9ydCwgaW50LCBsb25nPiAgICAgYnVpbHRpbl9zaWduZWRfdGVzdF90eXBlczsKdHlwZWRlZiA6OmJvb3N0OjptcGw6Omxpc3Q8c2hvcnQsIGludCwgbG9uZywgTXlJbnQ+ICBhbGxfc2lnbmVkX3Rlc3RfdHlwZXM7CgovLyBXaXRob3V0IHRoZXNlIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zLCBNU1ZDKysgNi41LzcuMCBkb2VzIG5vdCBmaW5kCi8vIHNvbWUgZnJpZW5kIG9wZXJhdG9ycyBpbiBjZXJ0YWluIGNvbnRleHRzLgo6OmJvb3N0OjpyYXRpb25hbDxzaG9ydD4gICAgICAgICAgICAgICAgIGR1bW15MTsKOjpib29zdDo6cmF0aW9uYWw8aW50PiAgICAgICAgICAgICAgICAgICBkdW1teTI7Cjo6Ym9vc3Q6OnJhdGlvbmFsPGxvbmc+ICAgICAgICAgICAgICAgICAgZHVtbXkzOwo6OmJvb3N0OjpyYXRpb25hbDxNeUludD4gICAgICAgICAgICAgICAgIGR1bW15NDsKOjpib29zdDo6cmF0aW9uYWw8TXlPdmVyZmxvd2luZ1Vuc2lnbmVkPiBkdW1teTU7CgovLyBTaG91bGQgdGhlcmUgYmUgcmVndWxhciB0ZXN0cyB3aXRoIHVuc2lnbmVkIGludGVnZXIgdHlwZXM/Cgp9IC8vIG5hbWVzcGFjZQoKCi8vIENoZWNrIGlmIHJhdGlvbmFsIGlzIHRoZSBzbWFsbGVzdCBzaXplIHBvc3NpYmxlCkJPT1NUX0dMT0JBTF9GSVhUVVJFKCByYXRpb25hbF9zaXplX2NoZWNrICkKCgojaWYgQk9PU1RfQ09OVFJPTF9SQVRJT05BTF9IQVNfR0NECi8vIFRoZSBmYWN0b3JpbmcgZnVuY3Rpb24gdGVtcGxhdGUgc3VpdGUKQk9PU1RfQVVUT19URVNUX1NVSVRFKCBmYWN0b3Jpbmdfc3VpdGUgKQoKLy8gR0NEIHRlc3RzCkJPT1NUX0FVVE9fVEVTVF9DQVNFX1RFTVBMQVRFKCBnY2RfdGVzdCwgVCwgYWxsX3NpZ25lZF90ZXN0X3R5cGVzICkKewogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIGJvb3N0OjpnY2Q8VD4oICAxLCAgLTEpLCBzdGF0aWNfY2FzdDxUPiggMSkgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCBib29zdDo6Z2NkPFQ+KCAtMSwgICAxKSwgc3RhdGljX2Nhc3Q8VD4oIDEpICk7CiAgICBCT09TVF9DSEVDS19FUVVBTCggYm9vc3Q6OmdjZDxUPiggIDEsICAgMSksIHN0YXRpY19jYXN0PFQ+KCAxKSApOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIGJvb3N0OjpnY2Q8VD4oIC0xLCAgLTEpLCBzdGF0aWNfY2FzdDxUPiggMSkgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCBib29zdDo6Z2NkPFQ+KCAgMCwgICAwKSwgc3RhdGljX2Nhc3Q8VD4oIDApICk7CiAgICBCT09TVF9DSEVDS19FUVVBTCggYm9vc3Q6OmdjZDxUPiggIDcsICAgMCksIHN0YXRpY19jYXN0PFQ+KCA3KSApOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIGJvb3N0OjpnY2Q8VD4oICAwLCAgIDkpLCBzdGF0aWNfY2FzdDxUPiggOSkgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCBib29zdDo6Z2NkPFQ+KCAtNywgICAwKSwgc3RhdGljX2Nhc3Q8VD4oIDcpICk7CiAgICBCT09TVF9DSEVDS19FUVVBTCggYm9vc3Q6OmdjZDxUPiggIDAsICAtOSksIHN0YXRpY19jYXN0PFQ+KCA5KSApOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIGJvb3N0OjpnY2Q8VD4oIDQyLCAgMzApLCBzdGF0aWNfY2FzdDxUPiggNikgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCBib29zdDo6Z2NkPFQ+KCAgNiwgIC05KSwgc3RhdGljX2Nhc3Q8VD4oIDMpICk7CiAgICBCT09TVF9DSEVDS19FUVVBTCggYm9vc3Q6OmdjZDxUPigtMTAsIC0xMCksIHN0YXRpY19jYXN0PFQ+KDEwKSApOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIGJvb3N0OjpnY2Q8VD4oLTI1LCAtMTApLCBzdGF0aWNfY2FzdDxUPiggNSkgKTsKfQoKLy8gTENNIHRlc3RzCkJPT1NUX0FVVE9fVEVTVF9DQVNFX1RFTVBMQVRFKCBsY21fdGVzdCwgVCwgYWxsX3NpZ25lZF90ZXN0X3R5cGVzICkKewogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIGJvb3N0OjpsY208VD4oICAxLCAgLTEpLCBzdGF0aWNfY2FzdDxUPiggMSkgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCBib29zdDo6bGNtPFQ+KCAtMSwgICAxKSwgc3RhdGljX2Nhc3Q8VD4oIDEpICk7CiAgICBCT09TVF9DSEVDS19FUVVBTCggYm9vc3Q6OmxjbTxUPiggIDEsICAgMSksIHN0YXRpY19jYXN0PFQ+KCAxKSApOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIGJvb3N0OjpsY208VD4oIC0xLCAgLTEpLCBzdGF0aWNfY2FzdDxUPiggMSkgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCBib29zdDo6bGNtPFQ+KCAgMCwgICAwKSwgc3RhdGljX2Nhc3Q8VD4oIDApICk7CiAgICBCT09TVF9DSEVDS19FUVVBTCggYm9vc3Q6OmxjbTxUPiggIDYsICAgMCksIHN0YXRpY19jYXN0PFQ+KCAwKSApOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIGJvb3N0OjpsY208VD4oICAwLCAgIDcpLCBzdGF0aWNfY2FzdDxUPiggMCkgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCBib29zdDo6bGNtPFQ+KCAtNSwgICAwKSwgc3RhdGljX2Nhc3Q8VD4oIDApICk7CiAgICBCT09TVF9DSEVDS19FUVVBTCggYm9vc3Q6OmxjbTxUPiggIDAsICAtNCksIHN0YXRpY19jYXN0PFQ+KCAwKSApOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIGJvb3N0OjpsY208VD4oIDE4LCAgMzApLCBzdGF0aWNfY2FzdDxUPig5MCkgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCBib29zdDo6bGNtPFQ+KCAtNiwgICA5KSwgc3RhdGljX2Nhc3Q8VD4oMTgpICk7CiAgICBCT09TVF9DSEVDS19FUVVBTCggYm9vc3Q6OmxjbTxUPigtMTAsIC0xMCksIHN0YXRpY19jYXN0PFQ+KDEwKSApOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIGJvb3N0OjpsY208VD4oIDI1LCAtMTApLCBzdGF0aWNfY2FzdDxUPig1MCkgKTsKfQoKQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCiNlbmRpZiAgLy8gQk9PU1RfQ09OVFJPTF9SQVRJT05BTF9IQVNfR0NECgoKLy8gVGhlIGJhc2ljIHRlc3Qgc3VpdGUKQk9PU1RfRklYVFVSRV9URVNUX1NVSVRFKCBiYXNpY19yYXRpb25hbF9zdWl0ZSwgbXlfY29uZmlndXJhdGlvbiApCgovLyBJbml0aWFsaXphdGlvbiB0ZXN0cwpCT09TVF9BVVRPX1RFU1RfQ0FTRV9URU1QTEFURSggcmF0aW9uYWxfaW5pdGlhbGl6YXRpb25fdGVzdCwgVCwKIGFsbF9zaWduZWRfdGVzdF90eXBlcyApCnsKICAgIG15X2NvbmZpZ3VyYXRpb246Omhvb2s8VD4gIGg7CiAgICBib29zdDo6cmF0aW9uYWw8VD4gICZyMSA9IGgucl9bIDAgXSwgJnIyID0gaC5yX1sgMSBdLCAmcjMgPSBoLnJfWyAyIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICZyNCA9IGgucl9bIDMgXSwgJnI1ID0gaC5yX1sgNCBdLCAmcjYgPSBoLnJfWyA1IF0sCiAgICAgICAgICAgICAgICAgICAgICAgICZyNyA9IGgucl9bIDYgXSwgJnI4ID0gaC5yX1sgNyBdLCAmcjkgPSBoLnJfWyA4IF07CgogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIHIxLm51bWVyYXRvcigpLCBzdGF0aWNfY2FzdDxUPiggMCkgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCByMi5udW1lcmF0b3IoKSwgc3RhdGljX2Nhc3Q8VD4oIDApICk7CiAgICBCT09TVF9DSEVDS19FUVVBTCggcjMubnVtZXJhdG9yKCksIHN0YXRpY19jYXN0PFQ+KCAxKSApOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIHI0Lm51bWVyYXRvcigpLCBzdGF0aWNfY2FzdDxUPigtMykgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCByNS5udW1lcmF0b3IoKSwgc3RhdGljX2Nhc3Q8VD4oIDcpICk7CiAgICBCT09TVF9DSEVDS19FUVVBTCggcjYubnVtZXJhdG9yKCksIHN0YXRpY19jYXN0PFQ+KCAxKSApOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIHI3Lm51bWVyYXRvcigpLCBzdGF0aWNfY2FzdDxUPigtMikgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCByOC5udW1lcmF0b3IoKSwgc3RhdGljX2Nhc3Q8VD4oLTIpICk7CiAgICBCT09TVF9DSEVDS19FUVVBTCggcjkubnVtZXJhdG9yKCksIHN0YXRpY19jYXN0PFQ+KCAxKSApOwoKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCByMS5kZW5vbWluYXRvcigpLCBzdGF0aWNfY2FzdDxUPigxKSApOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIHIyLmRlbm9taW5hdG9yKCksIHN0YXRpY19jYXN0PFQ+KDEpICk7CiAgICBCT09TVF9DSEVDS19FUVVBTCggcjMuZGVub21pbmF0b3IoKSwgc3RhdGljX2Nhc3Q8VD4oMSkgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCByNC5kZW5vbWluYXRvcigpLCBzdGF0aWNfY2FzdDxUPigxKSApOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIHI1LmRlbm9taW5hdG9yKCksIHN0YXRpY19jYXN0PFQ+KDIpICk7CiAgICBCT09TVF9DSEVDS19FUVVBTCggcjYuZGVub21pbmF0b3IoKSwgc3RhdGljX2Nhc3Q8VD4oMykgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCByNy5kZW5vbWluYXRvcigpLCBzdGF0aWNfY2FzdDxUPigzKSApOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIHI4LmRlbm9taW5hdG9yKCksIHN0YXRpY19jYXN0PFQ+KDMpICk7CiAgICBCT09TVF9DSEVDS19FUVVBTCggcjkuZGVub21pbmF0b3IoKSwgc3RhdGljX2Nhc3Q8VD4oNSkgKTsKCiAgICBCT09TVF9DSEVDS19USFJPVyggYm9vc3Q6OnJhdGlvbmFsPFQ+KCAzLCAwKSwgYm9vc3Q6OmJhZF9yYXRpb25hbCApOwogICAgQk9PU1RfQ0hFQ0tfVEhST1coIGJvb3N0OjpyYXRpb25hbDxUPigtMiwgMCksIGJvb3N0OjpiYWRfcmF0aW9uYWwgKTsKICAgIEJPT1NUX0NIRUNLX1RIUk9XKCBib29zdDo6cmF0aW9uYWw8VD4oIDAsIDApLCBib29zdDo6YmFkX3JhdGlvbmFsICk7Cn0KCi8vIEFzc2lnbm1lbnQgKG5vbi1vcGVyYXRvcikgdGVzdHMKQk9PU1RfQVVUT19URVNUX0NBU0VfVEVNUExBVEUoIHJhdGlvbmFsX2Fzc2lnbl90ZXN0LCBULCBhbGxfc2lnbmVkX3Rlc3RfdHlwZXMgKQp7CiAgICBteV9jb25maWd1cmF0aW9uOjpob29rPFQ+ICBoOwogICAgYm9vc3Q6OnJhdGlvbmFsPFQ+ICYgICAgICAgciA9IGgucl9bIDAgXTsKCiAgICByLmFzc2lnbiggNiwgOCApOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIHIubnVtZXJhdG9yKCksICAgc3RhdGljX2Nhc3Q8VD4oMykgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCByLmRlbm9taW5hdG9yKCksIHN0YXRpY19jYXN0PFQ+KDQpICk7CgogICAgci5hc3NpZ24oIDAsIC03ICk7CiAgICBCT09TVF9DSEVDS19FUVVBTCggci5udW1lcmF0b3IoKSwgICBzdGF0aWNfY2FzdDxUPigwKSApOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIHIuZGVub21pbmF0b3IoKSwgc3RhdGljX2Nhc3Q8VD4oMSkgKTsKCiAgICBCT09TVF9DSEVDS19USFJPVyggci5hc3NpZ24oIDQsIDApLCBib29zdDo6YmFkX3JhdGlvbmFsICk7CiAgICBCT09TVF9DSEVDS19USFJPVyggci5hc3NpZ24oIDAsIDApLCBib29zdDo6YmFkX3JhdGlvbmFsICk7CiAgICBCT09TVF9DSEVDS19USFJPVyggci5hc3NpZ24oLTcsIDApLCBib29zdDo6YmFkX3JhdGlvbmFsICk7Cn0KCi8vIENvbXBhcmlzb24gdGVzdHMKQk9PU1RfQVVUT19URVNUX0NBU0VfVEVNUExBVEUoIHJhdGlvbmFsX2NvbXBhcmlzb25fdGVzdCwgVCwKIGFsbF9zaWduZWRfdGVzdF90eXBlcyApCnsKICAgIG15X2NvbmZpZ3VyYXRpb246Omhvb2s8VD4gIGg7CiAgICBib29zdDo6cmF0aW9uYWw8VD4gICZyMSA9IGgucl9bIDAgXSwgJnIyID0gaC5yX1sgMSBdLCAmcjMgPSBoLnJfWyAyIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICZyNCA9IGgucl9bIDMgXSwgJnI1ID0gaC5yX1sgNCBdLCAmcjYgPSBoLnJfWyA1IF0sCiAgICAgICAgICAgICAgICAgICAgICAgICZyNyA9IGgucl9bIDYgXSwgJnI4ID0gaC5yX1sgNyBdLCAmcjkgPSBoLnJfWyA4IF07CgogICAgQk9PU1RfQ0hFQ0soIHIxID09IHIyICk7CiAgICBCT09TVF9DSEVDSyggcjIgIT0gcjMgKTsKICAgIEJPT1NUX0NIRUNLKCByNCA8ICByMyApOwogICAgQk9PU1RfQ0hFQ0soIHI0IDw9IHI1ICk7CiAgICBCT09TVF9DSEVDSyggcjEgPD0gcjIgKTsKICAgIEJPT1NUX0NIRUNLKCByNSA+ICByNiApOwogICAgQk9PU1RfQ0hFQ0soIHI1ID49IHI2ICk7CiAgICBCT09TVF9DSEVDSyggcjcgPj0gcjggKTsKCiAgICBCT09TVF9DSEVDSyggIShyMyA9PSByMikgKTsKICAgIEJPT1NUX0NIRUNLKCAhKHIxICE9IHIyKSApOwogICAgQk9PU1RfQ0hFQ0soICEocjEgPCAgcjIpICk7CiAgICBCT09TVF9DSEVDSyggIShyNSA8ICByNikgKTsKICAgIEJPT1NUX0NIRUNLKCAhKHI5IDw9IHIyKSApOwogICAgQk9PU1RfQ0hFQ0soICEocjggPiAgcjcpICk7CiAgICBCT09TVF9DSEVDSyggIShyOCA+ICByMikgKTsKICAgIEJPT1NUX0NIRUNLKCAhKHI0ID49IHI2KSApOwoKICAgIEJPT1NUX0NIRUNLKCByMSA9PSBzdGF0aWNfY2FzdDxUPiggMCkgKTsKICAgIEJPT1NUX0NIRUNLKCByMiAhPSBzdGF0aWNfY2FzdDxUPigtMSkgKTsKICAgIEJPT1NUX0NIRUNLKCByMyA8ICBzdGF0aWNfY2FzdDxUPiggMikgKTsKICAgIEJPT1NUX0NIRUNLKCByNCA8PSBzdGF0aWNfY2FzdDxUPigtMykgKTsKICAgIEJPT1NUX0NIRUNLKCByNSA+ICBzdGF0aWNfY2FzdDxUPiggMykgKTsKICAgIEJPT1NUX0NIRUNLKCByNiA+PSBzdGF0aWNfY2FzdDxUPiggMCkgKTsKCiAgICBCT09TVF9DSEVDSyggc3RhdGljX2Nhc3Q8VD4oIDApID09IHIyICk7CiAgICBCT09TVF9DSEVDSyggc3RhdGljX2Nhc3Q8VD4oIDApICE9IHI3ICk7CiAgICBCT09TVF9DSEVDSyggc3RhdGljX2Nhc3Q8VD4oLTEpIDwgIHI4ICk7CiAgICBCT09TVF9DSEVDSyggc3RhdGljX2Nhc3Q8VD4oLTIpIDw9IHI5ICk7CiAgICBCT09TVF9DSEVDSyggc3RhdGljX2Nhc3Q8VD4oIDEpID4gIHIxICk7CiAgICBCT09TVF9DSEVDSyggc3RhdGljX2Nhc3Q8VD4oIDEpID49IHIzICk7CgogICAgLy8gRXh0cmEgdGVzdHMgd2l0aCB2YWx1ZXMgY2xvc2UgaW4gY29udGludWVkLWZyYWN0aW9uIG5vdGF0aW9uCiAgICBib29zdDo6cmF0aW9uYWw8VD4gY29uc3QgIHgxKCBzdGF0aWNfY2FzdDxUPig5KSwgc3RhdGljX2Nhc3Q8VD4oNCkgKTsKICAgIGJvb3N0OjpyYXRpb25hbDxUPiBjb25zdCAgeDIoIHN0YXRpY19jYXN0PFQ+KDYxKSwgc3RhdGljX2Nhc3Q8VD4oMjcpICk7CiAgICBib29zdDo6cmF0aW9uYWw8VD4gY29uc3QgIHgzKCBzdGF0aWNfY2FzdDxUPig1MiksIHN0YXRpY19jYXN0PFQ+KDIzKSApOwogICAgYm9vc3Q6OnJhdGlvbmFsPFQ+IGNvbnN0ICB4NCggc3RhdGljX2Nhc3Q8VD4oNzApLCBzdGF0aWNfY2FzdDxUPigzMSkgKTsKCiAgICBCT09TVF9DSEVDSyggeDEgPCB4MiApOwogICAgQk9PU1RfQ0hFQ0soICEoeDEgPCB4MSkgKTsKICAgIEJPT1NUX0NIRUNLKCAhKHgyIDwgeDIpICk7CiAgICBCT09TVF9DSEVDSyggISh4MiA8IHgxKSApOwogICAgQk9PU1RfQ0hFQ0soIHgyIDwgeDMgKTsKICAgIEJPT1NUX0NIRUNLKCB4NCA8IHgyICk7CiAgICBCT09TVF9DSEVDSyggISh4MyA8IHg0KSApOwogICAgQk9PU1RfQ0hFQ0soIHI3IDwgeDEgKTsgICAgIC8vIG5vdCBhY3R1YWxseSBjbG9zZTsgd2FudGVkIC12ZSB2LiArdmUgaW5zdGVhZAogICAgQk9PU1RfQ0hFQ0soICEoeDIgPCByNykgKTsKfQoKLy8gSW5jcmVtZW50ICYgZGVjcmVtZW50IHRlc3RzCkJPT1NUX0FVVE9fVEVTVF9DQVNFX1RFTVBMQVRFKCByYXRpb25hbF8xc3RlcF90ZXN0LCBULCBhbGxfc2lnbmVkX3Rlc3RfdHlwZXMgKQp7CiAgICBteV9jb25maWd1cmF0aW9uOjpob29rPFQ+ICBoOwogICAgYm9vc3Q6OnJhdGlvbmFsPFQ+ICAmcjEgPSBoLnJfWyAwIF0sICZyMiA9IGgucl9bIDEgXSwgJnIzID0gaC5yX1sgMiBdLAogICAgICAgICAgICAgICAgICAgICAgICAmcjcgPSBoLnJfWyA2IF0sICZyOCA9IGgucl9bIDcgXTsKCiAgICBCT09TVF9DSEVDSyggICByMSsrID09IHIyICk7CiAgICBCT09TVF9DSEVDSyggICByMSAgICE9IHIyICk7CiAgICBCT09TVF9DSEVDSyggICByMSAgID09IHIzICk7CiAgICBCT09TVF9DSEVDSyggLS1yMSAgID09IHIyICk7CiAgICBCT09TVF9DSEVDSyggICByOC0tID09IHI3ICk7CiAgICBCT09TVF9DSEVDSyggICByOCAgICE9IHI3ICk7CiAgICBCT09TVF9DSEVDSyggKytyOCAgID09IHI3ICk7Cn0KCi8vIEFic29sdXRlIHZhbHVlIHRlc3RzCkJPT1NUX0FVVE9fVEVTVF9DQVNFX1RFTVBMQVRFKCByYXRpb25hbF9hYnNfdGVzdCwgVCwgYWxsX3NpZ25lZF90ZXN0X3R5cGVzICkKewogICAgdHlwZWRlZiBteV9jb25maWd1cmF0aW9uOjpob29rPFQ+ICAgICAgICAgICBob29rX3R5cGU7CiAgICB0eXBlZGVmIHR5cGVuYW1lIGhvb2tfdHlwZTo6cmF0aW9uYWxfdHlwZSAgIHJhdGlvbmFsX3R5cGU7CgogICAgaG9va190eXBlICAgICAgaDsKICAgIHJhdGlvbmFsX3R5cGUgICZyMiA9IGgucl9bIDEgXSwgJnI1ID0gaC5yX1sgNCBdLCAmcjggPSBoLnJfWyA3IF07CgojaWZkZWYgQk9PU1RfTk9fQVJHVU1FTlRfREVQRU5ERU5UX0xPT0tVUAogICAgLy8gVGhpcyBpcyBhIG5hc3R5IGhhY2ssIHJlcXVpcmVkIGJlY2F1c2Ugc29tZSBjb21waWxlcnMgZG8gbm90IGltcGxlbWVudAogICAgLy8gIktvZW5pZyBMb29rdXAuIiAgQmFzaWNhbGx5LCBpZiBJIGNhbGwgYWJzKHIpLCB0aGUgQysrIHN0YW5kYXJkIHNheXMgdGhhdAogICAgLy8gdGhlIGNvbXBpbGVyIHNob3VsZCBsb29rIGZvciBhIGRlZmluaXRpb24gb2YgYWJzIGluIHRoZSBuYW1lc3BhY2Ugd2hpY2gKICAgIC8vIGNvbnRhaW5zIHIncyBjbGFzcyAoaW4gdGhpcyBjYXNlIGJvb3N0KS0tYW1vbmcgb3RoZXIgcGxhY2VzLgoKICAgIHVzaW5nIGJvb3N0OjphYnM7CiNlbmRpZgoKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCBhYnMocjIpLCByMiApOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIGFicyhyNSksIHI1ICk7CiAgICBCT09TVF9DSEVDS19FUVVBTCggYWJzKHI4KSwgcmF0aW9uYWxfdHlwZSgyLCAzKSApOwp9CgovLyBVbmFyeSBvcGVyYXRvciB0ZXN0cwpCT09TVF9BVVRPX1RFU1RfQ0FTRV9URU1QTEFURSggcmF0aW9uYWxfdW5hcnlfdGVzdCwgVCwgYWxsX3NpZ25lZF90ZXN0X3R5cGVzICkKewogICAgbXlfY29uZmlndXJhdGlvbjo6aG9vazxUPiAgaDsKICAgIGJvb3N0OjpyYXRpb25hbDxUPiAgICAgICAgICZyMiA9IGgucl9bIDEgXSwgJnIzID0gaC5yX1sgMiBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnI0ID0gaC5yX1sgMyBdLCAmcjUgPSBoLnJfWyA0IF07CgogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoICtyNSwgcjUgKTsKCiAgICBCT09TVF9DSEVDSyggLXIzICE9IHIzICk7CiAgICBCT09TVF9DSEVDS19FUVVBTCggLSgtcjMpLCByMyApOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIC1yNCwgc3RhdGljX2Nhc3Q8VD4oMykgKTsKCiAgICBCT09TVF9DSEVDSyggIXIyICk7CiAgICBCT09TVF9DSEVDSyggISFyMyApOwoKICAgIEJPT1NUX0NIRUNLKCAhIHN0YXRpY19jYXN0PGJvb2w+KHIyKSApOwogICAgQk9PU1RfQ0hFQ0soIHIzICk7Cn0KCkJPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQoKCi8vIFRoZSByYXRpb25hbCBhcml0aG1ldGljIG9wZXJhdGlvbnMgc3VpdGUKQk9PU1RfQVVUT19URVNUX1NVSVRFKCByYXRpb25hbF9hcml0aG1ldGljX3N1aXRlICkKCi8vIEFkZGl0aW9uICYgc3VidHJhY3Rpb24gdGVzdHMKQk9PU1RfQVVUT19URVNUX0NBU0VfVEVNUExBVEUoIHJhdGlvbmFsX2FkZGl0aXZlX3Rlc3QsIFQsCiBhbGxfc2lnbmVkX3Rlc3RfdHlwZXMgKQp7CiAgICB0eXBlZGVmIGJvb3N0OjpyYXRpb25hbDxUPiAgcmF0aW9uYWxfdHlwZTsKCiAgICBCT09TVF9DSEVDS19FUVVBTCggcmF0aW9uYWxfdHlwZSggMSwgMikgKyByYXRpb25hbF90eXBlKDEsIDIpLAogICAgIHN0YXRpY19jYXN0PFQ+KDEpICk7CiAgICBCT09TVF9DSEVDS19FUVVBTCggcmF0aW9uYWxfdHlwZSgxMSwgMykgKyByYXRpb25hbF90eXBlKDEsIDIpLAogICAgIHJhdGlvbmFsX3R5cGUoIDI1LCAgNikgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCByYXRpb25hbF90eXBlKC04LCAzKSArIHJhdGlvbmFsX3R5cGUoMSwgNSksCiAgICAgcmF0aW9uYWxfdHlwZSgtMzcsIDE1KSApOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIHJhdGlvbmFsX3R5cGUoLTcsIDYpICsgcmF0aW9uYWxfdHlwZSgxLCA3KSwKICAgICByYXRpb25hbF90eXBlKCAgMSwgIDcpIC0gcmF0aW9uYWxfdHlwZSg3LCA2KSApOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIHJhdGlvbmFsX3R5cGUoMTMsIDUpIC0gcmF0aW9uYWxfdHlwZSgxLCAyKSwKICAgICByYXRpb25hbF90eXBlKCAyMSwgMTApICk7CiAgICBCT09TVF9DSEVDS19FUVVBTCggcmF0aW9uYWxfdHlwZSgyMiwgMykgKyBzdGF0aWNfY2FzdDxUPigxKSwKICAgICByYXRpb25hbF90eXBlKCAyNSwgIDMpICk7CiAgICBCT09TVF9DSEVDS19FUVVBTCggcmF0aW9uYWxfdHlwZSgxMiwgNykgLSBzdGF0aWNfY2FzdDxUPigyKSwKICAgICByYXRpb25hbF90eXBlKCAtMiwgIDcpICk7CiAgICBCT09TVF9DSEVDS19FUVVBTCggICAgc3RhdGljX2Nhc3Q8VD4oMykgKyByYXRpb25hbF90eXBlKDQsIDUpLAogICAgIHJhdGlvbmFsX3R5cGUoIDE5LCAgNSkgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCAgICBzdGF0aWNfY2FzdDxUPig0KSAtIHJhdGlvbmFsX3R5cGUoOSwgMiksCiAgICAgcmF0aW9uYWxfdHlwZSggLTEsICAyKSApOwoKICAgIHJhdGlvbmFsX3R5cGUgIHIoIDExICk7CgogICAgciAtPSByYXRpb25hbF90eXBlKCAyMCwgMyApOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIHIsIHJhdGlvbmFsX3R5cGUoMTMsICAzKSApOwoKICAgIHIgKz0gcmF0aW9uYWxfdHlwZSggMSwgMiApOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIHIsIHJhdGlvbmFsX3R5cGUoMjksICA2KSApOwoKICAgIHIgLT0gc3RhdGljX2Nhc3Q8VD4oIDUgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCByLCByYXRpb25hbF90eXBlKCAxLCAtNikgKTsKCiAgICByICs9IHJhdGlvbmFsX3R5cGUoIDEsIDUgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCByLCByYXRpb25hbF90eXBlKCAxLCAzMCkgKTsKCiAgICByICs9IHN0YXRpY19jYXN0PFQ+KCAyICk7CiAgICBCT09TVF9DSEVDS19FUVVBTCggciwgcmF0aW9uYWxfdHlwZSg2MSwgMzApICk7Cn0KCi8vIEFzc2lnbm1lbnQgdGVzdHMKQk9PU1RfQVVUT19URVNUX0NBU0VfVEVNUExBVEUoIHJhdGlvbmFsX2Fzc2lnbm1lbnRfdGVzdCwgVCwKIGFsbF9zaWduZWRfdGVzdF90eXBlcyApCnsKICAgIHR5cGVkZWYgYm9vc3Q6OnJhdGlvbmFsPFQ+ICByYXRpb25hbF90eXBlOwoKICAgIHJhdGlvbmFsX3R5cGUgIHI7CgogICAgciA9IHJhdGlvbmFsX3R5cGUoIDEsIDEwICk7CiAgICBCT09TVF9DSEVDS19FUVVBTCggciwgcmF0aW9uYWxfdHlwZSggMSwgMTApICk7CgogICAgciA9IHN0YXRpY19jYXN0PFQ+KCAtOSApOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIHIsIHJhdGlvbmFsX3R5cGUoLTksICAxKSApOwp9CgovLyBNdWx0aXBsaWNhdGlvbiB0ZXN0cwpCT09TVF9BVVRPX1RFU1RfQ0FTRV9URU1QTEFURSggcmF0aW9uYWxfbXVsdGlwbGljYXRpb25fdGVzdCwgVCwKIGFsbF9zaWduZWRfdGVzdF90eXBlcyApCnsKICAgIHR5cGVkZWYgYm9vc3Q6OnJhdGlvbmFsPFQ+ICByYXRpb25hbF90eXBlOwoKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCByYXRpb25hbF90eXBlKDEsIDMpICogcmF0aW9uYWxfdHlwZSgtMywgNCksCiAgICAgcmF0aW9uYWxfdHlwZSgtMSwgNCkgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCByYXRpb25hbF90eXBlKDIsIDUpICogc3RhdGljX2Nhc3Q8VD4oNyksCiAgICAgcmF0aW9uYWxfdHlwZSgxNCwgNSkgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCAgc3RhdGljX2Nhc3Q8VD4oLTIpICogcmF0aW9uYWxfdHlwZSgxLCA2KSwKICAgICByYXRpb25hbF90eXBlKC0xLCAzKSApOwoKICAgIHJhdGlvbmFsX3R5cGUgIHIgPSByYXRpb25hbF90eXBlKCAzLCA3ICk7CgogICAgciAqPSBzdGF0aWNfY2FzdDxUPiggMTQgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCByLCBzdGF0aWNfY2FzdDxUPig2KSApOwoKICAgIHIgKj0gcmF0aW9uYWxfdHlwZSggMywgOCApOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIHIsIHJhdGlvbmFsX3R5cGUoOSwgNCkgKTsKfQoKLy8gRGl2aXNpb24gdGVzdHMKQk9PU1RfQVVUT19URVNUX0NBU0VfVEVNUExBVEUoIHJhdGlvbmFsX2RpdmlzaW9uX3Rlc3QsIFQsCiBhbGxfc2lnbmVkX3Rlc3RfdHlwZXMgKQp7CiAgICB0eXBlZGVmIGJvb3N0OjpyYXRpb25hbDxUPiAgcmF0aW9uYWxfdHlwZTsKCiAgICBCT09TVF9DSEVDS19FUVVBTCggcmF0aW9uYWxfdHlwZSgtMSwgMjApIC8gcmF0aW9uYWxfdHlwZSg0LCA1KSwKICAgICByYXRpb25hbF90eXBlKC0xLCAxNikgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCByYXRpb25hbF90eXBlKCA1LCAgNikgLyBzdGF0aWNfY2FzdDxUPig3KSwKICAgICByYXRpb25hbF90eXBlKCA1LCA0MikgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCAgICAgc3RhdGljX2Nhc3Q8VD4oOCkgLyByYXRpb25hbF90eXBlKDIsIDcpLAogICAgIHN0YXRpY19jYXN0PFQ+KDI4KSApOwoKICAgIEJPT1NUX0NIRUNLX1RIUk9XKCByYXRpb25hbF90eXBlKDIzLCAxNykgLyByYXRpb25hbF90eXBlKCksCiAgICAgYm9vc3Q6OmJhZF9yYXRpb25hbCApOwogICAgQk9PU1RfQ0hFQ0tfVEhST1coIHJhdGlvbmFsX3R5cGUoIDQsIDE1KSAvIHN0YXRpY19jYXN0PFQ+KDApLAogICAgIGJvb3N0OjpiYWRfcmF0aW9uYWwgKTsKCiAgICByYXRpb25hbF90eXBlICByID0gcmF0aW9uYWxfdHlwZSggNCwgMyApOwoKICAgIHIgLz0gcmF0aW9uYWxfdHlwZSggNSwgNCApOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIHIsIHJhdGlvbmFsX3R5cGUoMTYsIDE1KSApOwoKICAgIHIgLz0gc3RhdGljX2Nhc3Q8VD4oIDQgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCByLCByYXRpb25hbF90eXBlKCA0LCAxNSkgKTsKCiAgICBCT09TVF9DSEVDS19USFJPVyggciAvPSByYXRpb25hbF90eXBlKCksIGJvb3N0OjpiYWRfcmF0aW9uYWwgKTsKICAgIEJPT1NUX0NIRUNLX1RIUk9XKCByIC89IHN0YXRpY19jYXN0PFQ+KDApLCBib29zdDo6YmFkX3JhdGlvbmFsICk7CgogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIHJhdGlvbmFsX3R5cGUoLTEpIC8gcmF0aW9uYWxfdHlwZSgtMyksCiAgICAgcmF0aW9uYWxfdHlwZSgxLCAzKSApOwp9CgovLyBUZXN0cyBmb3Igb3BlcmF0aW9ucyBvbiBzZWxmCkJPT1NUX0FVVE9fVEVTVF9DQVNFX1RFTVBMQVRFKCByYXRpb25hbF9zZWxmX29wZXJhdGlvbnNfdGVzdCwgVCwKIGFsbF9zaWduZWRfdGVzdF90eXBlcyApCnsKICAgIHR5cGVkZWYgYm9vc3Q6OnJhdGlvbmFsPFQ+ICByYXRpb25hbF90eXBlOwoKICAgIHJhdGlvbmFsX3R5cGUgIHIgPSByYXRpb25hbF90eXBlKCA0LCAzICk7CgogICAgciArPSByOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIHIsIHJhdGlvbmFsX3R5cGUoIDgsIDMpICk7CgogICAgciAqPSByOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIHIsIHJhdGlvbmFsX3R5cGUoNjQsIDkpICk7CgogICAgciAvPSByOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIHIsIHJhdGlvbmFsX3R5cGUoIDEsIDEpICk7CgogICAgciAtPSByOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIHIsIHJhdGlvbmFsX3R5cGUoIDAsIDEpICk7CgogICAgQk9PU1RfQ0hFQ0tfVEhST1coIHIgLz0gciwgYm9vc3Q6OmJhZF9yYXRpb25hbCApOwp9CgpCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKCgovLyBUaGUgbm9uLWJhc2ljIHJhdGlvbmFsIG9wZXJhdGlvbnMgc3VpdGUKQk9PU1RfQVVUT19URVNUX1NVSVRFKCByYXRpb25hbF9leHRyYXNfc3VpdGUgKQoKLy8gT3V0cHV0IHRlc3QKQk9PU1RfQVVUT19URVNUX0NBU0VfVEVNUExBVEUoIHJhdGlvbmFsX291dHB1dF90ZXN0LCBULCBhbGxfc2lnbmVkX3Rlc3RfdHlwZXMgKQp7CiAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gIG9zczsKICAgIAogICAgb3NzIDw8IGJvb3N0OjpyYXRpb25hbDxUPiggNDQsIDE0ICk7CiAgICBCT09TVF9DSEVDS19FUVVBTCggb3NzLnN0cigpLCAiMjIvNyIgKTsKfQoKLy8gSW5wdXQgdGVzdCwgZmFpbGluZwpCT09TVF9BVVRPX1RFU1RfQ0FTRV9URU1QTEFURSggcmF0aW9uYWxfaW5wdXRfZmFpbGluZ190ZXN0LCBULAogYWxsX3NpZ25lZF90ZXN0X3R5cGVzICkKewogICAgc3RkOjppc3RyaW5nc3RyZWFtICBpc3MoICIiICk7CiAgICBib29zdDo6cmF0aW9uYWw8VD4gIHI7CgogICAgaXNzID4+IHI7CiAgICBCT09TVF9DSEVDSyggIWlzcyApOwoKICAgIGlzcy5jbGVhcigpOwogICAgaXNzLnN0ciggIjQyIiApOwogICAgaXNzID4+IHI7CiAgICBCT09TVF9DSEVDSyggIWlzcyApOwoKICAgIGlzcy5jbGVhcigpOwogICAgaXNzLnN0ciggIjU3QSIgKTsKICAgIGlzcyA+PiByOwogICAgQk9PU1RfQ0hFQ0soICFpc3MgKTsKCiAgICBpc3MuY2xlYXIoKTsKICAgIGlzcy5zdHIoICIyMC0yMCIgKTsKICAgIGlzcyA+PiByOwogICAgQk9PU1RfQ0hFQ0soICFpc3MgKTsKCiAgICBpc3MuY2xlYXIoKTsKICAgIGlzcy5zdHIoICIxLyIgKTsKICAgIGlzcyA+PiByOwogICAgQk9PU1RfQ0hFQ0soICFpc3MgKTsKCiAgICBpc3MuY2xlYXIoKTsKICAgIGlzcy5zdHIoICIxLyAyIiApOwogICAgaXNzID4+IHI7CiAgICBCT09TVF9DSEVDSyggIWlzcyApOwoKICAgIGlzcy5jbGVhcigpOwogICAgaXNzLnN0ciggIjEgLzIiICk7CiAgICBpc3MgPj4gcjsKICAgIEJPT1NUX0NIRUNLKCAhaXNzICk7Cn0KCi8vIElucHV0IHRlc3QsIHBhc3NpbmcKQk9PU1RfQVVUT19URVNUX0NBU0VfVEVNUExBVEUoIHJhdGlvbmFsX2lucHV0X3Bhc3NpbmdfdGVzdCwgVCwKIGFsbF9zaWduZWRfdGVzdF90eXBlcyApCnsKICAgIHR5cGVkZWYgYm9vc3Q6OnJhdGlvbmFsPFQ+ICByYXRpb25hbF90eXBlOwoKICAgIHN0ZDo6aXN0cmluZ3N0cmVhbSAgaXNzKCAiMS8yIDEyIiApOwogICAgcmF0aW9uYWxfdHlwZSAgICAgICByOwogICAgaW50ICAgICAgICAgICAgICAgICBuID0gMDsKCiAgICBCT09TVF9DSEVDSyggaXNzID4+IHIgPj4gbiApOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIHIsIHJhdGlvbmFsX3R5cGUoMSwgMikgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCBuLCAxMiApOwoKICAgIGlzcy5jbGVhcigpOwogICAgaXNzLnN0ciggIjM0LzY3IiApOwogICAgQk9PU1RfQ0hFQ0soIGlzcyA+PiByICk7CiAgICBCT09TVF9DSEVDS19FUVVBTCggciwgcmF0aW9uYWxfdHlwZSgzNCwgNjcpICk7CgogICAgaXNzLmNsZWFyKCk7CiAgICBpc3Muc3RyKCAiLTMvLTYiICk7CiAgICBCT09TVF9DSEVDSyggaXNzID4+IHIgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCByLCByYXRpb25hbF90eXBlKDEsIDIpICk7Cn0KCi8vIENvbnZlcnNpb24gdGVzdApCT09TVF9BVVRPX1RFU1RfQ0FTRSggcmF0aW9uYWxfY2FzdF90ZXN0ICkKewogICAgLy8gTm90ZSB0aGF0IHRoZXNlIGFyZSBub3QgZ2VuZXJpYy4gIFRoZSBwcm9ibGVtIGlzIHRoYXQgcmF0aW9uYWxfY2FzdDxUPgogICAgLy8gcmVxdWlyZXMgYSBjb252ZXJzaW9uIGZyb20gSW50VHlwZSB0byBULiAgSG93ZXZlciwgZm9yIGEgdXNlci1kZWZpbmVkCiAgICAvLyBJbnRUeXBlLCBpdCBpcyBub3QgcG9zc2libGUgdG8gZGVmaW5lIHN1Y2ggYSBjb252ZXJzaW9uIGV4Y2VwdCBhcyBhbgogICAgLy8gIm9wZXJhdG9yIFQoKSIuICBUaGlzIGNhdXNlcyBwcm9ibGVtcyB3aXRoIG92ZXJsb2FkaW5nIHJlc29sdXRpb24uCiAgICBib29zdDo6cmF0aW9uYWw8aW50PiBjb25zdCAgaGFsZiggMSwgMiApOwoKICAgIEJPT1NUX0NIRUNLX0NMT1NFKCBib29zdDo6cmF0aW9uYWxfY2FzdDxkb3VibGU+KGhhbGYpLCAwLjUsIDAuMDEgKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCBib29zdDo6cmF0aW9uYWxfY2FzdDxpbnQ+KGhhbGYpLCAwICk7CiAgICBCT09TVF9DSEVDS19FUVVBTCggYm9vc3Q6OnJhdGlvbmFsX2Nhc3Q8TXlJbnQ+KGhhbGYpLCBNeUludCgpICk7CiAgICBCT09TVF9DSEVDS19FUVVBTCggYm9vc3Q6OnJhdGlvbmFsX2Nhc3Q8Ym9vc3Q6OnJhdGlvbmFsPE15SW50PiA+KGhhbGYpLAogICAgIGJvb3N0OjpyYXRpb25hbDxNeUludD4oMSwgMikgKTsKCiAgICAvLyBDb252ZXJzaW9ucyB2aWEgZXhwbGljaXQtbWFya2VkIGNvbnN0cnVjdG9ycwogICAgLy8gKE5vdGUgdGhhdCB0aGUgImV4cGxpY2l0IiBtYXJrIHByZXZlbnRzIGNvbnZlcnNpb24gdG8KICAgIC8vIGJvb3N0OjpyYXRpb25hbDxNeU92ZXJmbG93aW5nVW5zaWduZWQ+LikKICAgIGJvb3N0OjpyYXRpb25hbDxNeUludD4gY29uc3QgIHRocmVlaGFsdmVzKCAzLCAyICk7CgogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIGJvb3N0OjpyYXRpb25hbF9jYXN0PE15T3ZlcmZsb3dpbmdVbnNpZ25lZD4odGhyZWVoYWx2ZXMpLAogICAgIE15T3ZlcmZsb3dpbmdVbnNpZ25lZCgxdSkgKTsKfQoKLy8gRGljZSB0ZXN0cyAoYSBub24tbWFpbiB0ZXN0KQpCT09TVF9BVVRPX1RFU1RfQ0FTRV9URU1QTEFURSggZGljZV9yb2xsX3Rlc3QsIFQsIGFsbF9zaWduZWRfdGVzdF90eXBlcyApCnsKICAgIHR5cGVkZWYgYm9vc3Q6OnJhdGlvbmFsPFQ+ICByYXRpb25hbF90eXBlOwoKICAgIC8vIERldGVybWluZSB0aGUgbWVhbiBudW1iZXIgb2YgdGltZXMgYSBmYWlyIHNpeC1zaWRlZCBkaWUKICAgIC8vIG11c3QgYmUgdGhyb3duIHVudGlsIGVhY2ggc2lkZSBoYXMgYXBwZWFyZWQgYXQgbGVhc3Qgb25jZS4KICAgIHJhdGlvbmFsX3R5cGUgIHIgPSBUKCAwICk7CgogICAgZm9yICggaW50ICBpID0gMSA7IGkgPD0gNiA7ICsraSApCiAgICB7CiAgICAgICAgciArPSByYXRpb25hbF90eXBlKCAxLCBpICk7CiAgICB9CiAgICByICo9IHN0YXRpY19jYXN0PFQ+KCA2ICk7CgogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIHIsIHJhdGlvbmFsX3R5cGUoMTQ3LCAxMCkgKTsKfQoKQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCgoKLy8gVGhlIGJ1Z3MsIHBhdGNoZXMsIGFuZCByZXF1ZXN0cyBjaGVja2luZyBzdWl0ZQpCT09TVF9BVVRPX1RFU1RfU1VJVEUoIGJ1Z19wYXRjaF9yZXF1ZXN0X3N1aXRlICkKCi8vICJyYXRpb25hbCBvcGVyYXRvcjwgY2FuIG92ZXJmbG93IgpCT09TVF9BVVRPX1RFU1RfQ0FTRSggYnVnXzc5ODM1N190ZXN0ICkKewogICAgLy8gQ2hvb3NlIHZhbHVlcyBzdWNoIHRoYXQgcmF0aW9uYWwtbnVtYmVyIGNvbXBhcmlzb25zIHdpbGwgb3ZlcmZsb3cgaWYKICAgIC8vIHRoZSBtdWx0aXBsaWNhdGlvbiBtZXRob2QgKG4xL2QxID8gbjIvZDIgPT0gbjEqZDIgPyBuMipkMSkgaXMgdXNlZC4KICAgIC8vIChBbmQgbWFrZSBzdXJlIHRoYXQgdGhlIGxhcmdlIGNvbXBvbmVudHMgYXJlIHJlbGF0aXZlbHkgcHJpbWUsIHNvIHRoZXkKICAgIC8vIHdvbid0IHBhcnRpYWxseSBjYW5jZWwgdG8gbWFrZSBzbWFsbGVyLCBtb3JlIHJlYXNvbmFibGUsIHZhbHVlcy4pCiAgICB1bnNpZ25lZCBjb25zdCAgbjEgPSBVSU5UX01BWCAtIDJ1LCBkMSA9IFVJTlRfTUFYIC0gMXU7CiAgICB1bnNpZ25lZCBjb25zdCAgbjIgPSBkMSwgZDIgPSBVSU5UX01BWDsKICAgIGJvb3N0OjpyYXRpb25hbDxNeU92ZXJmbG93aW5nVW5zaWduZWQ+IGNvbnN0ICByMSggbjEsIGQxICksIHIyKCBuMiwgZDIgKTsKCiAgICBCT09TVF9SRVFVSVJFX0VRVUFMKCBib29zdDo6bWF0aDo6Z2NkKG4xLCBkMSksIDF1ICk7CiAgICBCT09TVF9SRVFVSVJFX0VRVUFMKCBib29zdDo6bWF0aDo6Z2NkKG4yLCBkMiksIDF1ICk7CiAgICBCT09TVF9SRVFVSVJFKCBuMSA+IFVJTlRfTUFYIC8gZDIgKTsKICAgIEJPT1NUX1JFUVVJUkUoIG4yID4gVUlOVF9NQVggLyBkMSApOwogICAgQk9PU1RfQ0hFQ0soIHIxIDwgcjIgKTsKICAgIEJPT1NUX0NIRUNLKCAhKHIxIDwgcjEpICk7CiAgICBCT09TVF9DSEVDSyggIShyMiA8IHIxKSApOwp9CgovLyAicmF0aW9uYWw6Om9wZXJhdG9yPCBmYWlscyBmb3IgdW5zaWduZWQgdmFsdWUgdHlwZXMiCkJPT1NUX0FVVE9fVEVTVF9DQVNFKCBwYXRjaF8xNDM0ODIxX3Rlc3QgKQp7CiAgICAvLyBJZiBhIHplcm8tcmF0aW9uYWwgdi4gcG9zaXRpdmUtaW50ZWdlciBjb21wYXJpc29uIGludm9sdmVzIG5lZ2F0aW9uLCB0aGVuCiAgICAvLyBpdCBtYXkgZmFpbCB3aXRoIHVuc2lnbmVkIHR5cGVzLCB3aGljaCB3cmFwIGFyb3VuZCAoZm9yIGJ1aWx0LWlucykgb3IKICAgIC8vIHRocm93L2JlLXVuZGVmaW5lZCAoZm9yIHVzZXItZGVmaW5lZCB0eXBlcykuCiAgICBib29zdDo6cmF0aW9uYWw8dW5zaWduZWQ+IGNvbnN0ICByKCAwdSApOwoKICAgIEJPT1NUX0NIRUNLKCByIDwgMXUgKTsKfQoKLy8gInJhdGlvbmFsLmhwcDo6Z2NkIHJldHVybnMgYSBuZWdhdGl2ZSB2YWx1ZSBzb21ldGltZXMiCkJPT1NUX0FVVE9fVEVTVF9DQVNFKCBwYXRjaF8xNDM4NjI2X3Rlc3QgKQp7CiAgICAvLyBUaGUgaXNzdWUgb25seSBtYW5pZmVzdHMgd2l0aCAyJ3MtY29tcGxlbWVudCBpbnRlZ2VycyB0aGF0IHVzZSB0aGVpcgogICAgLy8gZW50aXJlIHJhbmdlIG9mIGJpdHMuICBbVGhpcyBtZWFucyB0aGF0IGxuKC1JTlRfTUlOKS9sbigyKSBpcyBhbiBpbnRlZ2VyCiAgICAvLyBhbmQgSU5UX01BWCArIElOVF9NSU4gPT0gLTEuXSAgVGhlIGNvbW1vbiBjb21wdXRlciBwbGF0Zm9ybXMgbWF0Y2ggdGhpcy4KI2lmIChJTlRfTUFYICsgSU5UX01JTiA9PSAtMSkgJiYgKChJTlRfTUFYIF4gSU5UX01JTikgPT0gLTEpCiAgICAvLyBJZiBhIEdDRCByb3V0aW5lIHRha2VzIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBhbiBhcmd1bWVudCBvbmx5IGJlZm9yZQogICAgLy8gcHJvY2Vzc2luZywgaXQgd29uJ3QgcmVhbGl6ZSB0aGF0IC1JTlRfTUlOIC0+IElOVF9NSU4gKGkuZS4gbm8gY2hhbmdlCiAgICAvLyBmcm9tIG5lZ2F0aW9uKSBhbmQgd2lsbCBwcm9wYWdhdGUgYSBuZWdhdGl2ZSBzaWduIHRvIGl0cyByZXN1bHQuCiAgICBCT09TVF9SRVFVSVJFX0VRVUFMKCBib29zdDo6bWF0aDo6Z2NkKElOVF9NSU4sIDYpLCAyICk7CgogICAgLy8gVGhhdCBpcyBiYWQgaWYgdGhlIHJhdGlvbmFsIG51bWJlciB0eXBlIGRvZXMgbm90IGNoZWNrIGZvciB0aGF0CiAgICAvLyBwb3NzaWJpbGl0eSBkdXJpbmcgbm9ybWFsaXphdGlvbi4KICAgIGJvb3N0OjpyYXRpb25hbDxpbnQ+IGNvbnN0ICByMSggSU5UX01JTiAvIDIgKyAzLCA2ICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjIoIElOVF9NSU4gLyAyIC0gMywgNiApLCByMyA9IHIxICsgcjI7CgogICAgLy8gSWYgdGhlIGVycm9yIGhhcHBlbnMsIHRoZSBzaWducyBvZiB0aGUgY29tcG9uZW50cyB3aWxsIGJlIHN3aXRjaGVkLgogICAgLy8gKFRoZSBudW1lcmF0b3JzJyBzdW0gaXMgSU5UX01JTiwgYW5kIGl0cyBHQ0Qgd2l0aCA2IHdvdWxkIGJlIG5lZ2F0ZWQuKQogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIHIzLm51bWVyYXRvcigpLCBJTlRfTUlOIC8gMiApOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIHIzLmRlbm9taW5hdG9yKCksIDMgKTsKI2VuZGlmCn0KCkJPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQo=