Iy0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCiMgcHlzcWxpdGUyL3Rlc3QvZGJhcGkucHk6IHRlc3RzIGZvciBEQi1BUEkgY29tcGxpYW5jZQojCiMgQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgojCiMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiMKIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAojIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgojCiMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAojIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKIwojIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CiMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgojIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCiMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgojIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCgppbXBvcnQgdW5pdHRlc3QKaW1wb3J0IHNxbGl0ZTMgYXMgc3FsaXRlCnRyeToKICAgIGltcG9ydCB0aHJlYWRpbmcKZXhjZXB0IEltcG9ydEVycm9yOgogICAgdGhyZWFkaW5nID0gTm9uZQoKZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IFRFU1RGTiwgdW5saW5rCgoKY2xhc3MgTW9kdWxlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIENoZWNrQVBJTGV2ZWwoc2VsZik6CiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcWxpdGUuYXBpbGV2ZWwsICIyLjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgImFwaWxldmVsIGlzICVzLCBzaG91bGQgYmUgMi4wIiAlIHNxbGl0ZS5hcGlsZXZlbCkKCiAgICBkZWYgQ2hlY2tUaHJlYWRTYWZldHkoc2VsZik6CiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcWxpdGUudGhyZWFkc2FmZXR5LCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgInRocmVhZHNhZmV0eSBpcyAlZCwgc2hvdWxkIGJlIDEiICUgc3FsaXRlLnRocmVhZHNhZmV0eSkKCiAgICBkZWYgQ2hlY2tQYXJhbVN0eWxlKHNlbGYpOgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3FsaXRlLnBhcmFtc3R5bGUsICJxbWFyayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAicGFyYW1zdHlsZSBpcyAnJXMnLCBzaG91bGQgYmUgJ3FtYXJrJyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgc3FsaXRlLnBhcmFtc3R5bGUpCgogICAgZGVmIENoZWNrV2FybmluZyhzZWxmKToKICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuV2FybmluZywgRXhjZXB0aW9uKSwKICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmcgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRXhjZXB0aW9uIikKCiAgICBkZWYgQ2hlY2tFcnJvcihzZWxmKToKICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuRXJyb3IsIEV4Y2VwdGlvbiksCiAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBFeGNlcHRpb24iKQoKICAgIGRlZiBDaGVja0ludGVyZmFjZUVycm9yKHNlbGYpOgogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNxbGl0ZS5JbnRlcmZhY2VFcnJvciwgc3FsaXRlLkVycm9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgIkludGVyZmFjZUVycm9yIGlzIG5vdCBhIHN1YmNsYXNzIG9mIEVycm9yIikKCiAgICBkZWYgQ2hlY2tEYXRhYmFzZUVycm9yKHNlbGYpOgogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNxbGl0ZS5EYXRhYmFzZUVycm9yLCBzcWxpdGUuRXJyb3IpLAogICAgICAgICAgICAgICAgICAgICAgICAiRGF0YWJhc2VFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBFcnJvciIpCgogICAgZGVmIENoZWNrRGF0YUVycm9yKHNlbGYpOgogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNxbGl0ZS5EYXRhRXJyb3IsIHNxbGl0ZS5EYXRhYmFzZUVycm9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGFFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBEYXRhYmFzZUVycm9yIikKCiAgICBkZWYgQ2hlY2tPcGVyYXRpb25hbEVycm9yKHNlbGYpOgogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvciksCiAgICAgICAgICAgICAgICAgICAgICAgICJPcGVyYXRpb25hbEVycm9yIGlzIG5vdCBhIHN1YmNsYXNzIG9mIERhdGFiYXNlRXJyb3IiKQoKICAgIGRlZiBDaGVja0ludGVncml0eUVycm9yKHNlbGYpOgogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNxbGl0ZS5JbnRlZ3JpdHlFcnJvciwgc3FsaXRlLkRhdGFiYXNlRXJyb3IpLAogICAgICAgICAgICAgICAgICAgICAgICAiSW50ZWdyaXR5RXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCgogICAgZGVmIENoZWNrSW50ZXJuYWxFcnJvcihzZWxmKToKICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuSW50ZXJuYWxFcnJvciwgc3FsaXRlLkRhdGFiYXNlRXJyb3IpLAogICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXJuYWxFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBEYXRhYmFzZUVycm9yIikKCiAgICBkZWYgQ2hlY2tQcm9ncmFtbWluZ0Vycm9yKHNlbGYpOgogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvciksCiAgICAgICAgICAgICAgICAgICAgICAgICJQcm9ncmFtbWluZ0Vycm9yIGlzIG5vdCBhIHN1YmNsYXNzIG9mIERhdGFiYXNlRXJyb3IiKQoKICAgIGRlZiBDaGVja05vdFN1cHBvcnRlZEVycm9yKHNlbGYpOgogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNxbGl0ZS5Ob3RTdXBwb3J0ZWRFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcWxpdGUuRGF0YWJhc2VFcnJvciksCiAgICAgICAgICAgICAgICAgICAgICAgICJOb3RTdXBwb3J0ZWRFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBEYXRhYmFzZUVycm9yIikKCmNsYXNzIENvbm5lY3Rpb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CgogICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgIHNlbGYuY3ggPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIGN1ID0gc2VsZi5jeC5jdXJzb3IoKQogICAgICAgIGN1LmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGlkIGludGVnZXIgcHJpbWFyeSBrZXksIG5hbWUgdGV4dCkiKQogICAgICAgIGN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICg/KSIsICgiZm9vIiwpKQoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBzZWxmLmN4LmNsb3NlKCkKCiAgICBkZWYgQ2hlY2tDb21taXQoc2VsZik6CiAgICAgICAgc2VsZi5jeC5jb21taXQoKQoKICAgIGRlZiBDaGVja0NvbW1pdEFmdGVyTm9DaGFuZ2VzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEEgY29tbWl0IHNob3VsZCBhbHNvIHdvcmsgd2hlbiBubyBjaGFuZ2VzIHdlcmUgbWFkZSB0byB0aGUgZGF0YWJhc2UuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5jeC5jb21taXQoKQogICAgICAgIHNlbGYuY3guY29tbWl0KCkKCiAgICBkZWYgQ2hlY2tSb2xsYmFjayhzZWxmKToKICAgICAgICBzZWxmLmN4LnJvbGxiYWNrKCkKCiAgICBkZWYgQ2hlY2tSb2xsYmFja0FmdGVyTm9DaGFuZ2VzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEEgcm9sbGJhY2sgc2hvdWxkIGFsc28gd29yayB3aGVuIG5vIGNoYW5nZXMgd2VyZSBtYWRlIHRvIHRoZSBkYXRhYmFzZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmN4LnJvbGxiYWNrKCkKICAgICAgICBzZWxmLmN4LnJvbGxiYWNrKCkKCiAgICBkZWYgQ2hlY2tDdXJzb3Ioc2VsZik6CiAgICAgICAgY3UgPSBzZWxmLmN4LmN1cnNvcigpCgogICAgZGVmIENoZWNrRmFpbGVkT3BlbihzZWxmKToKICAgICAgICBZT1VfQ0FOTk9UX09QRU5fVEhJUyA9ICIvZm9vL2Jhci9ibGEvMjM1MzQvbXlkYi5kYiIKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yKToKICAgICAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoWU9VX0NBTk5PVF9PUEVOX1RISVMpCgogICAgZGVmIENoZWNrQ2xvc2Uoc2VsZik6CiAgICAgICAgc2VsZi5jeC5jbG9zZSgpCgogICAgZGVmIENoZWNrRXhjZXB0aW9ucyhzZWxmKToKICAgICAgICAjIE9wdGlvbmFsIERCLUFQSSBleHRlbnNpb24uCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN4Lldhcm5pbmcsIHNxbGl0ZS5XYXJuaW5nKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5FcnJvciwgc3FsaXRlLkVycm9yKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5JbnRlcmZhY2VFcnJvciwgc3FsaXRlLkludGVyZmFjZUVycm9yKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5EYXRhYmFzZUVycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvcikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3guRGF0YUVycm9yLCBzcWxpdGUuRGF0YUVycm9yKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5PcGVyYXRpb25hbEVycm9yLCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3guSW50ZWdyaXR5RXJyb3IsIHNxbGl0ZS5JbnRlZ3JpdHlFcnJvcikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3guSW50ZXJuYWxFcnJvciwgc3FsaXRlLkludGVybmFsRXJyb3IpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN4LlByb2dyYW1taW5nRXJyb3IsIHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5Ob3RTdXBwb3J0ZWRFcnJvciwgc3FsaXRlLk5vdFN1cHBvcnRlZEVycm9yKQoKICAgIGRlZiBDaGVja0luVHJhbnNhY3Rpb24oc2VsZik6CiAgICAgICAgIyBDYW4ndCB1c2UgZGIgZnJvbSBzZXRVcCBiZWNhdXNlIHdlIHdhbnQgdG8gdGVzdCBpbml0aWFsIHN0YXRlLgogICAgICAgIGN4ID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjdSA9IGN4LmN1cnNvcigpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjeC5pbl90cmFuc2FjdGlvbiwgRmFsc2UpCiAgICAgICAgY3UuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRyYW5zYWN0aW9udGVzdChpZCBpbnRlZ2VyIHByaW1hcnkga2V5LCBuYW1lIHRleHQpIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGN4LmluX3RyYW5zYWN0aW9uLCBGYWxzZSkKICAgICAgICBjdS5leGVjdXRlKCJpbnNlcnQgaW50byB0cmFuc2FjdGlvbnRlc3QobmFtZSkgdmFsdWVzICg/KSIsICgiZm9vIiwpKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3guaW5fdHJhbnNhY3Rpb24sIFRydWUpCiAgICAgICAgY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0cmFuc2FjdGlvbnRlc3Qgd2hlcmUgbmFtZT0/IiwgWyJmb28iXSkKICAgICAgICByb3cgPSBjdS5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjeC5pbl90cmFuc2FjdGlvbiwgVHJ1ZSkKICAgICAgICBjeC5jb21taXQoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3guaW5fdHJhbnNhY3Rpb24sIEZhbHNlKQogICAgICAgIGN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdHJhbnNhY3Rpb250ZXN0IHdoZXJlIG5hbWU9PyIsIFsiZm9vIl0pCiAgICAgICAgcm93ID0gY3UuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3guaW5fdHJhbnNhY3Rpb24sIEZhbHNlKQoKICAgIGRlZiBDaGVja0luVHJhbnNhY3Rpb25STyhzZWxmKToKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yKToKICAgICAgICAgICAgc2VsZi5jeC5pbl90cmFuc2FjdGlvbiA9IFRydWUKCiAgICBkZWYgQ2hlY2tPcGVuVXJpKHNlbGYpOgogICAgICAgIGlmIHNxbGl0ZS5zcWxpdGVfdmVyc2lvbl9pbmZvIDwgKDMsIDcsIDcpOgogICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5Ob3RTdXBwb3J0ZWRFcnJvcik6CiAgICAgICAgICAgICAgICBzcWxpdGUuY29ubmVjdCgnOm1lbW9yeTonLCB1cmk9VHJ1ZSkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHVubGluaywgVEVTVEZOKQogICAgICAgIHdpdGggc3FsaXRlLmNvbm5lY3QoVEVTVEZOKSBhcyBjeDoKICAgICAgICAgICAgY3guZXhlY3V0ZSgnY3JlYXRlIHRhYmxlIHRlc3QoaWQgaW50ZWdlciknKQogICAgICAgIHdpdGggc3FsaXRlLmNvbm5lY3QoJ2ZpbGU6JyArIFRFU1RGTiwgdXJpPVRydWUpIGFzIGN4OgogICAgICAgICAgICBjeC5leGVjdXRlKCdpbnNlcnQgaW50byB0ZXN0KGlkKSB2YWx1ZXMoMCknKQogICAgICAgIHdpdGggc3FsaXRlLmNvbm5lY3QoJ2ZpbGU6JyArIFRFU1RGTiArICc/bW9kZT1ybycsIHVyaT1UcnVlKSBhcyBjeDoKICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcik6CiAgICAgICAgICAgICAgICBjeC5leGVjdXRlKCdpbnNlcnQgaW50byB0ZXN0KGlkKSB2YWx1ZXMoMSknKQoKICAgIEB1bml0dGVzdC5za2lwSWYoc3FsaXRlLnNxbGl0ZV92ZXJzaW9uX2luZm8gPj0gKDMsIDMsIDEpLAogICAgICAgICAgICAgICAgICAgICAnbmVlZHMgc3FsaXRlIHZlcnNpb25zIG9sZGVyIHRoYW4gMy4zLjEnKQogICAgZGVmIENoZWNrU2FtZVRocmVhZEVycm9yT25PbGRWZXJzaW9uKHNlbGYpOgogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLk5vdFN1cHBvcnRlZEVycm9yKSBhcyBjbToKICAgICAgICAgICAgc3FsaXRlLmNvbm5lY3QoJzptZW1vcnk6JywgY2hlY2tfc2FtZV90aHJlYWQ9RmFsc2UpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY20uZXhjZXB0aW9uKSwgJ3NoYXJlZCBjb25uZWN0aW9ucyBub3QgYXZhaWxhYmxlJykKCmNsYXNzIEN1cnNvclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICBzZWxmLmN4ID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBzZWxmLmN1ID0gc2VsZi5jeC5jdXJzb3IoKQogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgKICAgICAgICAgICAgImNyZWF0ZSB0YWJsZSB0ZXN0KGlkIGludGVnZXIgcHJpbWFyeSBrZXksIG5hbWUgdGV4dCwgIgogICAgICAgICAgICAiaW5jb21lIG51bWJlciwgdW5pcXVlX3Rlc3QgdGV4dCB1bmlxdWUpIgogICAgICAgICkKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICg/KSIsICgiZm9vIiwpKQoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBzZWxmLmN1LmNsb3NlKCkKICAgICAgICBzZWxmLmN4LmNsb3NlKCkKCiAgICBkZWYgQ2hlY2tFeGVjdXRlTm9BcmdzKHNlbGYpOgogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCgogICAgZGVmIENoZWNrRXhlY3V0ZUlsbGVnYWxTcWwoc2VsZik6CiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcik6CiAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IGFzZGYiKQoKICAgIGRlZiBDaGVja0V4ZWN1dGVUb29NdWNoU3FsKHNlbGYpOgogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLldhcm5pbmcpOgogICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCA1KzQ7IHNlbGVjdCA0KzUiKQoKICAgIGRlZiBDaGVja0V4ZWN1dGVUb29NdWNoU3FsMihzZWxmKToKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCA1KzQ7IC0tIGZvbyBiYXIiKQoKICAgIGRlZiBDaGVja0V4ZWN1dGVUb29NdWNoU3FsMyhzZWxmKToKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoIiIiCiAgICAgICAgICAgIHNlbGVjdCA1KzQ7CgogICAgICAgICAgICAvKgogICAgICAgICAgICBmb28KICAgICAgICAgICAgKi8KICAgICAgICAgICAgIiIiKQoKICAgIGRlZiBDaGVja0V4ZWN1dGVXcm9uZ1NxbEFyZyhzZWxmKToKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgogICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoNDIpCgogICAgZGVmIENoZWNrRXhlY3V0ZUFyZ0ludChzZWxmKToKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaWQpIHZhbHVlcyAoPykiLCAoNDIsKSkKCiAgICBkZWYgQ2hlY2tFeGVjdXRlQXJnRmxvYXQoc2VsZik6CiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGluY29tZSkgdmFsdWVzICg/KSIsICgyNTAwLjMyLCkpCgogICAgZGVmIENoZWNrRXhlY3V0ZUFyZ1N0cmluZyhzZWxmKToKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICg/KSIsICgiSHVnbyIsKSkKCiAgICBkZWYgQ2hlY2tFeGVjdXRlQXJnU3RyaW5nV2l0aFplcm9CeXRlKHNlbGYpOgogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKD8pIiwgKCJIdVx4MDBnbyIsKSkKCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3Qgd2hlcmUgaWQ9PyIsIChzZWxmLmN1Lmxhc3Ryb3dpZCwpKQogICAgICAgIHJvdyA9IHNlbGYuY3UuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCAiSHVceDAwZ28iKQoKICAgIGRlZiBDaGVja0V4ZWN1dGVOb25JdGVyYWJsZShzZWxmKToKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpIGFzIGNtOgogICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaWQpIHZhbHVlcyAoPykiLCA0MikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLCAncGFyYW1ldGVycyBhcmUgb2YgdW5zdXBwb3J0ZWQgdHlwZScpCgogICAgZGVmIENoZWNrRXhlY3V0ZVdyb25nTm9PZkFyZ3MxKHNlbGYpOgogICAgICAgICMgdG9vIG1hbnkgcGFyYW1ldGVycwogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLlByb2dyYW1taW5nRXJyb3IpOgogICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaWQpIHZhbHVlcyAoPykiLCAoMTcsICJFZ29uIikpCgogICAgZGVmIENoZWNrRXhlY3V0ZVdyb25nTm9PZkFyZ3MyKHNlbGYpOgogICAgICAgICMgdG9vIGxpdHRsZSBwYXJhbWV0ZXJzCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcik6CiAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpZCkgdmFsdWVzICg/KSIpCgogICAgZGVmIENoZWNrRXhlY3V0ZVdyb25nTm9PZkFyZ3MzKHNlbGYpOgogICAgICAgICMgbm8gcGFyYW1ldGVycywgcGFyYW1ldGVycyBhcmUgbmVlZGVkCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcik6CiAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpZCkgdmFsdWVzICg/KSIpCgogICAgZGVmIENoZWNrRXhlY3V0ZVBhcmFtTGlzdChzZWxmKToKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IHdoZXJlIG5hbWU9PyIsIFsiZm9vIl0pCiAgICAgICAgcm93ID0gc2VsZi5jdS5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sICJmb28iKQoKICAgIGRlZiBDaGVja0V4ZWN1dGVQYXJhbVNlcXVlbmNlKHNlbGYpOgogICAgICAgIGNsYXNzIEwob2JqZWN0KToKICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgICAgICAgICByZXR1cm4gMQogICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgeCk6CiAgICAgICAgICAgICAgICBhc3NlcnQgeCA9PSAwCiAgICAgICAgICAgICAgICByZXR1cm4gImZvbyIKCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCB3aGVyZSBuYW1lPT8iLCBMKCkpCiAgICAgICAgcm93ID0gc2VsZi5jdS5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sICJmb28iKQoKICAgIGRlZiBDaGVja0V4ZWN1dGVEaWN0TWFwcGluZyhzZWxmKToKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IHdoZXJlIG5hbWU9Om5hbWUiLCB7Im5hbWUiOiAiZm9vIn0pCiAgICAgICAgcm93ID0gc2VsZi5jdS5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sICJmb28iKQoKICAgIGRlZiBDaGVja0V4ZWN1dGVEaWN0TWFwcGluZ19NYXBwaW5nKHNlbGYpOgogICAgICAgIGNsYXNzIEQoZGljdCk6CiAgICAgICAgICAgIGRlZiBfX21pc3NpbmdfXyhzZWxmLCBrZXkpOgogICAgICAgICAgICAgICAgcmV0dXJuICJmb28iCgogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3Qgd2hlcmUgbmFtZT06bmFtZSIsIEQoKSkKICAgICAgICByb3cgPSBzZWxmLmN1LmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgImZvbyIpCgogICAgZGVmIENoZWNrRXhlY3V0ZURpY3RNYXBwaW5nVG9vTGl0dGxlQXJncyhzZWxmKToKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLlByb2dyYW1taW5nRXJyb3IpOgogICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCB3aGVyZSBuYW1lPTpuYW1lIGFuZCBpZD06aWQiLCB7Im5hbWUiOiAiZm9vIn0pCgogICAgZGVmIENoZWNrRXhlY3V0ZURpY3RNYXBwaW5nTm9BcmdzKHNlbGYpOgogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcik6CiAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IHdoZXJlIG5hbWU9Om5hbWUiKQoKICAgIGRlZiBDaGVja0V4ZWN1dGVEaWN0TWFwcGluZ1VubmFtZWQoc2VsZik6CiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yKToKICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3Qgd2hlcmUgbmFtZT0/IiwgeyJuYW1lIjogImZvbyJ9KQoKICAgIGRlZiBDaGVja0Nsb3NlKHNlbGYpOgogICAgICAgIHNlbGYuY3UuY2xvc2UoKQoKICAgIGRlZiBDaGVja1Jvd2NvdW50RXhlY3V0ZShzZWxmKToKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImRlbGV0ZSBmcm9tIHRlc3QiKQogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInVwZGF0ZSB0ZXN0IHNldCBuYW1lPSdiYXInIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3Uucm93Y291bnQsIDIpCgogICAgZGVmIENoZWNrUm93Y291bnRTZWxlY3Qoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgcHlzcWxpdGUgZG9lcyBub3Qga25vdyB0aGUgcm93Y291bnQgb2YgU0VMRUNUIHN0YXRlbWVudHMsIGJlY2F1c2Ugd2UKICAgICAgICBkb24ndCBmZXRjaCBhbGwgcm93cyBhZnRlciBleGVjdXRpbmcgdGhlIHNlbGVjdCBzdGF0ZW1lbnQuIFRoZSByb3djb3VudAogICAgICAgIGhhcyB0aHVzIHRvIGJlIC0xLgogICAgICAgICIiIgogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IDUgdW5pb24gc2VsZWN0IDYiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jdS5yb3djb3VudCwgLTEpCgogICAgZGVmIENoZWNrUm93Y291bnRFeGVjdXRlbWFueShzZWxmKToKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImRlbGV0ZSBmcm9tIHRlc3QiKQogICAgICAgIHNlbGYuY3UuZXhlY3V0ZW1hbnkoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICg/KSIsIFsoMSwpLCAoMiwpLCAoMywpXSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3Uucm93Y291bnQsIDMpCgogICAgZGVmIENoZWNrVG90YWxDaGFuZ2VzKHNlbGYpOgogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKICAgICAgICBzZWxmLmFzc2VydExlc3MoMiwgc2VsZi5jeC50b3RhbF9jaGFuZ2VzLCBtc2c9J3RvdGFsIGNoYW5nZXMgcmVwb3J0ZWQgd3JvbmcgdmFsdWUnKQoKICAgICMgQ2hlY2tzIGZvciBleGVjdXRlbWFueToKICAgICMgU2VxdWVuY2VzIGFyZSByZXF1aXJlZCBieSB0aGUgREItQVBJLCBpdGVyYXRvcnMKICAgICMgZW5oYW5jZW1lbnRzIGluIHB5c3FsaXRlLgoKICAgIGRlZiBDaGVja0V4ZWN1dGVNYW55U2VxdWVuY2Uoc2VsZik6CiAgICAgICAgc2VsZi5jdS5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gdGVzdChpbmNvbWUpIHZhbHVlcyAoPykiLCBbKHgsKSBmb3IgeCBpbiByYW5nZSgxMDAsIDExMCldKQoKICAgIGRlZiBDaGVja0V4ZWN1dGVNYW55SXRlcmF0b3Ioc2VsZik6CiAgICAgICAgY2xhc3MgTXlJdGVyOgogICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgICAgICAgICBzZWxmLnZhbHVlID0gNQoKICAgICAgICAgICAgZGVmIF9fbmV4dF9fKHNlbGYpOgogICAgICAgICAgICAgICAgaWYgc2VsZi52YWx1ZSA9PSAxMDoKICAgICAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYudmFsdWUgKz0gMQogICAgICAgICAgICAgICAgICAgIHJldHVybiAoc2VsZi52YWx1ZSwpCgogICAgICAgIHNlbGYuY3UuZXhlY3V0ZW1hbnkoImluc2VydCBpbnRvIHRlc3QoaW5jb21lKSB2YWx1ZXMgKD8pIiwgTXlJdGVyKCkpCgogICAgZGVmIENoZWNrRXhlY3V0ZU1hbnlHZW5lcmF0b3Ioc2VsZik6CiAgICAgICAgZGVmIG15Z2VuKCk6CiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDUpOgogICAgICAgICAgICAgICAgeWllbGQgKGksKQoKICAgICAgICBzZWxmLmN1LmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byB0ZXN0KGluY29tZSkgdmFsdWVzICg/KSIsIG15Z2VuKCkpCgogICAgZGVmIENoZWNrRXhlY3V0ZU1hbnlXcm9uZ1NxbEFyZyhzZWxmKToKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgogICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGVtYW55KDQyLCBbKDMsKV0pCgogICAgZGVmIENoZWNrRXhlY3V0ZU1hbnlTZWxlY3Qoc2VsZik6CiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcik6CiAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZW1hbnkoInNlbGVjdCA/IiwgWygzLCldKQoKICAgIGRlZiBDaGVja0V4ZWN1dGVNYW55Tm90SXRlcmFibGUoc2VsZik6CiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgogICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byB0ZXN0KGluY29tZSkgdmFsdWVzICg/KSIsIDQyKQoKICAgIGRlZiBDaGVja0ZldGNoSXRlcihzZWxmKToKICAgICAgICAjIE9wdGlvbmFsIERCLUFQSSBleHRlbnNpb24uCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJkZWxldGUgZnJvbSB0ZXN0IikKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaWQpIHZhbHVlcyAoPykiLCAoNSwpKQogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpZCkgdmFsdWVzICg/KSIsICg2LCkpCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgaWQgZnJvbSB0ZXN0IG9yZGVyIGJ5IGlkIikKICAgICAgICBsc3QgPSBbXQogICAgICAgIGZvciByb3cgaW4gc2VsZi5jdToKICAgICAgICAgICAgbHN0LmFwcGVuZChyb3dbMF0pCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsc3RbMF0sIDUpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsc3RbMV0sIDYpCgogICAgZGVmIENoZWNrRmV0Y2hvbmUoc2VsZik6CiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3QiKQogICAgICAgIHJvdyA9IHNlbGYuY3UuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCAiZm9vIikKICAgICAgICByb3cgPSBzZWxmLmN1LmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdywgTm9uZSkKCiAgICBkZWYgQ2hlY2tGZXRjaG9uZU5vU3RhdGVtZW50KHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY3guY3Vyc29yKCkKICAgICAgICByb3cgPSBjdXIuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93LCBOb25lKQoKICAgIGRlZiBDaGVja0FycmF5U2l6ZShzZWxmKToKICAgICAgICAjIG11c3QgZGVmYXVsdCBvdCAxCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1LmFycmF5c2l6ZSwgMSkKCiAgICAgICAgIyBub3cgc2V0IHRvIDIKICAgICAgICBzZWxmLmN1LmFycmF5c2l6ZSA9IDIKCiAgICAgICAgIyBub3cgbWFrZSB0aGUgcXVlcnkgcmV0dXJuIDMgcm93cwogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ0EnKSIpCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ0InKSIpCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ0MnKSIpCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3QiKQogICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2htYW55KCkKCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzKSwgMikKCiAgICBkZWYgQ2hlY2tGZXRjaG1hbnkoc2VsZik6CiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3QiKQogICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2htYW55KDEwMCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXMpLCAxKQogICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2htYW55KDEwMCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgW10pCgogICAgZGVmIENoZWNrRmV0Y2htYW55S3dBcmcoc2VsZik6CiAgICAgICAgIiIiQ2hlY2tzIGlmIGZldGNobWFueSB3b3JrcyB3aXRoIGtleXdvcmQgYXJndW1lbnRzIiIiCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3QiKQogICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2htYW55KHNpemU9MTAwKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcyksIDEpCgogICAgZGVmIENoZWNrRmV0Y2hhbGwoc2VsZik6CiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3QiKQogICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2hhbGwoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcyksIDEpCiAgICAgICAgcmVzID0gc2VsZi5jdS5mZXRjaGFsbCgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIFtdKQoKICAgIGRlZiBDaGVja1NldGlucHV0c2l6ZXMoc2VsZik6CiAgICAgICAgc2VsZi5jdS5zZXRpbnB1dHNpemVzKFszLCA0LCA1XSkKCiAgICBkZWYgQ2hlY2tTZXRvdXRwdXRzaXplKHNlbGYpOgogICAgICAgIHNlbGYuY3Uuc2V0b3V0cHV0c2l6ZSg1LCAwKQoKICAgIGRlZiBDaGVja1NldG91dHB1dHNpemVOb0NvbHVtbihzZWxmKToKICAgICAgICBzZWxmLmN1LnNldG91dHB1dHNpemUoNDIpCgogICAgZGVmIENoZWNrQ3Vyc29yQ29ubmVjdGlvbihzZWxmKToKICAgICAgICAjIE9wdGlvbmFsIERCLUFQSSBleHRlbnNpb24uCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1LmNvbm5lY3Rpb24sIHNlbGYuY3gpCgogICAgZGVmIENoZWNrV3JvbmdDdXJzb3JDYWxsYWJsZShzZWxmKToKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CiAgICAgICAgICAgIGRlZiBmKCk6IHBhc3MKICAgICAgICAgICAgY3VyID0gc2VsZi5jeC5jdXJzb3IoZikKCiAgICBkZWYgQ2hlY2tDdXJzb3JXcm9uZ0NsYXNzKHNlbGYpOgogICAgICAgIGNsYXNzIEZvbzogcGFzcwogICAgICAgIGZvbyA9IEZvbygpCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgogICAgICAgICAgICBjdXIgPSBzcWxpdGUuQ3Vyc29yKGZvbykKCiAgICBkZWYgQ2hlY2tMYXN0Um93SURPblJlcGxhY2Uoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgSU5TRVJUIE9SIFJFUExBQ0UgYW5kIFJFUExBQ0UgSU5UTyBzaG91bGQgcHJvZHVjZSB0aGUgc2FtZSBiZWhhdmlvci4KICAgICAgICAiIiIKICAgICAgICBzcWwgPSAne30gSU5UTyB0ZXN0KGlkLCB1bmlxdWVfdGVzdCkgVkFMVUVTICg/LCA/KScKICAgICAgICBmb3Igc3RhdGVtZW50IGluICgnSU5TRVJUIE9SIFJFUExBQ0UnLCAnUkVQTEFDRScpOgogICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChzdGF0ZW1lbnQ9c3RhdGVtZW50KToKICAgICAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZShzcWwuZm9ybWF0KHN0YXRlbWVudCksICgxLCAnZm9vJykpCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3UubGFzdHJvd2lkLCAxKQoKICAgIGRlZiBDaGVja0xhc3RSb3dJRE9uSWdub3JlKHNlbGYpOgogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgKICAgICAgICAgICAgImluc2VydCBvciBpZ25vcmUgaW50byB0ZXN0KHVuaXF1ZV90ZXN0KSB2YWx1ZXMgKD8pIiwKICAgICAgICAgICAgKCd0ZXN0JywpKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jdS5sYXN0cm93aWQsIDIpCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKAogICAgICAgICAgICAiaW5zZXJ0IG9yIGlnbm9yZSBpbnRvIHRlc3QodW5pcXVlX3Rlc3QpIHZhbHVlcyAoPykiLAogICAgICAgICAgICAoJ3Rlc3QnLCkpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1Lmxhc3Ryb3dpZCwgMikKCiAgICBkZWYgQ2hlY2tMYXN0Um93SURJbnNlcnRPUihzZWxmKToKICAgICAgICByZXN1bHRzID0gW10KICAgICAgICBmb3Igc3RhdGVtZW50IGluICgnRkFJTCcsICdBQk9SVCcsICdST0xMQkFDSycpOgogICAgICAgICAgICBzcWwgPSAnSU5TRVJUIE9SIHt9IElOVE8gdGVzdCh1bmlxdWVfdGVzdCkgVkFMVUVTICg/KScKICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qoc3RhdGVtZW50PSdJTlNFUlQgT1Ige30nLmZvcm1hdChzdGF0ZW1lbnQpKToKICAgICAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZShzcWwuZm9ybWF0KHN0YXRlbWVudCksIChzdGF0ZW1lbnQsKSkKICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKChzdGF0ZW1lbnQsIHNlbGYuY3UubGFzdHJvd2lkKSkKICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLkludGVncml0eUVycm9yKToKICAgICAgICAgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoc3FsLmZvcm1hdChzdGF0ZW1lbnQpLCAoc3RhdGVtZW50LCkpCiAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgoc3RhdGVtZW50LCBzZWxmLmN1Lmxhc3Ryb3dpZCkpCiAgICAgICAgZXhwZWN0ZWQgPSBbCiAgICAgICAgICAgICgnRkFJTCcsIDIpLCAoJ0ZBSUwnLCAyKSwKICAgICAgICAgICAgKCdBQk9SVCcsIDMpLCAoJ0FCT1JUJywgMyksCiAgICAgICAgICAgICgnUk9MTEJBQ0snLCA0KSwgKCdST0xMQkFDSycsIDQpLAogICAgICAgIF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdHMsIGV4cGVjdGVkKQoKCkB1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZGluZywgJ1RoaXMgdGVzdCByZXF1aXJlcyB0aHJlYWRpbmcuJykKY2xhc3MgVGhyZWFkVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBzZWxmLmN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaWQgaW50ZWdlciBwcmltYXJ5IGtleSwgbmFtZSB0ZXh0LCBiaW4gYmluYXJ5LCByYXRpbyBudW1iZXIsIHRzIHRpbWVzdGFtcCkiKQoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBzZWxmLmN1ci5jbG9zZSgpCiAgICAgICAgc2VsZi5jb24uY2xvc2UoKQoKICAgIGRlZiBDaGVja0NvbkN1cnNvcihzZWxmKToKICAgICAgICBkZWYgcnVuKGNvbiwgZXJyb3JzKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY3VyID0gY29uLmN1cnNvcigpCiAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJkaWQgbm90IHJhaXNlIFByb2dyYW1taW5nRXJyb3IiKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uIikKCiAgICAgICAgZXJyb3JzID0gW10KICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9cnVuLCBrd2FyZ3M9eyJjb24iOiBzZWxmLmNvbiwgImVycm9ycyI6IGVycm9yc30pCiAgICAgICAgdC5zdGFydCgpCiAgICAgICAgdC5qb2luKCkKICAgICAgICBpZiBsZW4oZXJyb3JzKSA+IDA6CiAgICAgICAgICAgIHNlbGYuZmFpbCgiXG4iLmpvaW4oZXJyb3JzKSkKCiAgICBkZWYgQ2hlY2tDb25Db21taXQoc2VsZik6CiAgICAgICAgZGVmIHJ1bihjb24sIGVycm9ycyk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGNvbi5jb21taXQoKQogICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiZGlkIG5vdCByYWlzZSBQcm9ncmFtbWluZ0Vycm9yIikKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbiIpCgogICAgICAgIGVycm9ycyA9IFtdCiAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJ1biwga3dhcmdzPXsiY29uIjogc2VsZi5jb24sICJlcnJvcnMiOiBlcnJvcnN9KQogICAgICAgIHQuc3RhcnQoKQogICAgICAgIHQuam9pbigpCiAgICAgICAgaWYgbGVuKGVycm9ycykgPiAwOgogICAgICAgICAgICBzZWxmLmZhaWwoIlxuIi5qb2luKGVycm9ycykpCgogICAgZGVmIENoZWNrQ29uUm9sbGJhY2soc2VsZik6CiAgICAgICAgZGVmIHJ1bihjb24sIGVycm9ycyk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGNvbi5yb2xsYmFjaygpCiAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJkaWQgbm90IHJhaXNlIFByb2dyYW1taW5nRXJyb3IiKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uIikKCiAgICAgICAgZXJyb3JzID0gW10KICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9cnVuLCBrd2FyZ3M9eyJjb24iOiBzZWxmLmNvbiwgImVycm9ycyI6IGVycm9yc30pCiAgICAgICAgdC5zdGFydCgpCiAgICAgICAgdC5qb2luKCkKICAgICAgICBpZiBsZW4oZXJyb3JzKSA+IDA6CiAgICAgICAgICAgIHNlbGYuZmFpbCgiXG4iLmpvaW4oZXJyb3JzKSkKCiAgICBkZWYgQ2hlY2tDb25DbG9zZShzZWxmKToKICAgICAgICBkZWYgcnVuKGNvbiwgZXJyb3JzKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY29uLmNsb3NlKCkKICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoImRpZCBub3QgcmFpc2UgUHJvZ3JhbW1pbmdFcnJvciIpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoInJhaXNlZCB3cm9uZyBleGNlcHRpb24iKQoKICAgICAgICBlcnJvcnMgPSBbXQogICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW4sIGt3YXJncz17ImNvbiI6IHNlbGYuY29uLCAiZXJyb3JzIjogZXJyb3JzfSkKICAgICAgICB0LnN0YXJ0KCkKICAgICAgICB0LmpvaW4oKQogICAgICAgIGlmIGxlbihlcnJvcnMpID4gMDoKICAgICAgICAgICAgc2VsZi5mYWlsKCJcbiIuam9pbihlcnJvcnMpKQoKICAgIGRlZiBDaGVja0N1ckltcGxpY2l0QmVnaW4oc2VsZik6CiAgICAgICAgZGVmIHJ1bihjdXIsIGVycm9ycyk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2EnKSIpCiAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJkaWQgbm90IHJhaXNlIFByb2dyYW1taW5nRXJyb3IiKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uIikKCiAgICAgICAgZXJyb3JzID0gW10KICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9cnVuLCBrd2FyZ3M9eyJjdXIiOiBzZWxmLmN1ciwgImVycm9ycyI6IGVycm9yc30pCiAgICAgICAgdC5zdGFydCgpCiAgICAgICAgdC5qb2luKCkKICAgICAgICBpZiBsZW4oZXJyb3JzKSA+IDA6CiAgICAgICAgICAgIHNlbGYuZmFpbCgiXG4iLmpvaW4oZXJyb3JzKSkKCiAgICBkZWYgQ2hlY2tDdXJDbG9zZShzZWxmKToKICAgICAgICBkZWYgcnVuKGN1ciwgZXJyb3JzKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY3VyLmNsb3NlKCkKICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoImRpZCBub3QgcmFpc2UgUHJvZ3JhbW1pbmdFcnJvciIpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoInJhaXNlZCB3cm9uZyBleGNlcHRpb24iKQoKICAgICAgICBlcnJvcnMgPSBbXQogICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW4sIGt3YXJncz17ImN1ciI6IHNlbGYuY3VyLCAiZXJyb3JzIjogZXJyb3JzfSkKICAgICAgICB0LnN0YXJ0KCkKICAgICAgICB0LmpvaW4oKQogICAgICAgIGlmIGxlbihlcnJvcnMpID4gMDoKICAgICAgICAgICAgc2VsZi5mYWlsKCJcbiIuam9pbihlcnJvcnMpKQoKICAgIGRlZiBDaGVja0N1ckV4ZWN1dGUoc2VsZik6CiAgICAgICAgZGVmIHJ1bihjdXIsIGVycm9ycyk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3QiKQogICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiZGlkIG5vdCByYWlzZSBQcm9ncmFtbWluZ0Vycm9yIikKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbiIpCgogICAgICAgIGVycm9ycyA9IFtdCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdhJykiKQogICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW4sIGt3YXJncz17ImN1ciI6IHNlbGYuY3VyLCAiZXJyb3JzIjogZXJyb3JzfSkKICAgICAgICB0LnN0YXJ0KCkKICAgICAgICB0LmpvaW4oKQogICAgICAgIGlmIGxlbihlcnJvcnMpID4gMDoKICAgICAgICAgICAgc2VsZi5mYWlsKCJcbiIuam9pbihlcnJvcnMpKQoKICAgIGRlZiBDaGVja0N1ckl0ZXJOZXh0KHNlbGYpOgogICAgICAgIGRlZiBydW4oY3VyLCBlcnJvcnMpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByb3cgPSBjdXIuZmV0Y2hvbmUoKQogICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiZGlkIG5vdCByYWlzZSBQcm9ncmFtbWluZ0Vycm9yIikKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbiIpCgogICAgICAgIGVycm9ycyA9IFtdCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdhJykiKQogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCiAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJ1biwga3dhcmdzPXsiY3VyIjogc2VsZi5jdXIsICJlcnJvcnMiOiBlcnJvcnN9KQogICAgICAgIHQuc3RhcnQoKQogICAgICAgIHQuam9pbigpCiAgICAgICAgaWYgbGVuKGVycm9ycykgPiAwOgogICAgICAgICAgICBzZWxmLmZhaWwoIlxuIi5qb2luKGVycm9ycykpCgpjbGFzcyBDb25zdHJ1Y3RvclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBDaGVja0RhdGUoc2VsZik6CiAgICAgICAgZCA9IHNxbGl0ZS5EYXRlKDIwMDQsIDEwLCAyOCkKCiAgICBkZWYgQ2hlY2tUaW1lKHNlbGYpOgogICAgICAgIHQgPSBzcWxpdGUuVGltZSgxMiwgMzksIDM1KQoKICAgIGRlZiBDaGVja1RpbWVzdGFtcChzZWxmKToKICAgICAgICB0cyA9IHNxbGl0ZS5UaW1lc3RhbXAoMjAwNCwgMTAsIDI4LCAxMiwgMzksIDM1KQoKICAgIGRlZiBDaGVja0RhdGVGcm9tVGlja3Moc2VsZik6CiAgICAgICAgZCA9IHNxbGl0ZS5EYXRlRnJvbVRpY2tzKDQyKQoKICAgIGRlZiBDaGVja1RpbWVGcm9tVGlja3Moc2VsZik6CiAgICAgICAgdCA9IHNxbGl0ZS5UaW1lRnJvbVRpY2tzKDQyKQoKICAgIGRlZiBDaGVja1RpbWVzdGFtcEZyb21UaWNrcyhzZWxmKToKICAgICAgICB0cyA9IHNxbGl0ZS5UaW1lc3RhbXBGcm9tVGlja3MoNDIpCgogICAgZGVmIENoZWNrQmluYXJ5KHNlbGYpOgogICAgICAgIGIgPSBzcWxpdGUuQmluYXJ5KGIiXDAnIikKCmNsYXNzIEV4dGVuc2lvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBDaGVja1NjcmlwdFN0cmluZ1NxbChzZWxmKToKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIGN1ciA9IGNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlc2NyaXB0KCIiIgogICAgICAgICAgICAtLSBibGEgYmxhCiAgICAgICAgICAgIC8qIGEgc3R1cGlkIGNvbW1lbnQgKi8KICAgICAgICAgICAgY3JlYXRlIHRhYmxlIGEoaSk7CiAgICAgICAgICAgIGluc2VydCBpbnRvIGEoaSkgdmFsdWVzICg1KTsKICAgICAgICAgICAgIiIiKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIGEiKQogICAgICAgIHJlcyA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIDUpCgogICAgZGVmIENoZWNrU2NyaXB0U3ludGF4RXJyb3Ioc2VsZik6CiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yKToKICAgICAgICAgICAgY3VyLmV4ZWN1dGVzY3JpcHQoImNyZWF0ZSB0YWJsZSB0ZXN0KHgpOyBhc2RmOyBjcmVhdGUgdGFibGUgdGVzdDIoeCkiKQoKICAgIGRlZiBDaGVja1NjcmlwdEVycm9yTm9ybWFsKHNlbGYpOgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgY3VyID0gY29uLmN1cnNvcigpCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcik6CiAgICAgICAgICAgIGN1ci5leGVjdXRlc2NyaXB0KCJjcmVhdGUgdGFibGUgdGVzdChzYWRmc2FkZmRzYSk7IHNlbGVjdCBmb28gZnJvbSBodXJ6OyIpCgogICAgZGVmIENoZWNrQ3Vyc29yRXhlY3V0ZXNjcmlwdEFzQnl0ZXMoc2VsZik6CiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpIGFzIGNtOgogICAgICAgICAgICBjdXIuZXhlY3V0ZXNjcmlwdChiImNyZWF0ZSB0YWJsZSB0ZXN0KGZvbyk7IGluc2VydCBpbnRvIHRlc3QoZm9vKSB2YWx1ZXMgKDUpOyIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY20uZXhjZXB0aW9uKSwgJ3NjcmlwdCBhcmd1bWVudCBtdXN0IGJlIHVuaWNvZGUuJykKCiAgICBkZWYgQ2hlY2tDb25uZWN0aW9uRXhlY3V0ZShzZWxmKToKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIHJlc3VsdCA9IGNvbi5leGVjdXRlKCJzZWxlY3QgNSIpLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgNSwgIkJhc2ljIHRlc3Qgb2YgQ29ubmVjdGlvbi5leGVjdXRlIikKCiAgICBkZWYgQ2hlY2tDb25uZWN0aW9uRXhlY3V0ZW1hbnkoc2VsZik6CiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoZm9vKSIpCiAgICAgICAgY29uLmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byB0ZXN0KGZvbykgdmFsdWVzICg/KSIsIFsoMywpLCAoNCwpXSkKICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZSgic2VsZWN0IGZvbyBmcm9tIHRlc3Qgb3JkZXIgYnkgZm9vIikuZmV0Y2hhbGwoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0WzBdWzBdLCAzLCAiQmFzaWMgdGVzdCBvZiBDb25uZWN0aW9uLmV4ZWN1dGVtYW55IikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdFsxXVswXSwgNCwgIkJhc2ljIHRlc3Qgb2YgQ29ubmVjdGlvbi5leGVjdXRlbWFueSIpCgogICAgZGVmIENoZWNrQ29ubmVjdGlvbkV4ZWN1dGVzY3JpcHQoc2VsZik6CiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjb24uZXhlY3V0ZXNjcmlwdCgiY3JlYXRlIHRhYmxlIHRlc3QoZm9vKTsgaW5zZXJ0IGludG8gdGVzdChmb28pIHZhbHVlcyAoNSk7IikKICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZSgic2VsZWN0IGZvbyBmcm9tIHRlc3QiKS5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIDUsICJCYXNpYyB0ZXN0IG9mIENvbm5lY3Rpb24uZXhlY3V0ZXNjcmlwdCIpCgpjbGFzcyBDbG9zZWRDb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgQ2hlY2tDbG9zZWRDb25DdXJzb3Ioc2VsZik6CiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjb24uY2xvc2UoKQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLlByb2dyYW1taW5nRXJyb3IpOgogICAgICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKCiAgICBkZWYgQ2hlY2tDbG9zZWRDb25Db21taXQoc2VsZik6CiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjb24uY2xvc2UoKQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLlByb2dyYW1taW5nRXJyb3IpOgogICAgICAgICAgICBjb24uY29tbWl0KCkKCiAgICBkZWYgQ2hlY2tDbG9zZWRDb25Sb2xsYmFjayhzZWxmKToKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIGNvbi5jbG9zZSgpCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcik6CiAgICAgICAgICAgIGNvbi5yb2xsYmFjaygpCgogICAgZGVmIENoZWNrQ2xvc2VkQ3VyRXhlY3V0ZShzZWxmKToKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIGN1ciA9IGNvbi5jdXJzb3IoKQogICAgICAgIGNvbi5jbG9zZSgpCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcik6CiAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgNCIpCgogICAgZGVmIENoZWNrQ2xvc2VkQ3JlYXRlRnVuY3Rpb24oc2VsZik6CiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjb24uY2xvc2UoKQogICAgICAgIGRlZiBmKHgpOiByZXR1cm4gMTcKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yKToKICAgICAgICAgICAgY29uLmNyZWF0ZV9mdW5jdGlvbigiZm9vIiwgMSwgZikKCiAgICBkZWYgQ2hlY2tDbG9zZWRDcmVhdGVBZ2dyZWdhdGUoc2VsZik6CiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjb24uY2xvc2UoKQogICAgICAgIGNsYXNzIEFnZzoKICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBkZWYgc3RlcChzZWxmLCB4KToKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgZGVmIGZpbmFsaXplKHNlbGYpOgogICAgICAgICAgICAgICAgcmV0dXJuIDE3CiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcik6CiAgICAgICAgICAgIGNvbi5jcmVhdGVfYWdncmVnYXRlKCJmb28iLCAxLCBBZ2cpCgogICAgZGVmIENoZWNrQ2xvc2VkU2V0QXV0aG9yaXplcihzZWxmKToKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIGNvbi5jbG9zZSgpCiAgICAgICAgZGVmIGF1dGhvcml6ZXIoKmFyZ3MpOgogICAgICAgICAgICByZXR1cm4gc3FsaXRlLkRFTlkKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yKToKICAgICAgICAgICAgY29uLnNldF9hdXRob3JpemVyKGF1dGhvcml6ZXIpCgogICAgZGVmIENoZWNrQ2xvc2VkU2V0UHJvZ3Jlc3NDYWxsYmFjayhzZWxmKToKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIGNvbi5jbG9zZSgpCiAgICAgICAgZGVmIHByb2dyZXNzKCk6IHBhc3MKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yKToKICAgICAgICAgICAgY29uLnNldF9wcm9ncmVzc19oYW5kbGVyKHByb2dyZXNzLCAxMDApCgogICAgZGVmIENoZWNrQ2xvc2VkQ2FsbChzZWxmKToKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIGNvbi5jbG9zZSgpCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcik6CiAgICAgICAgICAgIGNvbigpCgpjbGFzcyBDbG9zZWRDdXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgQ2hlY2tDbG9zZWQoc2VsZik6CiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKICAgICAgICBjdXIuY2xvc2UoKQoKICAgICAgICBmb3IgbWV0aG9kX25hbWUgaW4gKCJleGVjdXRlIiwgImV4ZWN1dGVtYW55IiwgImV4ZWN1dGVzY3JpcHQiLCAiZmV0Y2hhbGwiLCAiZmV0Y2htYW55IiwgImZldGNob25lIik6CiAgICAgICAgICAgIGlmIG1ldGhvZF9uYW1lIGluICgiZXhlY3V0ZSIsICJleGVjdXRlc2NyaXB0Iik6CiAgICAgICAgICAgICAgICBwYXJhbXMgPSAoInNlbGVjdCA0IHVuaW9uIHNlbGVjdCA1IiwpCiAgICAgICAgICAgIGVsaWYgbWV0aG9kX25hbWUgPT0gImV4ZWN1dGVtYW55IjoKICAgICAgICAgICAgICAgIHBhcmFtcyA9ICgiaW5zZXJ0IGludG8gZm9vKGJhcikgdmFsdWVzICg/KSIsIFsoMywpLCAoNCwpXSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhcmFtcyA9IFtdCgogICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yKToKICAgICAgICAgICAgICAgIG1ldGhvZCA9IGdldGF0dHIoY3VyLCBtZXRob2RfbmFtZSkKICAgICAgICAgICAgICAgIG1ldGhvZCgqcGFyYW1zKQoKCmNsYXNzIFNxbGl0ZU9uQ29uZmxpY3RUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAiIiIKICAgIFRlc3RzIGZvciBTUUxpdGUncyAiaW5zZXJ0IG9uIGNvbmZsaWN0IiBmZWF0dXJlLgoKICAgIFNlZSBodHRwczovL3d3dy5zcWxpdGUub3JnL2xhbmdfY29uZmxpY3QuaHRtbCBmb3IgZGV0YWlscy4KICAgICIiIgoKICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICBzZWxmLmN4ID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBzZWxmLmN1ID0gc2VsZi5jeC5jdXJzb3IoKQogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiIiIKICAgICAgICAgIENSRUFURSBUQUJMRSB0ZXN0KAogICAgICAgICAgICBpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBuYW1lIFRFWFQsIHVuaXF1ZV9uYW1lIFRFWFQgVU5JUVVFCiAgICAgICAgICApOwogICAgICAgICIiIikKCiAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgc2VsZi5jdS5jbG9zZSgpCiAgICAgICAgc2VsZi5jeC5jbG9zZSgpCgogICAgZGVmIENoZWNrT25Db25mbGljdFJvbGxiYWNrV2l0aEV4cGxpY2l0VHJhbnNhY3Rpb24oc2VsZik6CiAgICAgICAgc2VsZi5jeC5pc29sYXRpb25fbGV2ZWwgPSBOb25lICAjIGF1dG9jb21taXQgbW9kZQogICAgICAgIHNlbGYuY3UgPSBzZWxmLmN4LmN1cnNvcigpCiAgICAgICAgIyBTdGFydCBhbiBleHBsaWNpdCB0cmFuc2FjdGlvbi4KICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoIkJFR0lOIikKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoIklOU0VSVCBJTlRPIHRlc3QobmFtZSkgVkFMVUVTICgnYWJvcnRfdGVzdCcpIikKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoIklOU0VSVCBPUiBST0xMQkFDSyBJTlRPIHRlc3QodW5pcXVlX25hbWUpIFZBTFVFUyAoJ2ZvbycpIikKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5JbnRlZ3JpdHlFcnJvcik6CiAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiSU5TRVJUIE9SIFJPTExCQUNLIElOVE8gdGVzdCh1bmlxdWVfbmFtZSkgVkFMVUVTICgnZm9vJykiKQogICAgICAgICMgVXNlIGNvbm5lY3Rpb24gdG8gY29tbWl0LgogICAgICAgIHNlbGYuY3guY29tbWl0KCkKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoIlNFTEVDVCBuYW1lLCB1bmlxdWVfbmFtZSBmcm9tIHRlc3QiKQogICAgICAgICMgVHJhbnNhY3Rpb24gc2hvdWxkIGhhdmUgcm9sbGVkIGJhY2sgYW5kIG5vdGhpbmcgc2hvdWxkIGJlIGluIHRhYmxlLgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jdS5mZXRjaGFsbCgpLCBbXSkKCiAgICBkZWYgQ2hlY2tPbkNvbmZsaWN0QWJvcnRSYWlzZXNXaXRoRXhwbGljaXRUcmFuc2FjdGlvbnMoc2VsZik6CiAgICAgICAgIyBBYm9ydCBjYW5jZWxzIHRoZSBjdXJyZW50IHNxbCBzdGF0ZW1lbnQgYnV0IGRvZXNuJ3QgY2hhbmdlIGFueXRoaW5nCiAgICAgICAgIyBhYm91dCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4KICAgICAgICBzZWxmLmN4Lmlzb2xhdGlvbl9sZXZlbCA9IE5vbmUgICMgYXV0b2NvbW1pdCBtb2RlCiAgICAgICAgc2VsZi5jdSA9IHNlbGYuY3guY3Vyc29yKCkKICAgICAgICAjIFN0YXJ0IGFuIGV4cGxpY2l0IHRyYW5zYWN0aW9uLgogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiQkVHSU4iKQogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiSU5TRVJUIElOVE8gdGVzdChuYW1lKSBWQUxVRVMgKCdhYm9ydF90ZXN0JykiKQogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiSU5TRVJUIE9SIEFCT1JUIElOVE8gdGVzdCh1bmlxdWVfbmFtZSkgVkFMVUVTICgnZm9vJykiKQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLkludGVncml0eUVycm9yKToKICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJJTlNFUlQgT1IgQUJPUlQgSU5UTyB0ZXN0KHVuaXF1ZV9uYW1lKSBWQUxVRVMgKCdmb28nKSIpCiAgICAgICAgc2VsZi5jeC5jb21taXQoKQogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiU0VMRUNUIG5hbWUsIHVuaXF1ZV9uYW1lIEZST00gdGVzdCIpCiAgICAgICAgIyBFeHBlY3QgdGhlIGZpcnN0IHR3byBpbnNlcnRzIHRvIHdvcmssIHRoaXJkIHRvIGRvIG5vdGhpbmcuCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1LmZldGNoYWxsKCksIFsoJ2Fib3J0X3Rlc3QnLCBOb25lKSwgKE5vbmUsICdmb28nLCldKQoKICAgIGRlZiBDaGVja09uQ29uZmxpY3RSb2xsYmFja1dpdGhvdXRUcmFuc2FjdGlvbihzZWxmKToKICAgICAgICAjIFN0YXJ0IG9mIGltcGxpY2l0IHRyYW5zYWN0aW9uCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJJTlNFUlQgSU5UTyB0ZXN0KG5hbWUpIFZBTFVFUyAoJ2Fib3J0X3Rlc3QnKSIpCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJJTlNFUlQgT1IgUk9MTEJBQ0sgSU5UTyB0ZXN0KHVuaXF1ZV9uYW1lKSBWQUxVRVMgKCdmb28nKSIpCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuSW50ZWdyaXR5RXJyb3IpOgogICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoIklOU0VSVCBPUiBST0xMQkFDSyBJTlRPIHRlc3QodW5pcXVlX25hbWUpIFZBTFVFUyAoJ2ZvbycpIikKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoIlNFTEVDVCBuYW1lLCB1bmlxdWVfbmFtZSBGUk9NIHRlc3QiKQogICAgICAgICMgSW1wbGljaXQgdHJhbnNhY3Rpb24gaXMgcm9sbGVkIGJhY2sgb24gZXJyb3IuCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1LmZldGNoYWxsKCksIFtdKQoKICAgIGRlZiBDaGVja09uQ29uZmxpY3RBYm9ydFJhaXNlc1dpdGhvdXRUcmFuc2FjdGlvbnMoc2VsZik6CiAgICAgICAgIyBBYm9ydCBjYW5jZWxzIHRoZSBjdXJyZW50IHNxbCBzdGF0ZW1lbnQgYnV0IGRvZXNuJ3QgY2hhbmdlIGFueXRoaW5nCiAgICAgICAgIyBhYm91dCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4KICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoIklOU0VSVCBJTlRPIHRlc3QobmFtZSkgVkFMVUVTICgnYWJvcnRfdGVzdCcpIikKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoIklOU0VSVCBPUiBBQk9SVCBJTlRPIHRlc3QodW5pcXVlX25hbWUpIFZBTFVFUyAoJ2ZvbycpIikKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5JbnRlZ3JpdHlFcnJvcik6CiAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiSU5TRVJUIE9SIEFCT1JUIElOVE8gdGVzdCh1bmlxdWVfbmFtZSkgVkFMVUVTICgnZm9vJykiKQogICAgICAgICMgTWFrZSBzdXJlIGFsbCBvdGhlciB2YWx1ZXMgd2VyZSBpbnNlcnRlZC4KICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoIlNFTEVDVCBuYW1lLCB1bmlxdWVfbmFtZSBGUk9NIHRlc3QiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jdS5mZXRjaGFsbCgpLCBbKCdhYm9ydF90ZXN0JywgTm9uZSksIChOb25lLCAnZm9vJywpXSkKCiAgICBkZWYgQ2hlY2tPbkNvbmZsaWN0RmFpbChzZWxmKToKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoIklOU0VSVCBPUiBGQUlMIElOVE8gdGVzdCh1bmlxdWVfbmFtZSkgVkFMVUVTICgnZm9vJykiKQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLkludGVncml0eUVycm9yKToKICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJJTlNFUlQgT1IgRkFJTCBJTlRPIHRlc3QodW5pcXVlX25hbWUpIFZBTFVFUyAoJ2ZvbycpIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3UuZmV0Y2hhbGwoKSwgW10pCgogICAgZGVmIENoZWNrT25Db25mbGljdElnbm9yZShzZWxmKToKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoIklOU0VSVCBPUiBJR05PUkUgSU5UTyB0ZXN0KHVuaXF1ZV9uYW1lKSBWQUxVRVMgKCdmb28nKSIpCiAgICAgICAgIyBOb3RoaW5nIHNob3VsZCBoYXBwZW4uCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJJTlNFUlQgT1IgSUdOT1JFIElOVE8gdGVzdCh1bmlxdWVfbmFtZSkgVkFMVUVTICgnZm9vJykiKQogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiU0VMRUNUIHVuaXF1ZV9uYW1lIEZST00gdGVzdCIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1LmZldGNoYWxsKCksIFsoJ2ZvbycsKV0pCgogICAgZGVmIENoZWNrT25Db25mbGljdFJlcGxhY2Uoc2VsZik6CiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJJTlNFUlQgT1IgUkVQTEFDRSBJTlRPIHRlc3QobmFtZSwgdW5pcXVlX25hbWUpIFZBTFVFUyAoJ0RhdGEhJywgJ2ZvbycpIikKICAgICAgICAjIFRoZXJlIHNob3VsZG4ndCBiZSBhbiBJbnRlZ3JpdHlFcnJvciBleGNlcHRpb24uCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJJTlNFUlQgT1IgUkVQTEFDRSBJTlRPIHRlc3QobmFtZSwgdW5pcXVlX25hbWUpIFZBTFVFUyAoJ1ZlcnkgZGlmZmVyZW50IGRhdGEhJywgJ2ZvbycpIikKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoIlNFTEVDVCBuYW1lLCB1bmlxdWVfbmFtZSBGUk9NIHRlc3QiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jdS5mZXRjaGFsbCgpLCBbKCdWZXJ5IGRpZmZlcmVudCBkYXRhIScsICdmb28nKV0pCgoKZGVmIHN1aXRlKCk6CiAgICBtb2R1bGVfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoTW9kdWxlVGVzdHMsICJDaGVjayIpCiAgICBjb25uZWN0aW9uX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKENvbm5lY3Rpb25UZXN0cywgIkNoZWNrIikKICAgIGN1cnNvcl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDdXJzb3JUZXN0cywgIkNoZWNrIikKICAgIHRocmVhZF9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShUaHJlYWRUZXN0cywgIkNoZWNrIikKICAgIGNvbnN0cnVjdG9yX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKENvbnN0cnVjdG9yVGVzdHMsICJDaGVjayIpCiAgICBleHRfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoRXh0ZW5zaW9uVGVzdHMsICJDaGVjayIpCiAgICBjbG9zZWRfY29uX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKENsb3NlZENvblRlc3RzLCAiQ2hlY2siKQogICAgY2xvc2VkX2N1cl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDbG9zZWRDdXJUZXN0cywgIkNoZWNrIikKICAgIG9uX2NvbmZsaWN0X3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFNxbGl0ZU9uQ29uZmxpY3RUZXN0cywgIkNoZWNrIikKICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKAogICAgICAgIG1vZHVsZV9zdWl0ZSwgY29ubmVjdGlvbl9zdWl0ZSwgY3Vyc29yX3N1aXRlLCB0aHJlYWRfc3VpdGUsCiAgICAgICAgY29uc3RydWN0b3Jfc3VpdGUsIGV4dF9zdWl0ZSwgY2xvc2VkX2Nvbl9zdWl0ZSwgY2xvc2VkX2N1cl9zdWl0ZSwKICAgICAgICBvbl9jb25mbGljdF9zdWl0ZSwKICAgICkpCgpkZWYgdGVzdCgpOgogICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQogICAgcnVubmVyLnJ1bihzdWl0ZSgpKQoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIHRlc3QoKQo=