IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiMgLSotIGNvZGluZzogaXNvLTg4NTktMSAtKi0KCmZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CmltcG9ydCBtYXJzaGFsCmltcG9ydCBzeXMKaW1wb3J0IHVuaXR0ZXN0CmltcG9ydCBvcwoKY2xhc3MgSW50VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIHRlc3RfaW50cyhzZWxmKToKICAgICAgICAjIFRlc3QgdGhlIGZ1bGwgcmFuZ2Ugb2YgUHl0aG9uIGludHMuCiAgICAgICAgbiA9IHN5cy5tYXhpbnQKICAgICAgICB3aGlsZSBuOgogICAgICAgICAgICBmb3IgZXhwZWN0ZWQgaW4gKC1uLCBuKToKICAgICAgICAgICAgICAgIHMgPSBtYXJzaGFsLmR1bXBzKGV4cGVjdGVkKQogICAgICAgICAgICAgICAgZ290ID0gbWFyc2hhbC5sb2FkcyhzKQogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgZ290KQogICAgICAgICAgICAgICAgbWFyc2hhbC5kdW1wKGV4cGVjdGVkLCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpKQogICAgICAgICAgICAgICAgZ290ID0gbWFyc2hhbC5sb2FkKGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikpCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBnb3QpCiAgICAgICAgICAgIG4gPSBuID4+IDEKICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKCiAgICBkZWYgdGVzdF9pbnQ2NChzZWxmKToKICAgICAgICAjIFNpbXVsYXRlIGludCBtYXJzaGFsaW5nIG9uIGEgNjQtYml0IGJveC4gIFRoaXMgaXMgbW9zdCBpbnRlcmVzdGluZyBpZgogICAgICAgICMgd2UncmUgcnVubmluZyB0aGUgdGVzdCBvbiBhIDMyLWJpdCBib3gsIG9mIGNvdXJzZS4KCiAgICAgICAgZGVmIHRvX2xpdHRsZV9lbmRpYW5fc3RyaW5nKHZhbHVlLCBuYnl0ZXMpOgogICAgICAgICAgICBieXRlcyA9IFtdCiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKG5ieXRlcyk6CiAgICAgICAgICAgICAgICBieXRlcy5hcHBlbmQoY2hyKHZhbHVlICYgMHhmZikpCiAgICAgICAgICAgICAgICB2YWx1ZSA+Pj0gOAogICAgICAgICAgICByZXR1cm4gJycuam9pbihieXRlcykKCiAgICAgICAgbWF4aW50NjQgPSAoMUwgPDwgNjMpIC0gMQogICAgICAgIG1pbmludDY0ID0gLW1heGludDY0LTEKCiAgICAgICAgZm9yIGJhc2UgaW4gbWF4aW50NjQsIG1pbmludDY0LCAtbWF4aW50NjQsIC0obWluaW50NjQgPj4gMSk6CiAgICAgICAgICAgIHdoaWxlIGJhc2U6CiAgICAgICAgICAgICAgICBzID0gJ0knICsgdG9fbGl0dGxlX2VuZGlhbl9zdHJpbmcoYmFzZSwgOCkKICAgICAgICAgICAgICAgIGdvdCA9IG1hcnNoYWwubG9hZHMocykKICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZSwgZ290KQogICAgICAgICAgICAgICAgaWYgYmFzZSA9PSAtMTogICMgYSBmaXhlZC1wb2ludCBmb3Igc2hpZnRpbmcgcmlnaHQgMQogICAgICAgICAgICAgICAgICAgIGJhc2UgPSAwCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGJhc2UgPj49IDEKCiAgICBkZWYgdGVzdF9ib29sKHNlbGYpOgogICAgICAgIGZvciBiIGluIChUcnVlLCBGYWxzZSk6CiAgICAgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyhiKSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBuZXcpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShiKSwgdHlwZShuZXcpKQogICAgICAgICAgICBtYXJzaGFsLmR1bXAoYiwgZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKSkKICAgICAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkKGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgbmV3KQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoYiksIHR5cGUobmV3KSkKCmNsYXNzIEZsb2F0VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIHRlc3RfZmxvYXRzKHNlbGYpOgogICAgICAgICMgVGVzdCBhIGZldyBmbG9hdHMKICAgICAgICBzbWFsbCA9IDFlLTI1CiAgICAgICAgbiA9IHN5cy5tYXhpbnQgKiAzLjdlMjUwCiAgICAgICAgd2hpbGUgbiA+IHNtYWxsOgogICAgICAgICAgICBmb3IgZXhwZWN0ZWQgaW4gKC1uLCBuKToKICAgICAgICAgICAgICAgIGYgPSBmbG9hdChleHBlY3RlZCkKICAgICAgICAgICAgICAgIHMgPSBtYXJzaGFsLmR1bXBzKGYpCiAgICAgICAgICAgICAgICBnb3QgPSBtYXJzaGFsLmxvYWRzKHMpCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYsIGdvdCkKICAgICAgICAgICAgICAgIG1hcnNoYWwuZHVtcChmLCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpKQogICAgICAgICAgICAgICAgZ290ID0gbWFyc2hhbC5sb2FkKGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikpCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYsIGdvdCkKICAgICAgICAgICAgbiAvPSAxMjMuNDU2NwoKICAgICAgICBmID0gMC4wCiAgICAgICAgcyA9IG1hcnNoYWwuZHVtcHMoZiwgMikKICAgICAgICBnb3QgPSBtYXJzaGFsLmxvYWRzKHMpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLCBnb3QpCiAgICAgICAgIyBhbmQgd2l0aCB2ZXJzaW9uIDw9IDEgKGZsb2F0cyBtYXJzaGFsbGVkIGRpZmZlcmVudGx5IHRoZW4pCiAgICAgICAgcyA9IG1hcnNoYWwuZHVtcHMoZiwgMSkKICAgICAgICBnb3QgPSBtYXJzaGFsLmxvYWRzKHMpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLCBnb3QpCgogICAgICAgIG4gPSBzeXMubWF4aW50ICogMy43ZS0yNTAKICAgICAgICB3aGlsZSBuIDwgc21hbGw6CiAgICAgICAgICAgIGZvciBleHBlY3RlZCBpbiAoLW4sIG4pOgogICAgICAgICAgICAgICAgZiA9IGZsb2F0KGV4cGVjdGVkKQoKICAgICAgICAgICAgICAgIHMgPSBtYXJzaGFsLmR1bXBzKGYpCiAgICAgICAgICAgICAgICBnb3QgPSBtYXJzaGFsLmxvYWRzKHMpCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYsIGdvdCkKCiAgICAgICAgICAgICAgICBzID0gbWFyc2hhbC5kdW1wcyhmLCAxKQogICAgICAgICAgICAgICAgZ290ID0gbWFyc2hhbC5sb2FkcyhzKQogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLCBnb3QpCgogICAgICAgICAgICAgICAgbWFyc2hhbC5kdW1wKGYsIGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikpCiAgICAgICAgICAgICAgICBnb3QgPSBtYXJzaGFsLmxvYWQoZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKSkKICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiwgZ290KQoKICAgICAgICAgICAgICAgIG1hcnNoYWwuZHVtcChmLCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpLCAxKQogICAgICAgICAgICAgICAgZ290ID0gbWFyc2hhbC5sb2FkKGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikpCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYsIGdvdCkKICAgICAgICAgICAgbiAqPSAxMjMuNDU2NwogICAgICAgIG9zLnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQoKY2xhc3MgU3RyaW5nVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIHRlc3RfdW5pY29kZShzZWxmKToKICAgICAgICBmb3IgcyBpbiBbdSIiLCB1IkFuZHLoIFByZXZpbiIsIHUiYWJjIiwgdSIgIioxMDAwMF06CiAgICAgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyhzKSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBuZXcpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShzKSwgdHlwZShuZXcpKQogICAgICAgICAgICBtYXJzaGFsLmR1bXAocywgZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKSkKICAgICAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkKGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgbmV3KQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocyksIHR5cGUobmV3KSkKICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKCiAgICBkZWYgdGVzdF9zdHJpbmcoc2VsZik6CiAgICAgICAgZm9yIHMgaW4gWyIiLCAiQW5kcuggUHJldmluIiwgImFiYyIsICIgIioxMDAwMF06CiAgICAgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyhzKSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBuZXcpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShzKSwgdHlwZShuZXcpKQogICAgICAgICAgICBtYXJzaGFsLmR1bXAocywgZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKSkKICAgICAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkKGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgbmV3KQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocyksIHR5cGUobmV3KSkKICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKCiAgICBkZWYgdGVzdF9idWZmZXIoc2VsZik6CiAgICAgICAgZm9yIHMgaW4gWyIiLCAiQW5kcuggUHJldmluIiwgImFiYyIsICIgIioxMDAwMF06CiAgICAgICAgICAgIGIgPSBidWZmZXIocykKICAgICAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKGIpKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIG5ldykKICAgICAgICAgICAgbWFyc2hhbC5kdW1wKGIsIGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikpCiAgICAgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZChmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIG5ldykKICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKCmNsYXNzIEV4Y2VwdGlvblRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbnMoc2VsZik6CiAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKFN0b3BJdGVyYXRpb24pKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoU3RvcEl0ZXJhdGlvbiwgbmV3KQoKY2xhc3MgQ29kZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiB0ZXN0X2NvZGUoc2VsZik6CiAgICAgICAgY28gPSBFeGNlcHRpb25UZXN0Q2FzZS50ZXN0X2V4Y2VwdGlvbnMuZnVuY19jb2RlCiAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKGNvKSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvLCBuZXcpCgpjbGFzcyBDb250YWluZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkID0geydhc3RyaW5nJzogJ2Zvb0BiYXIuYmF6LnNwYW0nLAogICAgICAgICAnYWZsb2F0JzogNzI4My40MywKICAgICAgICAgJ2FuaW50JzogMioqMjAsCiAgICAgICAgICdhc2hvcnRsb25nJzogMkwsCiAgICAgICAgICdhbGlzdCc6IFsnLnp5eC40MSddLAogICAgICAgICAnYXR1cGxlJzogKCcuenl4LjQxJywpKjEwLAogICAgICAgICAnYWJvb2xlYW4nOiBGYWxzZSwKICAgICAgICAgJ2F1bmljb2RlJzogdSJBbmRy6CBQcmV2aW4iCiAgICAgICAgIH0KICAgIGRlZiB0ZXN0X2RpY3Qoc2VsZik6CiAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKHNlbGYuZCkpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmQsIG5ldykKICAgICAgICBtYXJzaGFsLmR1bXAoc2VsZi5kLCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpKQogICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZChmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kLCBuZXcpCiAgICAgICAgb3MudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCgogICAgZGVmIHRlc3RfbGlzdChzZWxmKToKICAgICAgICBsc3QgPSBzZWxmLmQuaXRlbXMoKQogICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyhsc3QpKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobHN0LCBuZXcpCiAgICAgICAgbWFyc2hhbC5kdW1wKGxzdCwgZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKSkKICAgICAgICBuZXcgPSBtYXJzaGFsLmxvYWQoZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxzdCwgbmV3KQogICAgICAgIG9zLnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQoKICAgIGRlZiB0ZXN0X3R1cGxlKHNlbGYpOgogICAgICAgIHQgPSB0dXBsZShzZWxmLmQua2V5cygpKQogICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyh0KSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIG5ldykKICAgICAgICBtYXJzaGFsLmR1bXAodCwgZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKSkKICAgICAgICBuZXcgPSBtYXJzaGFsLmxvYWQoZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIG5ldykKICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKCiAgICBkZWYgdGVzdF9zZXRzKHNlbGYpOgogICAgICAgIGZvciBjb25zdHJ1Y3RvciBpbiAoc2V0LCBmcm96ZW5zZXQpOgogICAgICAgICAgICB0ID0gY29uc3RydWN0b3Ioc2VsZi5kLmtleXMoKSkKICAgICAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKHQpKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIG5ldykKICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobmV3LCBjb25zdHJ1Y3RvcikpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQodCksIGlkKG5ldykpCiAgICAgICAgICAgIG1hcnNoYWwuZHVtcCh0LCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpKQogICAgICAgICAgICBuZXcgPSBtYXJzaGFsLmxvYWQoZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCBuZXcpCiAgICAgICAgICAgIG9zLnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQoKY2xhc3MgQnVnc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiB0ZXN0X2J1Z181ODg4NDUyKHNlbGYpOgogICAgICAgICMgU2ltcGxlLW1pbmRlZCBjaGVjayBmb3IgU0YgNTg4NDUyOiBEZWJ1ZyBidWlsZCBjcmFzaGVzCiAgICAgICAgbWFyc2hhbC5kdW1wcyhbMTI4XSAqIDEwMDApCgogICAgZGVmIHRlc3RfcGF0Y2hfODczMjI0KHNlbGYpOgogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbiwgbWFyc2hhbC5sb2FkcywgJzAnKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbiwgbWFyc2hhbC5sb2FkcywgJ2YnKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbiwgbWFyc2hhbC5sb2FkcywgbWFyc2hhbC5kdW1wcyg1TClbOi0xXSkKCiAgICBkZWYgdGVzdF92ZXJzaW9uX2FyZ3VtZW50KHNlbGYpOgogICAgICAgICMgUHl0aG9uIDIuNC4wIGNyYXNoZXMgZm9yIGFueSBjYWxsIHRvIG1hcnNoYWwuZHVtcHMoeCwgeSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtYXJzaGFsLmxvYWRzKG1hcnNoYWwuZHVtcHMoNSwgMCkpLCA1KQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyg1LCAxKSksIDUpCgogICAgZGVmIHRlc3RfZnV6eihzZWxmKToKICAgICAgICAjIHNpbXBsZSB0ZXN0IHRoYXQgaXQncyBhdCBsZWFzdCBub3QgKnRvdGFsbHkqIHRyaXZpYWwgdG8KICAgICAgICAjIGNyYXNoIGZyb20gYmFkIG1hcnNoYWwgZGF0YQogICAgICAgIGZvciBjIGluIFtjaHIoaSkgZm9yIGkgaW4gcmFuZ2UoMjU2KV06CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG1hcnNoYWwubG9hZHMoYykKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIHBhc3MKCiAgICBkZWYgdGVzdF9sb2Fkc19yZWN1cnNpb24oc2VsZik6CiAgICAgICAgcyA9ICdjJyArICgnWCcgKiA0KjQpICsgJ3snICogMioqMjAKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXJzaGFsLmxvYWRzLCBzKQoKICAgIGRlZiB0ZXN0X3JlY3Vyc2lvbl9saW1pdChzZWxmKToKICAgICAgICAjIENyZWF0ZSBhIGRlZXBseSBuZXN0ZWQgc3RydWN0dXJlLgogICAgICAgIGhlYWQgPSBsYXN0ID0gW10KICAgICAgICAjIFRoZSBtYXggc3RhY2sgZGVwdGggc2hvdWxkIG1hdGNoIHRoZSB2YWx1ZSBpbiBQeXRob24vbWFyc2hhbC5jLgogICAgICAgIE1BWF9NQVJTSEFMX1NUQUNLX0RFUFRIID0gMjAwMAogICAgICAgIGZvciBpIGluIHJhbmdlKE1BWF9NQVJTSEFMX1NUQUNLX0RFUFRIIC0gMik6CiAgICAgICAgICAgIGxhc3QuYXBwZW5kKFswXSkKICAgICAgICAgICAgbGFzdCA9IGxhc3RbLTFdCgogICAgICAgICMgVmVyaWZ5IHdlIGRvbid0IGJsb3cgb3V0IHRoZSBzdGFjayB3aXRoIGR1bXBzL2xvYWQuCiAgICAgICAgZGF0YSA9IG1hcnNoYWwuZHVtcHMoaGVhZCkKICAgICAgICBuZXdfaGVhZCA9IG1hcnNoYWwubG9hZHMoZGF0YSkKICAgICAgICAjIERvbid0IHVzZSA9PSB0byBjb21wYXJlIG9iamVjdHMsIGl0IGNhbiBleGNlZWQgdGhlIHJlY3Vyc2lvbiBsaW1pdC4KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihuZXdfaGVhZCksIGxlbihoZWFkKSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihuZXdfaGVhZFswXSksIGxlbihoZWFkWzBdKSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihuZXdfaGVhZFstMV0pLCBsZW4oaGVhZFstMV0pKQoKICAgICAgICBsYXN0LmFwcGVuZChbMF0pCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWFyc2hhbC5kdW1wcywgaGVhZCkKCiAgICBkZWYgdGVzdF9leGFjdF90eXBlX21hdGNoKHNlbGYpOgogICAgICAgICMgRm9ybWVyIGJ1ZzoKICAgICAgICAjICAgPj4+IGNsYXNzIEludChpbnQpOiBwYXNzCiAgICAgICAgIyAgID4+PiB0eXBlKGxvYWRzKGR1bXBzKEludCgpKSkpCiAgICAgICAgIyAgIDx0eXBlICdpbnQnPgogICAgICAgIGZvciB0eXAgaW4gKGludCwgbG9uZywgZmxvYXQsIGNvbXBsZXgsIHR1cGxlLCBsaXN0LCBkaWN0LCBzZXQsIGZyb3plbnNldCk6CiAgICAgICAgICAgICMgTm90ZTogc3RyIGFuZCB1bmljb2RlIHN1YmxjbGFzc2VzIGFyZSBub3QgdGVzdGVkIGJlY2F1c2UgdGhleSBnZXQgaGFuZGxlZAogICAgICAgICAgICAjIGJ5IG1hcnNoYWwncyByb3V0aW5lcyBmb3Igb2JqZWN0cyBzdXBwb3J0aW5nIHRoZSBidWZmZXIgQVBJLgogICAgICAgICAgICBzdWJ0eXAgPSB0eXBlKCdzdWJ0eXAnLCAodHlwLCksIHt9KQogICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXJzaGFsLmR1bXBzLCBzdWJ0eXAoKSkKCiAgICAjIElzc3VlICMxNzkyIGludHJvZHVjZWQgYSBjaGFuZ2UgaW4gaG93IG1hcnNoYWwgaW5jcmVhc2VzIHRoZSBzaXplIG9mIGl0cwogICAgIyBpbnRlcm5hbCBidWZmZXI7IHRoaXMgdGVzdCBlbnN1cmVzIHRoYXQgdGhlIG5ldyBjb2RlIGlzIGV4ZXJjaXNlZC4KICAgIGRlZiB0ZXN0X2xhcmdlX21hcnNoYWwoc2VsZik6CiAgICAgICAgc2l6ZSA9IGludCgxZTYpCiAgICAgICAgdGVzdFN0cmluZyA9ICdhYmMnICogc2l6ZQogICAgICAgIG1hcnNoYWwuZHVtcHModGVzdFN0cmluZykKCgpkZWYgdGVzdF9tYWluKCk6CiAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEludFRlc3RDYXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbG9hdFRlc3RDYXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdUZXN0Q2FzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZVRlc3RDYXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250YWluZXJUZXN0Q2FzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uVGVzdENhc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z3NUZXN0Q2FzZSkKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICB0ZXN0X21haW4oKQo=