Iy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCiMgcHlzcWxpdGUyL3Rlc3QvZGJhcGkucHk6IHRlc3RzIGZvciBEQi1BUEkgY29tcGxpYW5jZQojCiMgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgojCiMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiMKIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAojIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgojCiMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAojIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKIwojIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CiMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgojIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCiMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgojIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCgppbXBvcnQgdW5pdHRlc3QKaW1wb3J0IHRocmVhZGluZwppbXBvcnQgc3FsaXRlMyBhcyBzcWxpdGUKCmNsYXNzIE1vZHVsZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBDaGVja0FQSUxldmVsKHNlbGYpOgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3FsaXRlLmFwaWxldmVsLCAiMi4wIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJhcGlsZXZlbCBpcyAlcywgc2hvdWxkIGJlIDIuMCIgJSBzcWxpdGUuYXBpbGV2ZWwpCgogICAgZGVmIENoZWNrVGhyZWFkU2FmZXR5KHNlbGYpOgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3FsaXRlLnRocmVhZHNhZmV0eSwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRzYWZldHkgaXMgJWQsIHNob3VsZCBiZSAxIiAlIHNxbGl0ZS50aHJlYWRzYWZldHkpCgogICAgZGVmIENoZWNrUGFyYW1TdHlsZShzZWxmKToKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNxbGl0ZS5wYXJhbXN0eWxlLCAicW1hcmsiLAogICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtc3R5bGUgaXMgJyVzJywgc2hvdWxkIGJlICdxbWFyayciICUKICAgICAgICAgICAgICAgICAgICAgICAgIHNxbGl0ZS5wYXJhbXN0eWxlKQoKICAgIGRlZiBDaGVja1dhcm5pbmcoc2VsZik6CiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc3FsaXRlLldhcm5pbmcsIEV4Y2VwdGlvbiksCiAgICAgICAgICAgICAgICAgICAgICJXYXJuaW5nIGlzIG5vdCBhIHN1YmNsYXNzIG9mIEV4Y2VwdGlvbiIpCgogICAgZGVmIENoZWNrRXJyb3Ioc2VsZik6CiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc3FsaXRlLkVycm9yLCBFeGNlcHRpb24pLAogICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRXhjZXB0aW9uIikKCiAgICBkZWYgQ2hlY2tJbnRlcmZhY2VFcnJvcihzZWxmKToKICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuSW50ZXJmYWNlRXJyb3IsIHNxbGl0ZS5FcnJvciksCiAgICAgICAgICAgICAgICAgICAgICAgICJJbnRlcmZhY2VFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBFcnJvciIpCgogICAgZGVmIENoZWNrRGF0YWJhc2VFcnJvcihzZWxmKToKICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuRGF0YWJhc2VFcnJvciwgc3FsaXRlLkVycm9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGFiYXNlRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRXJyb3IiKQoKICAgIGRlZiBDaGVja0RhdGFFcnJvcihzZWxmKToKICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuRGF0YUVycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvciksCiAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCgogICAgZGVmIENoZWNrT3BlcmF0aW9uYWxFcnJvcihzZWxmKToKICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciwgc3FsaXRlLkRhdGFiYXNlRXJyb3IpLAogICAgICAgICAgICAgICAgICAgICAgICAiT3BlcmF0aW9uYWxFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBEYXRhYmFzZUVycm9yIikKCiAgICBkZWYgQ2hlY2tJbnRlZ3JpdHlFcnJvcihzZWxmKToKICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuSW50ZWdyaXR5RXJyb3IsIHNxbGl0ZS5EYXRhYmFzZUVycm9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgIkludGVncml0eUVycm9yIGlzIG5vdCBhIHN1YmNsYXNzIG9mIERhdGFiYXNlRXJyb3IiKQoKICAgIGRlZiBDaGVja0ludGVybmFsRXJyb3Ioc2VsZik6CiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc3FsaXRlLkludGVybmFsRXJyb3IsIHNxbGl0ZS5EYXRhYmFzZUVycm9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgIkludGVybmFsRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCgogICAgZGVmIENoZWNrUHJvZ3JhbW1pbmdFcnJvcihzZWxmKToKICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvciwgc3FsaXRlLkRhdGFiYXNlRXJyb3IpLAogICAgICAgICAgICAgICAgICAgICAgICAiUHJvZ3JhbW1pbmdFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBEYXRhYmFzZUVycm9yIikKCiAgICBkZWYgQ2hlY2tOb3RTdXBwb3J0ZWRFcnJvcihzZWxmKToKICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuTm90U3VwcG9ydGVkRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FsaXRlLkRhdGFiYXNlRXJyb3IpLAogICAgICAgICAgICAgICAgICAgICAgICAiTm90U3VwcG9ydGVkRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCgpjbGFzcyBDb25uZWN0aW9uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgIHNlbGYuY3ggPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIGN1ID0gc2VsZi5jeC5jdXJzb3IoKQogICAgICAgIGN1LmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGlkIGludGVnZXIgcHJpbWFyeSBrZXksIG5hbWUgdGV4dCkiKQogICAgICAgIGN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICg/KSIsICgiZm9vIiwpKQoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBzZWxmLmN4LmNsb3NlKCkKCiAgICBkZWYgQ2hlY2tDb21taXQoc2VsZik6CiAgICAgICAgc2VsZi5jeC5jb21taXQoKQoKICAgIGRlZiBDaGVja0NvbW1pdEFmdGVyTm9DaGFuZ2VzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEEgY29tbWl0IHNob3VsZCBhbHNvIHdvcmsgd2hlbiBubyBjaGFuZ2VzIHdlcmUgbWFkZSB0byB0aGUgZGF0YWJhc2UuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5jeC5jb21taXQoKQogICAgICAgIHNlbGYuY3guY29tbWl0KCkKCiAgICBkZWYgQ2hlY2tSb2xsYmFjayhzZWxmKToKICAgICAgICBzZWxmLmN4LnJvbGxiYWNrKCkKCiAgICBkZWYgQ2hlY2tSb2xsYmFja0FmdGVyTm9DaGFuZ2VzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEEgcm9sbGJhY2sgc2hvdWxkIGFsc28gd29yayB3aGVuIG5vIGNoYW5nZXMgd2VyZSBtYWRlIHRvIHRoZSBkYXRhYmFzZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmN4LnJvbGxiYWNrKCkKICAgICAgICBzZWxmLmN4LnJvbGxiYWNrKCkKCiAgICBkZWYgQ2hlY2tDdXJzb3Ioc2VsZik6CiAgICAgICAgY3UgPSBzZWxmLmN4LmN1cnNvcigpCgogICAgZGVmIENoZWNrRmFpbGVkT3BlbihzZWxmKToKICAgICAgICBZT1VfQ0FOTk9UX09QRU5fVEhJUyA9ICIvZm9vL2Jhci9ibGEvMjM1MzQvbXlkYi5kYiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KFlPVV9DQU5OT1RfT1BFTl9USElTKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcjoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCgogICAgZGVmIENoZWNrQ2xvc2Uoc2VsZik6CiAgICAgICAgc2VsZi5jeC5jbG9zZSgpCgogICAgZGVmIENoZWNrRXhjZXB0aW9ucyhzZWxmKToKICAgICAgICAjIE9wdGlvbmFsIERCLUFQSSBleHRlbnNpb24uCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN4Lldhcm5pbmcsIHNxbGl0ZS5XYXJuaW5nKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5FcnJvciwgc3FsaXRlLkVycm9yKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5JbnRlcmZhY2VFcnJvciwgc3FsaXRlLkludGVyZmFjZUVycm9yKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5EYXRhYmFzZUVycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvcikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3guRGF0YUVycm9yLCBzcWxpdGUuRGF0YUVycm9yKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5PcGVyYXRpb25hbEVycm9yLCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3guSW50ZWdyaXR5RXJyb3IsIHNxbGl0ZS5JbnRlZ3JpdHlFcnJvcikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3guSW50ZXJuYWxFcnJvciwgc3FsaXRlLkludGVybmFsRXJyb3IpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN4LlByb2dyYW1taW5nRXJyb3IsIHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5Ob3RTdXBwb3J0ZWRFcnJvciwgc3FsaXRlLk5vdFN1cHBvcnRlZEVycm9yKQoKY2xhc3MgQ3Vyc29yVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgIHNlbGYuY3ggPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIHNlbGYuY3UgPSBzZWxmLmN4LmN1cnNvcigpCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpZCBpbnRlZ2VyIHByaW1hcnkga2V5LCBuYW1lIHRleHQsIGluY29tZSBudW1iZXIpIikKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICg/KSIsICgiZm9vIiwpKQoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBzZWxmLmN1LmNsb3NlKCkKICAgICAgICBzZWxmLmN4LmNsb3NlKCkKCiAgICBkZWYgQ2hlY2tFeGVjdXRlTm9BcmdzKHNlbGYpOgogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCgogICAgZGVmIENoZWNrRXhlY3V0ZUlsbGVnYWxTcWwoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBhc2RmIikKICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIHNlbGYuZmFpbCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbiIpCgogICAgZGVmIENoZWNrRXhlY3V0ZVRvb011Y2hTcWwoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCA1KzQ7IHNlbGVjdCA0KzUiKQogICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhIFdhcm5pbmciKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuV2FybmluZzoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICBzZWxmLmZhaWwoInJhaXNlZCB3cm9uZyBleGNlcHRpb24iKQoKICAgIGRlZiBDaGVja0V4ZWN1dGVUb29NdWNoU3FsMihzZWxmKToKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCA1KzQ7IC0tIGZvbyBiYXIiKQoKICAgIGRlZiBDaGVja0V4ZWN1dGVUb29NdWNoU3FsMyhzZWxmKToKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoIiIiCiAgICAgICAgICAgIHNlbGVjdCA1KzQ7CgogICAgICAgICAgICAvKgogICAgICAgICAgICBmb28KICAgICAgICAgICAgKi8KICAgICAgICAgICAgIiIiKQoKICAgIGRlZiBDaGVja0V4ZWN1dGVXcm9uZ1NxbEFyZyhzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSg0MikKICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYSBWYWx1ZUVycm9yIikKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICBzZWxmLmZhaWwoInJhaXNlZCB3cm9uZyBleGNlcHRpb24uIikKCiAgICBkZWYgQ2hlY2tFeGVjdXRlQXJnSW50KHNlbGYpOgogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpZCkgdmFsdWVzICg/KSIsICg0MiwpKQoKICAgIGRlZiBDaGVja0V4ZWN1dGVBcmdGbG9hdChzZWxmKToKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaW5jb21lKSB2YWx1ZXMgKD8pIiwgKDI1MDAuMzIsKSkKCiAgICBkZWYgQ2hlY2tFeGVjdXRlQXJnU3RyaW5nKHNlbGYpOgogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKD8pIiwgKCJIdWdvIiwpKQoKICAgIGRlZiBDaGVja0V4ZWN1dGVXcm9uZ05vT2ZBcmdzMShzZWxmKToKICAgICAgICAjIHRvbyBtYW55IHBhcmFtZXRlcnMKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpZCkgdmFsdWVzICg/KSIsICgxNywgIkVnb24iKSkKICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgUHJvZ3JhbW1pbmdFcnJvciIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgogICAgICAgICAgICBwYXNzCgogICAgZGVmIENoZWNrRXhlY3V0ZVdyb25nTm9PZkFyZ3MyKHNlbGYpOgogICAgICAgICMgdG9vIGxpdHRsZSBwYXJhbWV0ZXJzCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaWQpIHZhbHVlcyAoPykiKQogICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBQcm9ncmFtbWluZ0Vycm9yIikKICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CiAgICAgICAgICAgIHBhc3MKCiAgICBkZWYgQ2hlY2tFeGVjdXRlV3JvbmdOb09mQXJnczMoc2VsZik6CiAgICAgICAgIyBubyBwYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzIGFyZSBuZWVkZWQKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpZCkgdmFsdWVzICg/KSIpCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIFByb2dyYW1taW5nRXJyb3IiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKICAgICAgICAgICAgcGFzcwoKICAgIGRlZiBDaGVja0V4ZWN1dGVQYXJhbUxpc3Qoc2VsZik6CiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCB3aGVyZSBuYW1lPT8iLCBbImZvbyJdKQogICAgICAgIHJvdyA9IHNlbGYuY3UuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCAiZm9vIikKCiAgICBkZWYgQ2hlY2tFeGVjdXRlUGFyYW1TZXF1ZW5jZShzZWxmKToKICAgICAgICBjbGFzcyBMKG9iamVjdCk6CiAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIHgpOgogICAgICAgICAgICAgICAgYXNzZXJ0IHggPT0gMAogICAgICAgICAgICAgICAgcmV0dXJuICJmb28iCgogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3Qgd2hlcmUgbmFtZT0/IiwgTCgpKQogICAgICAgIHJvdyA9IHNlbGYuY3UuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCAiZm9vIikKCiAgICBkZWYgQ2hlY2tFeGVjdXRlRGljdE1hcHBpbmcoc2VsZik6CiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCB3aGVyZSBuYW1lPTpuYW1lIiwgeyJuYW1lIjogImZvbyJ9KQogICAgICAgIHJvdyA9IHNlbGYuY3UuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCAiZm9vIikKCiAgICBkZWYgQ2hlY2tFeGVjdXRlRGljdE1hcHBpbmdfTWFwcGluZyhzZWxmKToKICAgICAgICBjbGFzcyBEKGRpY3QpOgogICAgICAgICAgICBkZWYgX19taXNzaW5nX18oc2VsZiwga2V5KToKICAgICAgICAgICAgICAgIHJldHVybiAiZm9vIgoKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IHdoZXJlIG5hbWU9Om5hbWUiLCBEKCkpCiAgICAgICAgcm93ID0gc2VsZi5jdS5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sICJmb28iKQoKICAgIGRlZiBDaGVja0V4ZWN1dGVEaWN0TWFwcGluZ1Rvb0xpdHRsZUFyZ3Moc2VsZik6CiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IHdoZXJlIG5hbWU9Om5hbWUgYW5kIGlkPTppZCIsIHsibmFtZSI6ICJmb28ifSkKICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgUHJvZ3JhbW1pbmdFcnJvciIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgogICAgICAgICAgICBwYXNzCgogICAgZGVmIENoZWNrRXhlY3V0ZURpY3RNYXBwaW5nTm9BcmdzKHNlbGYpOgogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCB3aGVyZSBuYW1lPTpuYW1lIikKICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgUHJvZ3JhbW1pbmdFcnJvciIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgogICAgICAgICAgICBwYXNzCgogICAgZGVmIENoZWNrRXhlY3V0ZURpY3RNYXBwaW5nVW5uYW1lZChzZWxmKToKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3Qgd2hlcmUgbmFtZT0/IiwgeyJuYW1lIjogImZvbyJ9KQogICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBQcm9ncmFtbWluZ0Vycm9yIikKICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CiAgICAgICAgICAgIHBhc3MKCiAgICBkZWYgQ2hlY2tDbG9zZShzZWxmKToKICAgICAgICBzZWxmLmN1LmNsb3NlKCkKCiAgICBkZWYgQ2hlY2tSb3djb3VudEV4ZWN1dGUoc2VsZik6CiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJkZWxldGUgZnJvbSB0ZXN0IikKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJ1cGRhdGUgdGVzdCBzZXQgbmFtZT0nYmFyJyIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1LnJvd2NvdW50LCAyKQoKICAgIGRlZiBDaGVja1Jvd2NvdW50U2VsZWN0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIHB5c3FsaXRlIGRvZXMgbm90IGtub3cgdGhlIHJvd2NvdW50IG9mIFNFTEVDVCBzdGF0ZW1lbnRzLCBiZWNhdXNlIHdlCiAgICAgICAgZG9uJ3QgZmV0Y2ggYWxsIHJvd3MgYWZ0ZXIgZXhlY3V0aW5nIHRoZSBzZWxlY3Qgc3RhdGVtZW50LiBUaGUgcm93Y291bnQKICAgICAgICBoYXMgdGh1cyB0byBiZSAtMS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCA1IHVuaW9uIHNlbGVjdCA2IikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3Uucm93Y291bnQsIC0xKQoKICAgIGRlZiBDaGVja1Jvd2NvdW50RXhlY3V0ZW1hbnkoc2VsZik6CiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJkZWxldGUgZnJvbSB0ZXN0IikKICAgICAgICBzZWxmLmN1LmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoPykiLCBbKDEsKSwgKDIsKSwgKDMsKV0pCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1LnJvd2NvdW50LCAzKQoKICAgIGRlZiBDaGVja1RvdGFsQ2hhbmdlcyhzZWxmKToKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCiAgICAgICAgaWYgc2VsZi5jeC50b3RhbF9jaGFuZ2VzIDwgMjoKICAgICAgICAgICAgc2VsZi5mYWlsKCJ0b3RhbCBjaGFuZ2VzIHJlcG9ydGVkIHdyb25nIHZhbHVlIikKCiAgICAjIENoZWNrcyBmb3IgZXhlY3V0ZW1hbnk6CiAgICAjIFNlcXVlbmNlcyBhcmUgcmVxdWlyZWQgYnkgdGhlIERCLUFQSSwgaXRlcmF0b3JzCiAgICAjIGVuaGFuY2VtZW50cyBpbiBweXNxbGl0ZS4KCiAgICBkZWYgQ2hlY2tFeGVjdXRlTWFueVNlcXVlbmNlKHNlbGYpOgogICAgICAgIHNlbGYuY3UuZXhlY3V0ZW1hbnkoImluc2VydCBpbnRvIHRlc3QoaW5jb21lKSB2YWx1ZXMgKD8pIiwgWyh4LCkgZm9yIHggaW4gcmFuZ2UoMTAwLCAxMTApXSkKCiAgICBkZWYgQ2hlY2tFeGVjdXRlTWFueUl0ZXJhdG9yKHNlbGYpOgogICAgICAgIGNsYXNzIE15SXRlcjoKICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICAgICAgICAgc2VsZi52YWx1ZSA9IDUKCiAgICAgICAgICAgIGRlZiBfX25leHRfXyhzZWxmKToKICAgICAgICAgICAgICAgIGlmIHNlbGYudmFsdWUgPT0gMTA6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLnZhbHVlICs9IDEKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHNlbGYudmFsdWUsKQoKICAgICAgICBzZWxmLmN1LmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byB0ZXN0KGluY29tZSkgdmFsdWVzICg/KSIsIE15SXRlcigpKQoKICAgIGRlZiBDaGVja0V4ZWN1dGVNYW55R2VuZXJhdG9yKHNlbGYpOgogICAgICAgIGRlZiBteWdlbigpOgogICAgICAgICAgICBmb3IgaSBpbiByYW5nZSg1KToKICAgICAgICAgICAgICAgIHlpZWxkIChpLCkKCiAgICAgICAgc2VsZi5jdS5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gdGVzdChpbmNvbWUpIHZhbHVlcyAoPykiLCBteWdlbigpKQoKICAgIGRlZiBDaGVja0V4ZWN1dGVNYW55V3JvbmdTcWxBcmcoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGVtYW55KDQyLCBbKDMsKV0pCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgVmFsdWVFcnJvciIpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgc2VsZi5mYWlsKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uLiIpCgogICAgZGVmIENoZWNrRXhlY3V0ZU1hbnlTZWxlY3Qoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGVtYW55KCJzZWxlY3QgPyIsIFsoMywpXSkKICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgc2VsZi5mYWlsKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uLiIpCgogICAgZGVmIENoZWNrRXhlY3V0ZU1hbnlOb3RJdGVyYWJsZShzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZW1hbnkoImluc2VydCBpbnRvIHRlc3QoaW5jb21lKSB2YWx1ZXMgKD8pIiwgNDIpCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgVHlwZUVycm9yIikKICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHByaW50KCJyYWlzZWQiLCBlLl9fY2xhc3NfXykKICAgICAgICAgICAgc2VsZi5mYWlsKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uLiIpCgogICAgZGVmIENoZWNrRmV0Y2hJdGVyKHNlbGYpOgogICAgICAgICMgT3B0aW9uYWwgREItQVBJIGV4dGVuc2lvbi4KICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImRlbGV0ZSBmcm9tIHRlc3QiKQogICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpZCkgdmFsdWVzICg/KSIsICg1LCkpCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGlkKSB2YWx1ZXMgKD8pIiwgKDYsKSkKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBpZCBmcm9tIHRlc3Qgb3JkZXIgYnkgaWQiKQogICAgICAgIGxzdCA9IFtdCiAgICAgICAgZm9yIHJvdyBpbiBzZWxmLmN1OgogICAgICAgICAgICBsc3QuYXBwZW5kKHJvd1swXSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxzdFswXSwgNSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxzdFsxXSwgNikKCiAgICBkZWYgQ2hlY2tGZXRjaG9uZShzZWxmKToKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCiAgICAgICAgcm93ID0gc2VsZi5jdS5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sICJmb28iKQogICAgICAgIHJvdyA9IHNlbGYuY3UuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93LCBOb25lKQoKICAgIGRlZiBDaGVja0ZldGNob25lTm9TdGF0ZW1lbnQoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jeC5jdXJzb3IoKQogICAgICAgIHJvdyA9IGN1ci5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3csIE5vbmUpCgogICAgZGVmIENoZWNrQXJyYXlTaXplKHNlbGYpOgogICAgICAgICMgbXVzdCBkZWZhdWx0IG90IDEKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3UuYXJyYXlzaXplLCAxKQoKICAgICAgICAjIG5vdyBzZXQgdG8gMgogICAgICAgIHNlbGYuY3UuYXJyYXlzaXplID0gMgoKICAgICAgICAjIG5vdyBtYWtlIHRoZSBxdWVyeSByZXR1cm4gMyByb3dzCiAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJkZWxldGUgZnJvbSB0ZXN0IikKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnQScpIikKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnQicpIikKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnQycpIikKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCiAgICAgICAgcmVzID0gc2VsZi5jdS5mZXRjaG1hbnkoKQoKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXMpLCAyKQoKICAgIGRlZiBDaGVja0ZldGNobWFueShzZWxmKToKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCiAgICAgICAgcmVzID0gc2VsZi5jdS5mZXRjaG1hbnkoMTAwKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcyksIDEpCiAgICAgICAgcmVzID0gc2VsZi5jdS5mZXRjaG1hbnkoMTAwKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBbXSkKCiAgICBkZWYgQ2hlY2tGZXRjaG1hbnlLd0FyZyhzZWxmKToKICAgICAgICAiIiJDaGVja3MgaWYgZmV0Y2htYW55IHdvcmtzIHdpdGgga2V5d29yZCBhcmd1bWVudHMiIiIKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCiAgICAgICAgcmVzID0gc2VsZi5jdS5mZXRjaG1hbnkoc2l6ZT0xMDApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzKSwgMSkKCiAgICBkZWYgQ2hlY2tGZXRjaGFsbChzZWxmKToKICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCiAgICAgICAgcmVzID0gc2VsZi5jdS5mZXRjaGFsbCgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzKSwgMSkKICAgICAgICByZXMgPSBzZWxmLmN1LmZldGNoYWxsKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgW10pCgogICAgZGVmIENoZWNrU2V0aW5wdXRzaXplcyhzZWxmKToKICAgICAgICBzZWxmLmN1LnNldGlucHV0c2l6ZXMoWzMsIDQsIDVdKQoKICAgIGRlZiBDaGVja1NldG91dHB1dHNpemUoc2VsZik6CiAgICAgICAgc2VsZi5jdS5zZXRvdXRwdXRzaXplKDUsIDApCgogICAgZGVmIENoZWNrU2V0b3V0cHV0c2l6ZU5vQ29sdW1uKHNlbGYpOgogICAgICAgIHNlbGYuY3Uuc2V0b3V0cHV0c2l6ZSg0MikKCiAgICBkZWYgQ2hlY2tDdXJzb3JDb25uZWN0aW9uKHNlbGYpOgogICAgICAgICMgT3B0aW9uYWwgREItQVBJIGV4dGVuc2lvbi4KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3UuY29ubmVjdGlvbiwgc2VsZi5jeCkKCiAgICBkZWYgQ2hlY2tXcm9uZ0N1cnNvckNhbGxhYmxlKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgZGVmIGYoKTogcGFzcwogICAgICAgICAgICBjdXIgPSBzZWxmLmN4LmN1cnNvcihmKQogICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhIFR5cGVFcnJvciIpCiAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYSBWYWx1ZUVycm9yIikKCiAgICBkZWYgQ2hlY2tDdXJzb3JXcm9uZ0NsYXNzKHNlbGYpOgogICAgICAgIGNsYXNzIEZvbzogcGFzcwogICAgICAgIGZvbyA9IEZvbygpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjdXIgPSBzcWxpdGUuQ3Vyc29yKGZvbykKICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYSBWYWx1ZUVycm9yIikKICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICBwYXNzCgpjbGFzcyBUaHJlYWRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpZCBpbnRlZ2VyIHByaW1hcnkga2V5LCBuYW1lIHRleHQsIGJpbiBiaW5hcnksIHJhdGlvIG51bWJlciwgdHMgdGltZXN0YW1wKSIpCgogICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCgogICAgZGVmIENoZWNrQ29uQ3Vyc29yKHNlbGYpOgogICAgICAgIGRlZiBydW4oY29uLCBlcnJvcnMpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoImRpZCBub3QgcmFpc2UgUHJvZ3JhbW1pbmdFcnJvciIpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoInJhaXNlZCB3cm9uZyBleGNlcHRpb24iKQoKICAgICAgICBlcnJvcnMgPSBbXQogICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW4sIGt3YXJncz17ImNvbiI6IHNlbGYuY29uLCAiZXJyb3JzIjogZXJyb3JzfSkKICAgICAgICB0LnN0YXJ0KCkKICAgICAgICB0LmpvaW4oKQogICAgICAgIGlmIGxlbihlcnJvcnMpID4gMDoKICAgICAgICAgICAgc2VsZi5mYWlsKCJcbiIuam9pbihlcnJvcnMpKQoKICAgIGRlZiBDaGVja0NvbkNvbW1pdChzZWxmKToKICAgICAgICBkZWYgcnVuKGNvbiwgZXJyb3JzKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY29uLmNvbW1pdCgpCiAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJkaWQgbm90IHJhaXNlIFByb2dyYW1taW5nRXJyb3IiKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uIikKCiAgICAgICAgZXJyb3JzID0gW10KICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9cnVuLCBrd2FyZ3M9eyJjb24iOiBzZWxmLmNvbiwgImVycm9ycyI6IGVycm9yc30pCiAgICAgICAgdC5zdGFydCgpCiAgICAgICAgdC5qb2luKCkKICAgICAgICBpZiBsZW4oZXJyb3JzKSA+IDA6CiAgICAgICAgICAgIHNlbGYuZmFpbCgiXG4iLmpvaW4oZXJyb3JzKSkKCiAgICBkZWYgQ2hlY2tDb25Sb2xsYmFjayhzZWxmKToKICAgICAgICBkZWYgcnVuKGNvbiwgZXJyb3JzKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY29uLnJvbGxiYWNrKCkKICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoImRpZCBub3QgcmFpc2UgUHJvZ3JhbW1pbmdFcnJvciIpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoInJhaXNlZCB3cm9uZyBleGNlcHRpb24iKQoKICAgICAgICBlcnJvcnMgPSBbXQogICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW4sIGt3YXJncz17ImNvbiI6IHNlbGYuY29uLCAiZXJyb3JzIjogZXJyb3JzfSkKICAgICAgICB0LnN0YXJ0KCkKICAgICAgICB0LmpvaW4oKQogICAgICAgIGlmIGxlbihlcnJvcnMpID4gMDoKICAgICAgICAgICAgc2VsZi5mYWlsKCJcbiIuam9pbihlcnJvcnMpKQoKICAgIGRlZiBDaGVja0NvbkNsb3NlKHNlbGYpOgogICAgICAgIGRlZiBydW4oY29uLCBlcnJvcnMpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBjb24uY2xvc2UoKQogICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiZGlkIG5vdCByYWlzZSBQcm9ncmFtbWluZ0Vycm9yIikKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbiIpCgogICAgICAgIGVycm9ycyA9IFtdCiAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJ1biwga3dhcmdzPXsiY29uIjogc2VsZi5jb24sICJlcnJvcnMiOiBlcnJvcnN9KQogICAgICAgIHQuc3RhcnQoKQogICAgICAgIHQuam9pbigpCiAgICAgICAgaWYgbGVuKGVycm9ycykgPiAwOgogICAgICAgICAgICBzZWxmLmZhaWwoIlxuIi5qb2luKGVycm9ycykpCgogICAgZGVmIENoZWNrQ3VySW1wbGljaXRCZWdpbihzZWxmKToKICAgICAgICBkZWYgcnVuKGN1ciwgZXJyb3JzKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnYScpIikKICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoImRpZCBub3QgcmFpc2UgUHJvZ3JhbW1pbmdFcnJvciIpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoInJhaXNlZCB3cm9uZyBleGNlcHRpb24iKQoKICAgICAgICBlcnJvcnMgPSBbXQogICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW4sIGt3YXJncz17ImN1ciI6IHNlbGYuY3VyLCAiZXJyb3JzIjogZXJyb3JzfSkKICAgICAgICB0LnN0YXJ0KCkKICAgICAgICB0LmpvaW4oKQogICAgICAgIGlmIGxlbihlcnJvcnMpID4gMDoKICAgICAgICAgICAgc2VsZi5mYWlsKCJcbiIuam9pbihlcnJvcnMpKQoKICAgIGRlZiBDaGVja0N1ckNsb3NlKHNlbGYpOgogICAgICAgIGRlZiBydW4oY3VyLCBlcnJvcnMpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBjdXIuY2xvc2UoKQogICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiZGlkIG5vdCByYWlzZSBQcm9ncmFtbWluZ0Vycm9yIikKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbiIpCgogICAgICAgIGVycm9ycyA9IFtdCiAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJ1biwga3dhcmdzPXsiY3VyIjogc2VsZi5jdXIsICJlcnJvcnMiOiBlcnJvcnN9KQogICAgICAgIHQuc3RhcnQoKQogICAgICAgIHQuam9pbigpCiAgICAgICAgaWYgbGVuKGVycm9ycykgPiAwOgogICAgICAgICAgICBzZWxmLmZhaWwoIlxuIi5qb2luKGVycm9ycykpCgogICAgZGVmIENoZWNrQ3VyRXhlY3V0ZShzZWxmKToKICAgICAgICBkZWYgcnVuKGN1ciwgZXJyb3JzKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCiAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJkaWQgbm90IHJhaXNlIFByb2dyYW1taW5nRXJyb3IiKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uIikKCiAgICAgICAgZXJyb3JzID0gW10KICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2EnKSIpCiAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJ1biwga3dhcmdzPXsiY3VyIjogc2VsZi5jdXIsICJlcnJvcnMiOiBlcnJvcnN9KQogICAgICAgIHQuc3RhcnQoKQogICAgICAgIHQuam9pbigpCiAgICAgICAgaWYgbGVuKGVycm9ycykgPiAwOgogICAgICAgICAgICBzZWxmLmZhaWwoIlxuIi5qb2luKGVycm9ycykpCgogICAgZGVmIENoZWNrQ3VySXRlck5leHQoc2VsZik6CiAgICAgICAgZGVmIHJ1bihjdXIsIGVycm9ycyk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJvdyA9IGN1ci5mZXRjaG9uZSgpCiAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJkaWQgbm90IHJhaXNlIFByb2dyYW1taW5nRXJyb3IiKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uIikKCiAgICAgICAgZXJyb3JzID0gW10KICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2EnKSIpCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IikKICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9cnVuLCBrd2FyZ3M9eyJjdXIiOiBzZWxmLmN1ciwgImVycm9ycyI6IGVycm9yc30pCiAgICAgICAgdC5zdGFydCgpCiAgICAgICAgdC5qb2luKCkKICAgICAgICBpZiBsZW4oZXJyb3JzKSA+IDA6CiAgICAgICAgICAgIHNlbGYuZmFpbCgiXG4iLmpvaW4oZXJyb3JzKSkKCmNsYXNzIENvbnN0cnVjdG9yVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIENoZWNrRGF0ZShzZWxmKToKICAgICAgICBkID0gc3FsaXRlLkRhdGUoMjAwNCwgMTAsIDI4KQoKICAgIGRlZiBDaGVja1RpbWUoc2VsZik6CiAgICAgICAgdCA9IHNxbGl0ZS5UaW1lKDEyLCAzOSwgMzUpCgogICAgZGVmIENoZWNrVGltZXN0YW1wKHNlbGYpOgogICAgICAgIHRzID0gc3FsaXRlLlRpbWVzdGFtcCgyMDA0LCAxMCwgMjgsIDEyLCAzOSwgMzUpCgogICAgZGVmIENoZWNrRGF0ZUZyb21UaWNrcyhzZWxmKToKICAgICAgICBkID0gc3FsaXRlLkRhdGVGcm9tVGlja3MoNDIpCgogICAgZGVmIENoZWNrVGltZUZyb21UaWNrcyhzZWxmKToKICAgICAgICB0ID0gc3FsaXRlLlRpbWVGcm9tVGlja3MoNDIpCgogICAgZGVmIENoZWNrVGltZXN0YW1wRnJvbVRpY2tzKHNlbGYpOgogICAgICAgIHRzID0gc3FsaXRlLlRpbWVzdGFtcEZyb21UaWNrcyg0MikKCiAgICBkZWYgQ2hlY2tCaW5hcnkoc2VsZik6CiAgICAgICAgYiA9IHNxbGl0ZS5CaW5hcnkoYiJcMCciKQoKY2xhc3MgRXh0ZW5zaW9uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIENoZWNrU2NyaXB0U3RyaW5nU3FsKHNlbGYpOgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgY3VyID0gY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGVzY3JpcHQoIiIiCiAgICAgICAgICAgIC0tIGJsYSBibGEKICAgICAgICAgICAgLyogYSBzdHVwaWQgY29tbWVudCAqLwogICAgICAgICAgICBjcmVhdGUgdGFibGUgYShpKTsKICAgICAgICAgICAgaW5zZXJ0IGludG8gYShpKSB2YWx1ZXMgKDUpOwogICAgICAgICAgICAiIiIpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gYSIpCiAgICAgICAgcmVzID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgNSkKCiAgICBkZWYgQ2hlY2tTY3JpcHRFcnJvckluY29tcGxldGUoc2VsZik6CiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKICAgICAgICByYWlzZWQgPSBGYWxzZQogICAgICAgIHRyeToKICAgICAgICAgICAgY3VyLmV4ZWN1dGVzY3JpcHQoImNyZWF0ZSB0YWJsZSB0ZXN0KHNhZGZzYWRmZHNhIikKICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CiAgICAgICAgICAgIHJhaXNlZCA9IFRydWUKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhaXNlZCwgVHJ1ZSwgInNob3VsZCBoYXZlIHJhaXNlZCBhbiBleGNlcHRpb24iKQoKICAgIGRlZiBDaGVja1NjcmlwdEVycm9yTm9ybWFsKHNlbGYpOgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgY3VyID0gY29uLmN1cnNvcigpCiAgICAgICAgcmFpc2VkID0gRmFsc2UKICAgICAgICB0cnk6CiAgICAgICAgICAgIGN1ci5leGVjdXRlc2NyaXB0KCJjcmVhdGUgdGFibGUgdGVzdChzYWRmc2FkZmRzYSk7IHNlbGVjdCBmb28gZnJvbSBodXJ6OyIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yOgogICAgICAgICAgICByYWlzZWQgPSBUcnVlCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYWlzZWQsIFRydWUsICJzaG91bGQgaGF2ZSByYWlzZWQgYW4gZXhjZXB0aW9uIikKCiAgICBkZWYgQ2hlY2tDb25uZWN0aW9uRXhlY3V0ZShzZWxmKToKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIHJlc3VsdCA9IGNvbi5leGVjdXRlKCJzZWxlY3QgNSIpLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgNSwgIkJhc2ljIHRlc3Qgb2YgQ29ubmVjdGlvbi5leGVjdXRlIikKCiAgICBkZWYgQ2hlY2tDb25uZWN0aW9uRXhlY3V0ZW1hbnkoc2VsZik6CiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoZm9vKSIpCiAgICAgICAgY29uLmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byB0ZXN0KGZvbykgdmFsdWVzICg/KSIsIFsoMywpLCAoNCwpXSkKICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZSgic2VsZWN0IGZvbyBmcm9tIHRlc3Qgb3JkZXIgYnkgZm9vIikuZmV0Y2hhbGwoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0WzBdWzBdLCAzLCAiQmFzaWMgdGVzdCBvZiBDb25uZWN0aW9uLmV4ZWN1dGVtYW55IikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdFsxXVswXSwgNCwgIkJhc2ljIHRlc3Qgb2YgQ29ubmVjdGlvbi5leGVjdXRlbWFueSIpCgogICAgZGVmIENoZWNrQ29ubmVjdGlvbkV4ZWN1dGVzY3JpcHQoc2VsZik6CiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjb24uZXhlY3V0ZXNjcmlwdCgiY3JlYXRlIHRhYmxlIHRlc3QoZm9vKTsgaW5zZXJ0IGludG8gdGVzdChmb28pIHZhbHVlcyAoNSk7IikKICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZSgic2VsZWN0IGZvbyBmcm9tIHRlc3QiKS5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIDUsICJCYXNpYyB0ZXN0IG9mIENvbm5lY3Rpb24uZXhlY3V0ZXNjcmlwdCIpCgpjbGFzcyBDbG9zZWRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgcGFzcwoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIENoZWNrQ2xvc2VkQ29uQ3Vyc29yKHNlbGYpOgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgY29uLmNsb3NlKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGN1ciA9IGNvbi5jdXJzb3IoKQogICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKCiAgICBkZWYgQ2hlY2tDbG9zZWRDb25Db21taXQoc2VsZik6CiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjb24uY2xvc2UoKQogICAgICAgIHRyeToKICAgICAgICAgICAgY29uLmNvbW1pdCgpCiAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQoKICAgIGRlZiBDaGVja0Nsb3NlZENvblJvbGxiYWNrKHNlbGYpOgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgY29uLmNsb3NlKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbi5yb2xsYmFjaygpCiAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQoKICAgIGRlZiBDaGVja0Nsb3NlZEN1ckV4ZWN1dGUoc2VsZik6CiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKICAgICAgICBjb24uY2xvc2UoKQogICAgICAgIHRyeToKICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCA0IikKICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCgoKICAgIGRlZiBDaGVja0Nsb3NlZENyZWF0ZUZ1bmN0aW9uKHNlbGYpOgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgY29uLmNsb3NlKCkKICAgICAgICBkZWYgZih4KTogcmV0dXJuIDE3CiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb24uY3JlYXRlX2Z1bmN0aW9uKCJmb28iLCAxLCBmKQogICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKCiAgICBkZWYgQ2hlY2tDbG9zZWRDcmVhdGVBZ2dyZWdhdGUoc2VsZik6CiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjb24uY2xvc2UoKQogICAgICAgIGNsYXNzIEFnZzoKICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBkZWYgc3RlcChzZWxmLCB4KToKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgZGVmIGZpbmFsaXplKHNlbGYpOgogICAgICAgICAgICAgICAgcmV0dXJuIDE3CiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb24uY3JlYXRlX2FnZ3JlZ2F0ZSgiZm9vIiwgMSwgQWdnKQogICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKCiAgICBkZWYgQ2hlY2tDbG9zZWRTZXRBdXRob3JpemVyKHNlbGYpOgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgY29uLmNsb3NlKCkKICAgICAgICBkZWYgYXV0aG9yaXplcigqYXJncyk6CiAgICAgICAgICAgIHJldHVybiBzcWxpdGUuREVOWQogICAgICAgIHRyeToKICAgICAgICAgICAgY29uLnNldF9hdXRob3JpemVyKGF1dGhvcml6ZXIpCiAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQoKICAgIGRlZiBDaGVja0Nsb3NlZFNldFByb2dyZXNzQ2FsbGJhY2soc2VsZik6CiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjb24uY2xvc2UoKQogICAgICAgIGRlZiBwcm9ncmVzcygpOiBwYXNzCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb24uc2V0X3Byb2dyZXNzX2hhbmRsZXIocHJvZ3Jlc3MsIDEwMCkKICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCgogICAgZGVmIENoZWNrQ2xvc2VkQ2FsbChzZWxmKToKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIGNvbi5jbG9zZSgpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb24oKQogICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKCmRlZiBzdWl0ZSgpOgogICAgbW9kdWxlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKE1vZHVsZVRlc3RzLCAiQ2hlY2siKQogICAgY29ubmVjdGlvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDb25uZWN0aW9uVGVzdHMsICJDaGVjayIpCiAgICBjdXJzb3Jfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQ3Vyc29yVGVzdHMsICJDaGVjayIpCiAgICB0aHJlYWRfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoVGhyZWFkVGVzdHMsICJDaGVjayIpCiAgICBjb25zdHJ1Y3Rvcl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDb25zdHJ1Y3RvclRlc3RzLCAiQ2hlY2siKQogICAgZXh0X3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKEV4dGVuc2lvblRlc3RzLCAiQ2hlY2siKQogICAgY2xvc2VkX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKENsb3NlZFRlc3RzLCAiQ2hlY2siKQogICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgobW9kdWxlX3N1aXRlLCBjb25uZWN0aW9uX3N1aXRlLCBjdXJzb3Jfc3VpdGUsIHRocmVhZF9zdWl0ZSwgY29uc3RydWN0b3Jfc3VpdGUsIGV4dF9zdWl0ZSwgY2xvc2VkX3N1aXRlKSkKCmRlZiB0ZXN0KCk6CiAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigpCiAgICBydW5uZXIucnVuKHN1aXRlKCkpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgdGVzdCgpCg==