Iy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCiMgcHlzcWxpdGUyL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weTogdGVzdHMgZm9yIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMgYW5kCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRlcy4KIwojIENvcHlyaWdodCAoQykgMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiMKIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KIwojIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCiMgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwojIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCiMKIyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKIyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CiMgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgojCiMgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKIyAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQojICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQojICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiMgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKIyAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCiMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KCmltcG9ydCB1bml0dGVzdAppbXBvcnQgc3FsaXRlMyBhcyBzcWxpdGUKCmRlZiBmdW5jX3JldHVybnRleHQoKToKICAgIHJldHVybiAiZm9vIgpkZWYgZnVuY19yZXR1cm51bmljb2RlKCk6CiAgICByZXR1cm4gImJhciIKZGVmIGZ1bmNfcmV0dXJuaW50KCk6CiAgICByZXR1cm4gNDIKZGVmIGZ1bmNfcmV0dXJuZmxvYXQoKToKICAgIHJldHVybiAzLjE0CmRlZiBmdW5jX3JldHVybm51bGwoKToKICAgIHJldHVybiBOb25lCmRlZiBmdW5jX3JldHVybmJsb2IoKToKICAgIHJldHVybiBiImJsb2IiCmRlZiBmdW5jX3JhaXNlZXhjZXB0aW9uKCk6CiAgICA1LzAKCmRlZiBmdW5jX2lzc3RyaW5nKHYpOgogICAgcmV0dXJuIHR5cGUodikgaXMgc3RyCmRlZiBmdW5jX2lzaW50KHYpOgogICAgcmV0dXJuIHR5cGUodikgaXMgaW50CmRlZiBmdW5jX2lzZmxvYXQodik6CiAgICByZXR1cm4gdHlwZSh2KSBpcyBmbG9hdApkZWYgZnVuY19pc25vbmUodik6CiAgICByZXR1cm4gdHlwZSh2KSBpcyB0eXBlKE5vbmUpCmRlZiBmdW5jX2lzYmxvYih2KToKICAgIHJldHVybiBpc2luc3RhbmNlKHYsIChieXRlcywgbWVtb3J5dmlldykpCgpjbGFzcyBBZ2dyTm9TdGVwOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHBhc3MKCiAgICBkZWYgZmluYWxpemUoc2VsZik6CiAgICAgICAgcmV0dXJuIDEKCmNsYXNzIEFnZ3JOb0ZpbmFsaXplOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHBhc3MKCiAgICBkZWYgc3RlcChzZWxmLCB4KToKICAgICAgICBwYXNzCgpjbGFzcyBBZ2dyRXhjZXB0aW9uSW5Jbml0OgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIDUvMAoKICAgIGRlZiBzdGVwKHNlbGYsIHgpOgogICAgICAgIHBhc3MKCiAgICBkZWYgZmluYWxpemUoc2VsZik6CiAgICAgICAgcGFzcwoKY2xhc3MgQWdnckV4Y2VwdGlvbkluU3RlcDoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIHN0ZXAoc2VsZiwgeCk6CiAgICAgICAgNS8wCgogICAgZGVmIGZpbmFsaXplKHNlbGYpOgogICAgICAgIHJldHVybiA0MgoKY2xhc3MgQWdnckV4Y2VwdGlvbkluRmluYWxpemU6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgcGFzcwoKICAgIGRlZiBzdGVwKHNlbGYsIHgpOgogICAgICAgIHBhc3MKCiAgICBkZWYgZmluYWxpemUoc2VsZik6CiAgICAgICAgNS8wCgpjbGFzcyBBZ2dyQ2hlY2tUeXBlOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYudmFsID0gTm9uZQoKICAgIGRlZiBzdGVwKHNlbGYsIHdoaWNoVHlwZSwgdmFsKToKICAgICAgICB0aGVUeXBlID0geyJzdHIiOiBzdHIsICJpbnQiOiBpbnQsICJmbG9hdCI6IGZsb2F0LCAiTm9uZSI6IHR5cGUoTm9uZSksCiAgICAgICAgICAgICAgICAgICAiYmxvYiI6IGJ5dGVzfQogICAgICAgIHNlbGYudmFsID0gaW50KHRoZVR5cGVbd2hpY2hUeXBlXSBpcyB0eXBlKHZhbCkpCgogICAgZGVmIGZpbmFsaXplKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnZhbAoKY2xhc3MgQWdnclN1bToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLnZhbCA9IDAuMAoKICAgIGRlZiBzdGVwKHNlbGYsIHZhbCk6CiAgICAgICAgc2VsZi52YWwgKz0gdmFsCgogICAgZGVmIGZpbmFsaXplKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnZhbAoKY2xhc3MgRnVuY3Rpb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQoKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJldHVybnRleHQiLCAwLCBmdW5jX3JldHVybnRleHQpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZXR1cm51bmljb2RlIiwgMCwgZnVuY19yZXR1cm51bmljb2RlKQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmV0dXJuaW50IiwgMCwgZnVuY19yZXR1cm5pbnQpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZXR1cm5mbG9hdCIsIDAsIGZ1bmNfcmV0dXJuZmxvYXQpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZXR1cm5udWxsIiwgMCwgZnVuY19yZXR1cm5udWxsKQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmV0dXJuYmxvYiIsIDAsIGZ1bmNfcmV0dXJuYmxvYikKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJhaXNlZXhjZXB0aW9uIiwgMCwgZnVuY19yYWlzZWV4Y2VwdGlvbikKCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJpc3N0cmluZyIsIDEsIGZ1bmNfaXNzdHJpbmcpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJpc2ludCIsIDEsIGZ1bmNfaXNpbnQpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJpc2Zsb2F0IiwgMSwgZnVuY19pc2Zsb2F0KQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigiaXNub25lIiwgMSwgZnVuY19pc25vbmUpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJpc2Jsb2IiLCAxLCBmdW5jX2lzYmxvYikKCiAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgc2VsZi5jb24uY2xvc2UoKQoKICAgIGRlZiBDaGVja0Z1bmNFcnJvck9uQ3JlYXRlKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJibGEiLCAtMTAwLCBsYW1iZGEgeDogMip4KQogICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3I6CiAgICAgICAgICAgIHBhc3MKCiAgICBkZWYgQ2hlY2tGdW5jUmVmQ291bnQoc2VsZik6CiAgICAgICAgZGVmIGdldGZ1bmMoKToKICAgICAgICAgICAgZGVmIGYoKToKICAgICAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgICAgIHJldHVybiBmCiAgICAgICAgZiA9IGdldGZ1bmMoKQogICAgICAgIGdsb2JhbHMoKVsiZm9vIl0gPSBmCiAgICAgICAgIyBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJlZnRlc3QiLCAwLCBnZXRmdW5jKCkpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZWZ0ZXN0IiwgMCwgZikKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmVmdGVzdCgpIikKCiAgICBkZWYgQ2hlY2tGdW5jUmV0dXJuVGV4dChzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJudGV4dCgpIikKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUodmFsKSwgc3RyKQogICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgImZvbyIpCgogICAgZGVmIENoZWNrRnVuY1JldHVyblVuaWNvZGUoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybnVuaWNvZGUoKSIpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHZhbCksIHN0cikKICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsICJiYXIiKQoKICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5JbnQoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybmludCgpIikKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUodmFsKSwgaW50KQogICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgNDIpCgogICAgZGVmIENoZWNrRnVuY1JldHVybkZsb2F0KHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByZXR1cm5mbG9hdCgpIikKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUodmFsKSwgZmxvYXQpCiAgICAgICAgaWYgdmFsIDwgMy4xMzkgb3IgdmFsID4gMy4xNDE6CiAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgdmFsdWUiKQoKICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5OdWxsKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByZXR1cm5udWxsKCkiKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2YWwpLCB0eXBlKE5vbmUpKQogICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgTm9uZSkKCiAgICBkZWYgQ2hlY2tGdW5jUmV0dXJuQmxvYihzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJuYmxvYigpIikKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUodmFsKSwgYnl0ZXMpCiAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCBiImJsb2IiKQoKICAgIGRlZiBDaGVja0Z1bmNFeGNlcHRpb24oc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmFpc2VleGNlcHRpb24oKSIpCiAgICAgICAgICAgIGN1ci5mZXRjaG9uZSgpCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIE9wZXJhdGlvbmFsRXJyb3IiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciBhcyBlOgogICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChlLmFyZ3NbMF0sICd1c2VyLWRlZmluZWQgZnVuY3Rpb24gcmFpc2VkIGV4Y2VwdGlvbicpCgogICAgZGVmIENoZWNrUGFyYW1TdHJpbmcoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGlzc3RyaW5nKD8pIiwgKCJmb28iLCkpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDEpCgogICAgZGVmIENoZWNrUGFyYW1JbnQoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGlzaW50KD8pIiwgKDQyLCkpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDEpCgogICAgZGVmIENoZWNrUGFyYW1GbG9hdChzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaXNmbG9hdCg/KSIsICgzLjE0LCkpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDEpCgogICAgZGVmIENoZWNrUGFyYW1Ob25lKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpc25vbmUoPykiLCAoTm9uZSwpKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAxKQoKICAgIGRlZiBDaGVja1BhcmFtQmxvYihzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaXNibG9iKD8pIiwgKG1lbW9yeXZpZXcoYiJibG9iIiksKSkKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgMSkKCmNsYXNzIEFnZ3JlZ2F0ZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgiIiIKICAgICAgICAgICAgY3JlYXRlIHRhYmxlIHRlc3QoCiAgICAgICAgICAgICAgICB0IHRleHQsCiAgICAgICAgICAgICAgICBpIGludGVnZXIsCiAgICAgICAgICAgICAgICBmIGZsb2F0LAogICAgICAgICAgICAgICAgbiwKICAgICAgICAgICAgICAgIGIgYmxvYgogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAiIiIpCiAgICAgICAgY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QodCwgaSwgZiwgbiwgYikgdmFsdWVzICg/LCA/LCA/LCA/LCA/KSIsCiAgICAgICAgICAgICgiZm9vIiwgNSwgMy4xNCwgTm9uZSwgbWVtb3J5dmlldyhiImJsb2IiKSwpKQoKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJub3N0ZXAiLCAxLCBBZ2dyTm9TdGVwKQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9hZ2dyZWdhdGUoIm5vZmluYWxpemUiLCAxLCBBZ2dyTm9GaW5hbGl6ZSkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJleGNJbml0IiwgMSwgQWdnckV4Y2VwdGlvbkluSW5pdCkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJleGNTdGVwIiwgMSwgQWdnckV4Y2VwdGlvbkluU3RlcCkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJleGNGaW5hbGl6ZSIsIDEsIEFnZ3JFeGNlcHRpb25JbkZpbmFsaXplKQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9hZ2dyZWdhdGUoImNoZWNrVHlwZSIsIDIsIEFnZ3JDaGVja1R5cGUpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2FnZ3JlZ2F0ZSgibXlzdW0iLCAxLCBBZ2dyU3VtKQoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICAjc2VsZi5jdXIuY2xvc2UoKQogICAgICAgICNzZWxmLmNvbi5jbG9zZSgpCiAgICAgICAgcGFzcwoKICAgIGRlZiBDaGVja0FnZ3JFcnJvck9uQ3JlYXRlKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJibGEiLCAtMTAwLCBBZ2dyU3VtKQogICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3I6CiAgICAgICAgICAgIHBhc3MKCiAgICBkZWYgQ2hlY2tBZ2dyTm9TdGVwKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IG5vc3RlcCh0KSBmcm9tIHRlc3QiKQogICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBBdHRyaWJ1dGVFcnJvciIpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yIGFzIGU6CiAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGUuYXJnc1swXSwgIidBZ2dyTm9TdGVwJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnc3RlcCciKQoKICAgIGRlZiBDaGVja0FnZ3JOb0ZpbmFsaXplKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IG5vZmluYWxpemUodCkgZnJvbSB0ZXN0IikKICAgICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yIGFzIGU6CiAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGUuYXJnc1swXSwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnZmluYWxpemUnIG1ldGhvZCByYWlzZWQgZXJyb3IiKQoKICAgIGRlZiBDaGVja0FnZ3JFeGNlcHRpb25JbkluaXQoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgZXhjSW5pdCh0KSBmcm9tIHRlc3QiKQogICAgICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IgYXMgZToKICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZS5hcmdzWzBdLCAidXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSdzICdfX2luaXRfXycgbWV0aG9kIHJhaXNlZCBlcnJvciIpCgogICAgZGVmIENoZWNrQWdnckV4Y2VwdGlvbkluU3RlcChzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIHRyeToKICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBleGNTdGVwKHQpIGZyb20gdGVzdCIpCiAgICAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciBhcyBlOgogICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChlLmFyZ3NbMF0sICJ1c2VyLWRlZmluZWQgYWdncmVnYXRlJ3MgJ3N0ZXAnIG1ldGhvZCByYWlzZWQgZXJyb3IiKQoKICAgIGRlZiBDaGVja0FnZ3JFeGNlcHRpb25JbkZpbmFsaXplKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGV4Y0ZpbmFsaXplKHQpIGZyb20gdGVzdCIpCiAgICAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciBhcyBlOgogICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChlLmFyZ3NbMF0sICJ1c2VyLWRlZmluZWQgYWdncmVnYXRlJ3MgJ2ZpbmFsaXplJyBtZXRob2QgcmFpc2VkIGVycm9yIikKCiAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbVN0cihzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgY2hlY2tUeXBlKCdzdHInLCA/KSIsICgiZm9vIiwpKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAxKQoKICAgIGRlZiBDaGVja0FnZ3JDaGVja1BhcmFtSW50KHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBjaGVja1R5cGUoJ2ludCcsID8pIiwgKDQyLCkpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDEpCgogICAgZGVmIENoZWNrQWdnckNoZWNrUGFyYW1GbG9hdChzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgY2hlY2tUeXBlKCdmbG9hdCcsID8pIiwgKDMuMTQsKSkKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgMSkKCiAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbU5vbmUoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGNoZWNrVHlwZSgnTm9uZScsID8pIiwgKE5vbmUsKSkKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgMSkKCiAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbUJsb2Ioc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGNoZWNrVHlwZSgnYmxvYicsID8pIiwgKG1lbW9yeXZpZXcoYiJibG9iIiksKSkKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgMSkKCiAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tBZ2dyU3VtKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoImRlbGV0ZSBmcm9tIHRlc3QiKQogICAgICAgIGN1ci5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKD8pIiwgWygxMCwpLCAoMjAsKSwgKDMwLCldKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgbXlzdW0oaSkgZnJvbSB0ZXN0IikKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgNjApCgpkZWYgYXV0aG9yaXplcl9jYihhY3Rpb24sIGFyZzEsIGFyZzIsIGRibmFtZSwgc291cmNlKToKICAgIGlmIGFjdGlvbiAhPSBzcWxpdGUuU1FMSVRFX1NFTEVDVDoKICAgICAgICByZXR1cm4gc3FsaXRlLlNRTElURV9ERU5ZCiAgICBpZiBhcmcyID09ICdjMicgb3IgYXJnMSA9PSAndDInOgogICAgICAgIHJldHVybiBzcWxpdGUuU1FMSVRFX0RFTlkKICAgIHJldHVybiBzcWxpdGUuU1FMSVRFX09LCgpjbGFzcyBBdXRob3JpemVyVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBzZWxmLmNvbi5leGVjdXRlc2NyaXB0KCIiIgogICAgICAgICAgICBjcmVhdGUgdGFibGUgdDEgKGMxLCBjMik7CiAgICAgICAgICAgIGNyZWF0ZSB0YWJsZSB0MiAoYzEsIGMyKTsKICAgICAgICAgICAgaW5zZXJ0IGludG8gdDEgKGMxLCBjMikgdmFsdWVzICgxLCAyKTsKICAgICAgICAgICAgaW5zZXJ0IGludG8gdDIgKGMxLCBjMikgdmFsdWVzICg0LCA1KTsKICAgICAgICAgICAgIiIiKQoKICAgICAgICAjIEZvciBvdXIgc2VjdXJpdHkgdGVzdDoKICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgYzIgZnJvbSB0MiIpCgogICAgICAgIHNlbGYuY29uLnNldF9hdXRob3JpemVyKGF1dGhvcml6ZXJfY2IpCgogICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgIHBhc3MKCiAgICBkZWYgQ2hlY2tUYWJsZUFjY2VzcyhzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCAqIGZyb20gdDIiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuRGF0YWJhc2VFcnJvciBhcyBlOgogICAgICAgICAgICBpZiBub3QgZS5hcmdzWzBdLmVuZHN3aXRoKCJwcm9oaWJpdGVkIik6CiAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIndyb25nIGV4Y2VwdGlvbiB0ZXh0OiAlcyIgJSBlLmFyZ3NbMF0pCiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIGV4Y2VwdGlvbiBkdWUgdG8gbWlzc2luZyBwcml2aWxlZ2VzIikKCiAgICBkZWYgQ2hlY2tDb2x1bW5BY2Nlc3Moc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgYzIgZnJvbSB0MSIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5EYXRhYmFzZUVycm9yIGFzIGU6CiAgICAgICAgICAgIGlmIG5vdCBlLmFyZ3NbMF0uZW5kc3dpdGgoInByb2hpYml0ZWQiKToKICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgZXhjZXB0aW9uIHRleHQ6ICVzIiAlIGUuYXJnc1swXSkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gZXhjZXB0aW9uIGR1ZSB0byBtaXNzaW5nIHByaXZpbGVnZXMiKQoKZGVmIHN1aXRlKCk6CiAgICBmdW5jdGlvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShGdW5jdGlvblRlc3RzLCAiQ2hlY2siKQogICAgYWdncmVnYXRlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKEFnZ3JlZ2F0ZVRlc3RzLCAiQ2hlY2siKQogICAgYXV0aG9yaXplcl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShBdXRob3JpemVyVGVzdHMsICJDaGVjayIpCiAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKChmdW5jdGlvbl9zdWl0ZSwgYWdncmVnYXRlX3N1aXRlLCBhdXRob3JpemVyX3N1aXRlKSkKCmRlZiB0ZXN0KCk6CiAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigpCiAgICBydW5uZXIucnVuKHN1aXRlKCkpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgdGVzdCgpCg==