Iy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCiMgcHlzcWxpdGUyL3Rlc3QvZmFjdG9yeS5weTogdGVzdHMgZm9yIHRoZSB2YXJpb3VzIGZhY3RvcmllcyBpbiBweXNxbGl0ZQojCiMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgojCiMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiMKIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAojIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgojCiMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAojIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKIwojIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CiMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgojIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCiMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgojIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCgppbXBvcnQgdW5pdHRlc3QKaW1wb3J0IHNxbGl0ZTMgYXMgc3FsaXRlCgpjbGFzcyBNeUNvbm5lY3Rpb24oc3FsaXRlLkNvbm5lY3Rpb24pOgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgc3FsaXRlLkNvbm5lY3Rpb24uX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQoKZGVmIGRpY3RfZmFjdG9yeShjdXJzb3IsIHJvdyk6CiAgICBkID0ge30KICAgIGZvciBpZHgsIGNvbCBpbiBlbnVtZXJhdGUoY3Vyc29yLmRlc2NyaXB0aW9uKToKICAgICAgICBkW2NvbFswXV0gPSByb3dbaWR4XQogICAgcmV0dXJuIGQKCmNsYXNzIE15Q3Vyc29yKHNxbGl0ZS5DdXJzb3IpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgc3FsaXRlLkN1cnNvci5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCiAgICAgICAgc2VsZi5yb3dfZmFjdG9yeSA9IGRpY3RfZmFjdG9yeQoKY2xhc3MgQ29ubmVjdGlvbkZhY3RvcnlUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiLCBmYWN0b3J5PU15Q29ubmVjdGlvbikKCiAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgc2VsZi5jb24uY2xvc2UoKQoKICAgIGRlZiBDaGVja0lzSW5zdGFuY2Uoc2VsZik6CiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi5jb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXlDb25uZWN0aW9uKSwKICAgICAgICAgICAgICAgICAgICAgICAgImNvbm5lY3Rpb24gaXMgbm90IGluc3RhbmNlIG9mIE15Q29ubmVjdGlvbiIpCgpjbGFzcyBDdXJzb3JGYWN0b3J5VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKCiAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgc2VsZi5jb24uY2xvc2UoKQoKICAgIGRlZiBDaGVja0lzSW5zdGFuY2Uoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKGZhY3Rvcnk9TXlDdXJzb3IpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoY3VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE15Q3Vyc29yKSwKICAgICAgICAgICAgICAgICAgICAgICAgImN1cnNvciBpcyBub3QgaW5zdGFuY2Ugb2YgTXlDdXJzb3IiKQoKY2xhc3MgUm93RmFjdG9yeVRlc3RzQmFja3dhcmRzQ29tcGF0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCgogICAgZGVmIENoZWNrSXNQcm9kdWNlZEJ5RmFjdG9yeShzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoZmFjdG9yeT1NeUN1cnNvcikKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IDQrNSBhcyBmb28iKQogICAgICAgIHJvdyA9IGN1ci5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uocm93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QpLAogICAgICAgICAgICAgICAgICAgICAgICAicm93IGlzIG5vdCBpbnN0YW5jZSBvZiBkaWN0IikKICAgICAgICBjdXIuY2xvc2UoKQoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCgpjbGFzcyBSb3dGYWN0b3J5VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKCiAgICBkZWYgQ2hlY2tDdXN0b21GYWN0b3J5KHNlbGYpOgogICAgICAgIHNlbGYuY29uLnJvd19mYWN0b3J5ID0gbGFtYmRhIGN1ciwgcm93OiBsaXN0KHJvdykKICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgMSwgMiIpLmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShyb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCksCiAgICAgICAgICAgICAgICAgICAgICAgICJyb3cgaXMgbm90IGluc3RhbmNlIG9mIGxpc3QiKQoKICAgIGRlZiBDaGVja1NxbGl0ZVJvd0luZGV4KHNlbGYpOgogICAgICAgIHNlbGYuY29uLnJvd19mYWN0b3J5ID0gc3FsaXRlLlJvdwogICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCAxIGFzIGEsIDIgYXMgYiIpLmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShyb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FsaXRlLlJvdyksCiAgICAgICAgICAgICAgICAgICAgICAgICJyb3cgaXMgbm90IGluc3RhbmNlIG9mIHNxbGl0ZS5Sb3ciKQoKICAgICAgICBjb2wxLCBjb2wyID0gcm93WyJhIl0sIHJvd1siYiJdCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbDEgPT0gMSwgImJ5IG5hbWU6IHdyb25nIHJlc3VsdCBmb3IgY29sdW1uICdhJyIpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbDIgPT0gMiwgImJ5IG5hbWU6IHdyb25nIHJlc3VsdCBmb3IgY29sdW1uICdhJyIpCgogICAgICAgIGNvbDEsIGNvbDIgPSByb3dbIkEiXSwgcm93WyJCIl0KICAgICAgICBzZWxmLmFzc2VydFRydWUoY29sMSA9PSAxLCAiYnkgbmFtZTogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gJ0EnIikKICAgICAgICBzZWxmLmFzc2VydFRydWUoY29sMiA9PSAyLCAiYnkgbmFtZTogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gJ0InIikKCiAgICAgICAgY29sMSwgY29sMiA9IHJvd1swXSwgcm93WzFdCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbDEgPT0gMSwgImJ5IGluZGV4OiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAwIikKICAgICAgICBzZWxmLmFzc2VydFRydWUoY29sMiA9PSAyLCAiYnkgaW5kZXg6IHdyb25nIHJlc3VsdCBmb3IgY29sdW1uIDEiKQoKICAgIGRlZiBDaGVja1NxbGl0ZVJvd0l0ZXIoc2VsZik6CiAgICAgICAgIiIiQ2hlY2tzIGlmIHRoZSByb3cgb2JqZWN0IGlzIGl0ZXJhYmxlIiIiCiAgICAgICAgc2VsZi5jb24ucm93X2ZhY3RvcnkgPSBzcWxpdGUuUm93CiAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IDEgYXMgYSwgMiBhcyBiIikuZmV0Y2hvbmUoKQogICAgICAgIGZvciBjb2wgaW4gcm93OgogICAgICAgICAgICBwYXNzCgogICAgZGVmIENoZWNrU3FsaXRlUm93QXNUdXBsZShzZWxmKToKICAgICAgICAiIiJDaGVja3MgaWYgdGhlIHJvdyBvYmplY3QgY2FuIGJlIGNvbnZlcnRlZCB0byBhIHR1cGxlIiIiCiAgICAgICAgc2VsZi5jb24ucm93X2ZhY3RvcnkgPSBzcWxpdGUuUm93CiAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IDEgYXMgYSwgMiBhcyBiIikuZmV0Y2hvbmUoKQogICAgICAgIHQgPSB0dXBsZShyb3cpCgogICAgZGVmIENoZWNrU3FsaXRlUm93QXNEaWN0KHNlbGYpOgogICAgICAgICIiIkNoZWNrcyBpZiB0aGUgcm93IG9iamVjdCBjYW4gYmUgY29ycmVjdGx5IGNvbnZlcnRlZCB0byBhIGRpY3Rpb25hcnkiIiIKICAgICAgICBzZWxmLmNvbi5yb3dfZmFjdG9yeSA9IHNxbGl0ZS5Sb3cKICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgMSBhcyBhLCAyIGFzIGIiKS5mZXRjaG9uZSgpCiAgICAgICAgZCA9IGRpY3Qocm93KQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsiYSJdLCByb3dbImEiXSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbImIiXSwgcm93WyJiIl0pCgogICAgZGVmIENoZWNrU3FsaXRlUm93SGFzaENtcChzZWxmKToKICAgICAgICAiIiJDaGVja3MgaWYgdGhlIHJvdyBvYmplY3QgY29tcGFyZXMgYW5kIGhhc2hlcyBjb3JyZWN0bHkiIiIKICAgICAgICBzZWxmLmNvbi5yb3dfZmFjdG9yeSA9IHNxbGl0ZS5Sb3cKICAgICAgICByb3dfMSA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCAxIGFzIGEsIDIgYXMgYiIpLmZldGNob25lKCkKICAgICAgICByb3dfMiA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCAxIGFzIGEsIDIgYXMgYiIpLmZldGNob25lKCkKICAgICAgICByb3dfMyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCAxIGFzIGEsIDMgYXMgYiIpLmZldGNob25lKCkKCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJvd18xID09IHJvd18xKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyb3dfMSA9PSByb3dfMikKICAgICAgICBzZWxmLmFzc2VydFRydWUocm93XzIgIT0gcm93XzMpCgogICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uocm93XzEgIT0gcm93XzEpCiAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyb3dfMSAhPSByb3dfMikKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJvd18yID09IHJvd18zKQoKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd18xLCByb3dfMikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2gocm93XzEpLCBoYXNoKHJvd18yKSkKICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJvd18xLCByb3dfMykKICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGhhc2gocm93XzEpLCBoYXNoKHJvd18zKSkKCiAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgc2VsZi5jb24uY2xvc2UoKQoKY2xhc3MgVGV4dEZhY3RvcnlUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQoKICAgIGRlZiBDaGVja1VuaWNvZGUoc2VsZik6CiAgICAgICAgYXVzdHJpYSA9IHVuaWNvZGUoItZzdGVycmVpY2giLCAibGF0aW4xIikKICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgPyIsIChhdXN0cmlhLCkpLmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShyb3dbMF0pID09IHVuaWNvZGUsICJ0eXBlIG9mIHJvd1swXSBtdXN0IGJlIHVuaWNvZGUiKQoKICAgIGRlZiBDaGVja1N0cmluZyhzZWxmKToKICAgICAgICBzZWxmLmNvbi50ZXh0X2ZhY3RvcnkgPSBzdHIKICAgICAgICBhdXN0cmlhID0gdW5pY29kZSgi1nN0ZXJyZWljaCIsICJsYXRpbjEiKQogICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCA/IiwgKGF1c3RyaWEsKSkuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHJvd1swXSkgPT0gc3RyLCAidHlwZSBvZiByb3dbMF0gbXVzdCBiZSBzdHIiKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyb3dbMF0gPT0gYXVzdHJpYS5lbmNvZGUoInV0Zi04IiksICJjb2x1bW4gbXVzdCBlcXVhbCBvcmlnaW5hbCBkYXRhIGluIFVURi04IikKCiAgICBkZWYgQ2hlY2tDdXN0b20oc2VsZik6CiAgICAgICAgc2VsZi5jb24udGV4dF9mYWN0b3J5ID0gbGFtYmRhIHg6IHVuaWNvZGUoeCwgInV0Zi04IiwgImlnbm9yZSIpCiAgICAgICAgYXVzdHJpYSA9IHVuaWNvZGUoItZzdGVycmVpY2giLCAibGF0aW4xIikKICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgPyIsIChhdXN0cmlhLmVuY29kZSgibGF0aW4xIiksKSkuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHJvd1swXSkgPT0gdW5pY29kZSwgInR5cGUgb2Ygcm93WzBdIG11c3QgYmUgdW5pY29kZSIpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJvd1swXS5lbmRzd2l0aCh1InJlaWNoIiksICJjb2x1bW4gbXVzdCBjb250YWluIG9yaWdpbmFsIGRhdGEiKQoKICAgIGRlZiBDaGVja09wdGltaXplZFVuaWNvZGUoc2VsZik6CiAgICAgICAgc2VsZi5jb24udGV4dF9mYWN0b3J5ID0gc3FsaXRlLk9wdGltaXplZFVuaWNvZGUKICAgICAgICBhdXN0cmlhID0gdW5pY29kZSgi1nN0ZXJyZWljaCIsICJsYXRpbjEiKQogICAgICAgIGdlcm1hbnkgPSB1bmljb2RlKCJEZXV0Y2hsYW5kIikKICAgICAgICBhX3JvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCA/IiwgKGF1c3RyaWEsKSkuZmV0Y2hvbmUoKQogICAgICAgIGRfcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ID8iLCAoZ2VybWFueSwpKS5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoYV9yb3dbMF0pID09IHVuaWNvZGUsICJ0eXBlIG9mIG5vbi1BU0NJSSByb3cgbXVzdCBiZSB1bmljb2RlIikKICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShkX3Jvd1swXSkgPT0gc3RyLCAidHlwZSBvZiBBU0NJSS1vbmx5IHJvdyBtdXN0IGJlIHN0ciIpCgogICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgIHNlbGYuY29uLmNsb3NlKCkKCmNsYXNzIFRleHRGYWN0b3J5VGVzdHNXaXRoRW1iZWRkZWRaZXJvQnl0ZXModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdCAodmFsdWUgdGV4dCkiKQogICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QgKHZhbHVlKSB2YWx1ZXMgKD8pIiwgKCJhXHgwMGIiLCkpCgogICAgZGVmIENoZWNrU3RyaW5nKHNlbGYpOgogICAgICAgICMgdGV4dF9mYWN0b3J5IGRlZmF1bHRzIHRvIHVuaWNvZGUKICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgdmFsdWUgZnJvbSB0ZXN0IikuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShyb3dbMF0pLCB1bmljb2RlKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCAiYVx4MDBiIikKCiAgICBkZWYgQ2hlY2tDdXN0b20oc2VsZik6CiAgICAgICAgIyBBIGN1c3RvbSBmYWN0b3J5IHNob3VsZCByZWNlaXZlIGFuIHN0ciBhcmd1bWVudAogICAgICAgIHNlbGYuY29uLnRleHRfZmFjdG9yeSA9IGxhbWJkYSB4OiB4CiAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IHZhbHVlIGZyb20gdGVzdCIpLmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUocm93WzBdKSwgc3RyKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCAiYVx4MDBiIikKCiAgICBkZWYgQ2hlY2tPcHRpbWl6ZWRVbmljb2RlQXNTdHJpbmcoc2VsZik6CiAgICAgICAgIyBBU0NJSSAtPiBzdHIgYXJndW1lbnQKICAgICAgICBzZWxmLmNvbi50ZXh0X2ZhY3RvcnkgPSBzcWxpdGUuT3B0aW1pemVkVW5pY29kZQogICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCB2YWx1ZSBmcm9tIHRlc3QiKS5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKHJvd1swXSksIHN0cikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgImFceDAwYiIpCgogICAgZGVmIENoZWNrT3B0aW1pemVkVW5pY29kZUFzVW5pY29kZShzZWxmKToKICAgICAgICAjIE5vbi1BU0NJSSAtPiB1bmljb2RlIGFyZ3VtZW50CiAgICAgICAgc2VsZi5jb24udGV4dF9mYWN0b3J5ID0gc3FsaXRlLk9wdGltaXplZFVuaWNvZGUKICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCJkZWxldGUgZnJvbSB0ZXN0IikKICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0ICh2YWx1ZSkgdmFsdWVzICg/KSIsICh1J+RcMPYnLCkpCiAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IHZhbHVlIGZyb20gdGVzdCIpLmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUocm93WzBdKSwgdW5pY29kZSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgdSLkXHgwMPYiKQoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCgpkZWYgc3VpdGUoKToKICAgIGNvbm5lY3Rpb25fc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQ29ubmVjdGlvbkZhY3RvcnlUZXN0cywgIkNoZWNrIikKICAgIGN1cnNvcl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDdXJzb3JGYWN0b3J5VGVzdHMsICJDaGVjayIpCiAgICByb3dfc3VpdGVfY29tcGF0ID0gdW5pdHRlc3QubWFrZVN1aXRlKFJvd0ZhY3RvcnlUZXN0c0JhY2t3YXJkc0NvbXBhdCwgIkNoZWNrIikKICAgIHJvd19zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShSb3dGYWN0b3J5VGVzdHMsICJDaGVjayIpCiAgICB0ZXh0X3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFRleHRGYWN0b3J5VGVzdHMsICJDaGVjayIpCiAgICB0ZXh0X3plcm9fYnl0ZXNfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoVGV4dEZhY3RvcnlUZXN0c1dpdGhFbWJlZGRlZFplcm9CeXRlcywgIkNoZWNrIikKICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKGNvbm5lY3Rpb25fc3VpdGUsIGN1cnNvcl9zdWl0ZSwgcm93X3N1aXRlX2NvbXBhdCwgcm93X3N1aXRlLCB0ZXh0X3N1aXRlLCB0ZXh0X3plcm9fYnl0ZXNfc3VpdGUpKQoKZGVmIHRlc3QoKToKICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKCkKICAgIHJ1bm5lci5ydW4oc3VpdGUoKSkKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICB0ZXN0KCkK