Iy0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCiMgcHlzcWxpdGUyL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weTogdGVzdHMgZm9yIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMgYW5kCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRlcy4KIwojIENvcHlyaWdodCAoQykgMjAwNS0yMDA3IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KIwojIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgojCiMgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKIyB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KIwojIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAojIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKIyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CiMKIyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAojICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCiMgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCiMgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KIyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQojICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KIyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgoKaW1wb3J0IHVuaXR0ZXN0CmltcG9ydCBzcWxpdGUzIGFzIHNxbGl0ZQoKZGVmIGZ1bmNfcmV0dXJudGV4dCgpOgogICAgcmV0dXJuICJmb28iCmRlZiBmdW5jX3JldHVybnVuaWNvZGUoKToKICAgIHJldHVybiAiYmFyIgpkZWYgZnVuY19yZXR1cm5pbnQoKToKICAgIHJldHVybiA0MgpkZWYgZnVuY19yZXR1cm5mbG9hdCgpOgogICAgcmV0dXJuIDMuMTQKZGVmIGZ1bmNfcmV0dXJubnVsbCgpOgogICAgcmV0dXJuIE5vbmUKZGVmIGZ1bmNfcmV0dXJuYmxvYigpOgogICAgcmV0dXJuIGIiYmxvYiIKZGVmIGZ1bmNfcmV0dXJubG9uZ2xvbmcoKToKICAgIHJldHVybiAxPDwzMQpkZWYgZnVuY19yYWlzZWV4Y2VwdGlvbigpOgogICAgNS8wCgpkZWYgZnVuY19pc3N0cmluZyh2KToKICAgIHJldHVybiB0eXBlKHYpIGlzIHN0cgpkZWYgZnVuY19pc2ludCh2KToKICAgIHJldHVybiB0eXBlKHYpIGlzIGludApkZWYgZnVuY19pc2Zsb2F0KHYpOgogICAgcmV0dXJuIHR5cGUodikgaXMgZmxvYXQKZGVmIGZ1bmNfaXNub25lKHYpOgogICAgcmV0dXJuIHR5cGUodikgaXMgdHlwZShOb25lKQpkZWYgZnVuY19pc2Jsb2Iodik6CiAgICByZXR1cm4gaXNpbnN0YW5jZSh2LCAoYnl0ZXMsIG1lbW9yeXZpZXcpKQpkZWYgZnVuY19pc2xvbmdsb25nKHYpOgogICAgcmV0dXJuIGlzaW5zdGFuY2UodiwgaW50KSBhbmQgdiA+PSAxPDwzMQoKZGVmIGZ1bmMoKmFyZ3MpOgogICAgcmV0dXJuIGxlbihhcmdzKQoKY2xhc3MgQWdnck5vU3RlcDoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIGZpbmFsaXplKHNlbGYpOgogICAgICAgIHJldHVybiAxCgpjbGFzcyBBZ2dyTm9GaW5hbGl6ZToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIHN0ZXAoc2VsZiwgeCk6CiAgICAgICAgcGFzcwoKY2xhc3MgQWdnckV4Y2VwdGlvbkluSW5pdDoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICA1LzAKCiAgICBkZWYgc3RlcChzZWxmLCB4KToKICAgICAgICBwYXNzCgogICAgZGVmIGZpbmFsaXplKHNlbGYpOgogICAgICAgIHBhc3MKCmNsYXNzIEFnZ3JFeGNlcHRpb25JblN0ZXA6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgcGFzcwoKICAgIGRlZiBzdGVwKHNlbGYsIHgpOgogICAgICAgIDUvMAoKICAgIGRlZiBmaW5hbGl6ZShzZWxmKToKICAgICAgICByZXR1cm4gNDIKCmNsYXNzIEFnZ3JFeGNlcHRpb25JbkZpbmFsaXplOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHBhc3MKCiAgICBkZWYgc3RlcChzZWxmLCB4KToKICAgICAgICBwYXNzCgogICAgZGVmIGZpbmFsaXplKHNlbGYpOgogICAgICAgIDUvMAoKY2xhc3MgQWdnckNoZWNrVHlwZToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLnZhbCA9IE5vbmUKCiAgICBkZWYgc3RlcChzZWxmLCB3aGljaFR5cGUsIHZhbCk6CiAgICAgICAgdGhlVHlwZSA9IHsic3RyIjogc3RyLCAiaW50IjogaW50LCAiZmxvYXQiOiBmbG9hdCwgIk5vbmUiOiB0eXBlKE5vbmUpLAogICAgICAgICAgICAgICAgICAgImJsb2IiOiBieXRlc30KICAgICAgICBzZWxmLnZhbCA9IGludCh0aGVUeXBlW3doaWNoVHlwZV0gaXMgdHlwZSh2YWwpKQoKICAgIGRlZiBmaW5hbGl6ZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi52YWwKCmNsYXNzIEFnZ3JDaGVja1R5cGVzOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYudmFsID0gMAoKICAgIGRlZiBzdGVwKHNlbGYsIHdoaWNoVHlwZSwgKnZhbHMpOgogICAgICAgIHRoZVR5cGUgPSB7InN0ciI6IHN0ciwgImludCI6IGludCwgImZsb2F0IjogZmxvYXQsICJOb25lIjogdHlwZShOb25lKSwKICAgICAgICAgICAgICAgICAgICJibG9iIjogYnl0ZXN9CiAgICAgICAgZm9yIHZhbCBpbiB2YWxzOgogICAgICAgICAgICBzZWxmLnZhbCArPSBpbnQodGhlVHlwZVt3aGljaFR5cGVdIGlzIHR5cGUodmFsKSkKCiAgICBkZWYgZmluYWxpemUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudmFsCgpjbGFzcyBBZ2dyU3VtOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYudmFsID0gMC4wCgogICAgZGVmIHN0ZXAoc2VsZiwgdmFsKToKICAgICAgICBzZWxmLnZhbCArPSB2YWwKCiAgICBkZWYgZmluYWxpemUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudmFsCgpjbGFzcyBGdW5jdGlvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCgogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmV0dXJudGV4dCIsIDAsIGZ1bmNfcmV0dXJudGV4dCkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJldHVybnVuaWNvZGUiLCAwLCBmdW5jX3JldHVybnVuaWNvZGUpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZXR1cm5pbnQiLCAwLCBmdW5jX3JldHVybmludCkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJldHVybmZsb2F0IiwgMCwgZnVuY19yZXR1cm5mbG9hdCkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJldHVybm51bGwiLCAwLCBmdW5jX3JldHVybm51bGwpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZXR1cm5ibG9iIiwgMCwgZnVuY19yZXR1cm5ibG9iKQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmV0dXJubG9uZ2xvbmciLCAwLCBmdW5jX3JldHVybmxvbmdsb25nKQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmFpc2VleGNlcHRpb24iLCAwLCBmdW5jX3JhaXNlZXhjZXB0aW9uKQoKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImlzc3RyaW5nIiwgMSwgZnVuY19pc3N0cmluZykKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImlzaW50IiwgMSwgZnVuY19pc2ludCkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImlzZmxvYXQiLCAxLCBmdW5jX2lzZmxvYXQpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJpc25vbmUiLCAxLCBmdW5jX2lzbm9uZSkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImlzYmxvYiIsIDEsIGZ1bmNfaXNibG9iKQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigiaXNsb25nbG9uZyIsIDEsIGZ1bmNfaXNsb25nbG9uZykKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInNwYW0iLCAtMSwgZnVuYykKCiAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgc2VsZi5jb24uY2xvc2UoKQoKICAgIGRlZiBDaGVja0Z1bmNFcnJvck9uQ3JlYXRlKHNlbGYpOgogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IpOgogICAgICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImJsYSIsIC0xMDAsIGxhbWJkYSB4OiAyKngpCgogICAgZGVmIENoZWNrRnVuY1JlZkNvdW50KHNlbGYpOgogICAgICAgIGRlZiBnZXRmdW5jKCk6CiAgICAgICAgICAgIGRlZiBmKCk6CiAgICAgICAgICAgICAgICByZXR1cm4gMQogICAgICAgICAgICByZXR1cm4gZgogICAgICAgIGYgPSBnZXRmdW5jKCkKICAgICAgICBnbG9iYWxzKClbImZvbyJdID0gZgogICAgICAgICMgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZWZ0ZXN0IiwgMCwgZ2V0ZnVuYygpKQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmVmdGVzdCIsIDAsIGYpCiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJlZnRlc3QoKSIpCgogICAgZGVmIENoZWNrRnVuY1JldHVyblRleHQoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybnRleHQoKSIpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodmFsKSwgc3RyKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAiZm9vIikKCiAgICBkZWYgQ2hlY2tGdW5jUmV0dXJuVW5pY29kZShzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJudW5pY29kZSgpIikKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWwpLCBzdHIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsICJiYXIiKQoKICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5JbnQoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybmludCgpIikKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWwpLCBpbnQpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDQyKQoKICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5GbG9hdChzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJuZmxvYXQoKSIpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodmFsKSwgZmxvYXQpCiAgICAgICAgaWYgdmFsIDwgMy4xMzkgb3IgdmFsID4gMy4xNDE6CiAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgdmFsdWUiKQoKICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5OdWxsKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByZXR1cm5udWxsKCkiKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbCksIHR5cGUoTm9uZSkpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIE5vbmUpCgogICAgZGVmIENoZWNrRnVuY1JldHVybkJsb2Ioc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybmJsb2IoKSIpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodmFsKSwgYnl0ZXMpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIGIiYmxvYiIpCgogICAgZGVmIENoZWNrRnVuY1JldHVybkxvbmdMb25nKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByZXR1cm5sb25nbG9uZygpIikKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAxPDwzMSkKCiAgICBkZWYgQ2hlY2tGdW5jRXhjZXB0aW9uKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcikgYXMgY206CiAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmFpc2VleGNlcHRpb24oKSIpCiAgICAgICAgICAgIGN1ci5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY20uZXhjZXB0aW9uKSwgJ3VzZXItZGVmaW5lZCBmdW5jdGlvbiByYWlzZWQgZXhjZXB0aW9uJykKCiAgICBkZWYgQ2hlY2tQYXJhbVN0cmluZyhzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaXNzdHJpbmcoPykiLCAoImZvbyIsKSkKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAxKQoKICAgIGRlZiBDaGVja1BhcmFtSW50KHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpc2ludCg/KSIsICg0MiwpKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCgogICAgZGVmIENoZWNrUGFyYW1GbG9hdChzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaXNmbG9hdCg/KSIsICgzLjE0LCkpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKCiAgICBkZWYgQ2hlY2tQYXJhbU5vbmUoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGlzbm9uZSg/KSIsIChOb25lLCkpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKCiAgICBkZWYgQ2hlY2tQYXJhbUJsb2Ioc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGlzYmxvYig/KSIsIChtZW1vcnl2aWV3KGIiYmxvYiIpLCkpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKCiAgICBkZWYgQ2hlY2tQYXJhbUxvbmdMb25nKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpc2xvbmdsb25nKD8pIiwgKDE8PDQyLCkpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKCiAgICBkZWYgQ2hlY2tBbnlBcmd1bWVudHMoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHNwYW0oPywgPykiLCAoMSwgMikpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMikKCgpjbGFzcyBBZ2dyZWdhdGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoIiIiCiAgICAgICAgICAgIGNyZWF0ZSB0YWJsZSB0ZXN0KAogICAgICAgICAgICAgICAgdCB0ZXh0LAogICAgICAgICAgICAgICAgaSBpbnRlZ2VyLAogICAgICAgICAgICAgICAgZiBmbG9hdCwKICAgICAgICAgICAgICAgIG4sCiAgICAgICAgICAgICAgICBiIGJsb2IKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgIiIiKQogICAgICAgIGN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHQsIGksIGYsIG4sIGIpIHZhbHVlcyAoPywgPywgPywgPywgPykiLAogICAgICAgICAgICAoImZvbyIsIDUsIDMuMTQsIE5vbmUsIG1lbW9yeXZpZXcoYiJibG9iIiksKSkKCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2FnZ3JlZ2F0ZSgibm9zdGVwIiwgMSwgQWdnck5vU3RlcCkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJub2ZpbmFsaXplIiwgMSwgQWdnck5vRmluYWxpemUpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2FnZ3JlZ2F0ZSgiZXhjSW5pdCIsIDEsIEFnZ3JFeGNlcHRpb25JbkluaXQpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2FnZ3JlZ2F0ZSgiZXhjU3RlcCIsIDEsIEFnZ3JFeGNlcHRpb25JblN0ZXApCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2FnZ3JlZ2F0ZSgiZXhjRmluYWxpemUiLCAxLCBBZ2dyRXhjZXB0aW9uSW5GaW5hbGl6ZSkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJjaGVja1R5cGUiLCAyLCBBZ2dyQ2hlY2tUeXBlKQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9hZ2dyZWdhdGUoImNoZWNrVHlwZXMiLCAtMSwgQWdnckNoZWNrVHlwZXMpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2FnZ3JlZ2F0ZSgibXlzdW0iLCAxLCBBZ2dyU3VtKQoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICAjc2VsZi5jdXIuY2xvc2UoKQogICAgICAgICNzZWxmLmNvbi5jbG9zZSgpCiAgICAgICAgcGFzcwoKICAgIGRlZiBDaGVja0FnZ3JFcnJvck9uQ3JlYXRlKHNlbGYpOgogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IpOgogICAgICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImJsYSIsIC0xMDAsIEFnZ3JTdW0pCgogICAgZGVmIENoZWNrQWdnck5vU3RlcChzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IpIGFzIGNtOgogICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IG5vc3RlcCh0KSBmcm9tIHRlc3QiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNtLmV4Y2VwdGlvbiksICInQWdnck5vU3RlcCcgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJ3N0ZXAnIikKCiAgICBkZWYgQ2hlY2tBZ2dyTm9GaW5hbGl6ZShzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IpIGFzIGNtOgogICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IG5vZmluYWxpemUodCkgZnJvbSB0ZXN0IikKICAgICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLCAidXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSdzICdmaW5hbGl6ZScgbWV0aG9kIHJhaXNlZCBlcnJvciIpCgogICAgZGVmIENoZWNrQWdnckV4Y2VwdGlvbkluSW5pdChzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IpIGFzIGNtOgogICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGV4Y0luaXQodCkgZnJvbSB0ZXN0IikKICAgICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLCAidXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSdzICdfX2luaXRfXycgbWV0aG9kIHJhaXNlZCBlcnJvciIpCgogICAgZGVmIENoZWNrQWdnckV4Y2VwdGlvbkluU3RlcChzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IpIGFzIGNtOgogICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGV4Y1N0ZXAodCkgZnJvbSB0ZXN0IikKICAgICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLCAidXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSdzICdzdGVwJyBtZXRob2QgcmFpc2VkIGVycm9yIikKCiAgICBkZWYgQ2hlY2tBZ2dyRXhjZXB0aW9uSW5GaW5hbGl6ZShzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IpIGFzIGNtOgogICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGV4Y0ZpbmFsaXplKHQpIGZyb20gdGVzdCIpCiAgICAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY20uZXhjZXB0aW9uKSwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnZmluYWxpemUnIG1ldGhvZCByYWlzZWQgZXJyb3IiKQoKICAgIGRlZiBDaGVja0FnZ3JDaGVja1BhcmFtU3RyKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBjaGVja1R5cGUoJ3N0cicsID8pIiwgKCJmb28iLCkpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKCiAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbUludChzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgY2hlY2tUeXBlKCdpbnQnLCA/KSIsICg0MiwpKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCgogICAgZGVmIENoZWNrQWdnckNoZWNrUGFyYW1zSW50KHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBjaGVja1R5cGVzKCdpbnQnLCA/LCA/KSIsICg0MiwgMjQpKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDIpCgogICAgZGVmIENoZWNrQWdnckNoZWNrUGFyYW1GbG9hdChzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgY2hlY2tUeXBlKCdmbG9hdCcsID8pIiwgKDMuMTQsKSkKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAxKQoKICAgIGRlZiBDaGVja0FnZ3JDaGVja1BhcmFtTm9uZShzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgY2hlY2tUeXBlKCdOb25lJywgPykiLCAoTm9uZSwpKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCgogICAgZGVmIENoZWNrQWdnckNoZWNrUGFyYW1CbG9iKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBjaGVja1R5cGUoJ2Jsb2InLCA/KSIsIChtZW1vcnl2aWV3KGIiYmxvYiIpLCkpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKCiAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tBZ2dyU3VtKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoImRlbGV0ZSBmcm9tIHRlc3QiKQogICAgICAgIGN1ci5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKD8pIiwgWygxMCwpLCAoMjAsKSwgKDMwLCldKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgbXlzdW0oaSkgZnJvbSB0ZXN0IikKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCA2MCkKCmNsYXNzIEF1dGhvcml6ZXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgYXV0aG9yaXplcl9jYihhY3Rpb24sIGFyZzEsIGFyZzIsIGRibmFtZSwgc291cmNlKToKICAgICAgICBpZiBhY3Rpb24gIT0gc3FsaXRlLlNRTElURV9TRUxFQ1Q6CiAgICAgICAgICAgIHJldHVybiBzcWxpdGUuU1FMSVRFX0RFTlkKICAgICAgICBpZiBhcmcyID09ICdjMicgb3IgYXJnMSA9PSAndDInOgogICAgICAgICAgICByZXR1cm4gc3FsaXRlLlNRTElURV9ERU5ZCiAgICAgICAgcmV0dXJuIHNxbGl0ZS5TUUxJVEVfT0sKCiAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIHNlbGYuY29uLmV4ZWN1dGVzY3JpcHQoIiIiCiAgICAgICAgICAgIGNyZWF0ZSB0YWJsZSB0MSAoYzEsIGMyKTsKICAgICAgICAgICAgY3JlYXRlIHRhYmxlIHQyIChjMSwgYzIpOwogICAgICAgICAgICBpbnNlcnQgaW50byB0MSAoYzEsIGMyKSB2YWx1ZXMgKDEsIDIpOwogICAgICAgICAgICBpbnNlcnQgaW50byB0MiAoYzEsIGMyKSB2YWx1ZXMgKDQsIDUpOwogICAgICAgICAgICAiIiIpCgogICAgICAgICMgRm9yIG91ciBzZWN1cml0eSB0ZXN0OgogICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCBjMiBmcm9tIHQyIikKCiAgICAgICAgc2VsZi5jb24uc2V0X2F1dGhvcml6ZXIoc2VsZi5hdXRob3JpemVyX2NiKQoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIHRlc3RfdGFibGVfYWNjZXNzKHNlbGYpOgogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLkRhdGFiYXNlRXJyb3IpIGFzIGNtOgogICAgICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgKiBmcm9tIHQyIikKICAgICAgICBzZWxmLmFzc2VydEluKCdwcm9oaWJpdGVkJywgc3RyKGNtLmV4Y2VwdGlvbikpCgogICAgZGVmIHRlc3RfY29sdW1uX2FjY2VzcyhzZWxmKToKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5EYXRhYmFzZUVycm9yKSBhcyBjbToKICAgICAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IGMyIGZyb20gdDEiKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3Byb2hpYml0ZWQnLCBzdHIoY20uZXhjZXB0aW9uKSkKCmNsYXNzIEF1dGhvcml6ZXJSYWlzZUV4Y2VwdGlvblRlc3RzKEF1dGhvcml6ZXJUZXN0cyk6CiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgYXV0aG9yaXplcl9jYihhY3Rpb24sIGFyZzEsIGFyZzIsIGRibmFtZSwgc291cmNlKToKICAgICAgICBpZiBhY3Rpb24gIT0gc3FsaXRlLlNRTElURV9TRUxFQ1Q6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKICAgICAgICBpZiBhcmcyID09ICdjMicgb3IgYXJnMSA9PSAndDInOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCiAgICAgICAgcmV0dXJuIHNxbGl0ZS5TUUxJVEVfT0sKCmNsYXNzIEF1dGhvcml6ZXJJbGxlZ2FsVHlwZVRlc3RzKEF1dGhvcml6ZXJUZXN0cyk6CiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgYXV0aG9yaXplcl9jYihhY3Rpb24sIGFyZzEsIGFyZzIsIGRibmFtZSwgc291cmNlKToKICAgICAgICBpZiBhY3Rpb24gIT0gc3FsaXRlLlNRTElURV9TRUxFQ1Q6CiAgICAgICAgICAgIHJldHVybiAwLjAKICAgICAgICBpZiBhcmcyID09ICdjMicgb3IgYXJnMSA9PSAndDInOgogICAgICAgICAgICByZXR1cm4gMC4wCiAgICAgICAgcmV0dXJuIHNxbGl0ZS5TUUxJVEVfT0sKCmNsYXNzIEF1dGhvcml6ZXJMYXJnZUludGVnZXJUZXN0cyhBdXRob3JpemVyVGVzdHMpOgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGF1dGhvcml6ZXJfY2IoYWN0aW9uLCBhcmcxLCBhcmcyLCBkYm5hbWUsIHNvdXJjZSk6CiAgICAgICAgaWYgYWN0aW9uICE9IHNxbGl0ZS5TUUxJVEVfU0VMRUNUOgogICAgICAgICAgICByZXR1cm4gMioqMzIKICAgICAgICBpZiBhcmcyID09ICdjMicgb3IgYXJnMSA9PSAndDInOgogICAgICAgICAgICByZXR1cm4gMioqMzIKICAgICAgICByZXR1cm4gc3FsaXRlLlNRTElURV9PSwoKCmRlZiBzdWl0ZSgpOgogICAgZnVuY3Rpb25fc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoRnVuY3Rpb25UZXN0cywgIkNoZWNrIikKICAgIGFnZ3JlZ2F0ZV9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShBZ2dyZWdhdGVUZXN0cywgIkNoZWNrIikKICAgIGF1dGhvcml6ZXJfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQXV0aG9yaXplclRlc3RzKQogICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgoCiAgICAgICAgICAgIGZ1bmN0aW9uX3N1aXRlLAogICAgICAgICAgICBhZ2dyZWdhdGVfc3VpdGUsCiAgICAgICAgICAgIGF1dGhvcml6ZXJfc3VpdGUsCiAgICAgICAgICAgIHVuaXR0ZXN0Lm1ha2VTdWl0ZShBdXRob3JpemVyUmFpc2VFeGNlcHRpb25UZXN0cyksCiAgICAgICAgICAgIHVuaXR0ZXN0Lm1ha2VTdWl0ZShBdXRob3JpemVySWxsZWdhbFR5cGVUZXN0cyksCiAgICAgICAgICAgIHVuaXR0ZXN0Lm1ha2VTdWl0ZShBdXRob3JpemVyTGFyZ2VJbnRlZ2VyVGVzdHMpLAogICAgICAgICkpCgpkZWYgdGVzdCgpOgogICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQogICAgcnVubmVyLnJ1bihzdWl0ZSgpKQoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIHRlc3QoKQo=