Iy0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCiMgcHlzcWxpdGUyL3Rlc3QvaG9va3MucHk6IHRlc3RzIGZvciB2YXJpb3VzIFNRTGl0ZS1zcGVjaWZpYyBob29rcwojCiMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgojCiMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiMKIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAojIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgojCiMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAojIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKIwojIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CiMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgojIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCiMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgojIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCgppbXBvcnQgdW5pdHRlc3QKaW1wb3J0IHNxbGl0ZTMgYXMgc3FsaXRlCgpjbGFzcyBDb2xsYXRpb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgcGFzcwoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIENoZWNrQ3JlYXRlQ29sbGF0aW9uTm90Q2FsbGFibGUoc2VsZik6CiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJYIiwgNDIpCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgVHlwZUVycm9yIikKICAgICAgICBleGNlcHQgVHlwZUVycm9yIGFzIGU6CiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5hcmdzWzBdLCAicGFyYW1ldGVyIG11c3QgYmUgY2FsbGFibGUiKQoKICAgIGRlZiBDaGVja0NyZWF0ZUNvbGxhdGlvbk5vdEFzY2lpKHNlbGYpOgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigiY29sbOQiLCBsYW1iZGEgeCwgeTogKHggPiB5KSAtICh4IDwgeSkpCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yIGFzIGU6CiAgICAgICAgICAgIHBhc3MKCiAgICBAdW5pdHRlc3Quc2tpcElmKHNxbGl0ZS5zcWxpdGVfdmVyc2lvbl9pbmZvIDwgKDMsIDIsIDEpLAogICAgICAgICAgICAgICAgICAgICAnb2xkIFNRTGl0ZSB2ZXJzaW9ucyBjcmFzaCBvbiB0aGlzIHRlc3QnKQogICAgZGVmIENoZWNrQ29sbGF0aW9uSXNVc2VkKHNlbGYpOgogICAgICAgIGRlZiBteWNvbGwoeCwgeSk6CiAgICAgICAgICAgICMgcmV2ZXJzZSBvcmRlcgogICAgICAgICAgICByZXR1cm4gLSgoeCA+IHkpIC0gKHggPCB5KSkKCiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigibXljb2xsIiwgbXljb2xsKQogICAgICAgIHNxbCA9ICIiIgogICAgICAgICAgICBzZWxlY3QgeCBmcm9tICgKICAgICAgICAgICAgc2VsZWN0ICdhJyBhcyB4CiAgICAgICAgICAgIHVuaW9uCiAgICAgICAgICAgIHNlbGVjdCAnYicgYXMgeAogICAgICAgICAgICB1bmlvbgogICAgICAgICAgICBzZWxlY3QgJ2MnIGFzIHgKICAgICAgICAgICAgKSBvcmRlciBieSB4IGNvbGxhdGUgbXljb2xsCiAgICAgICAgICAgICIiIgogICAgICAgIHJlc3VsdCA9IGNvbi5leGVjdXRlKHNxbCkuZmV0Y2hhbGwoKQogICAgICAgIGlmIHJlc3VsdFswXVswXSAhPSAiYyIgb3IgcmVzdWx0WzFdWzBdICE9ICJiIiBvciByZXN1bHRbMl1bMF0gIT0gImEiOgogICAgICAgICAgICBzZWxmLmZhaWwoInRoZSBleHBlY3RlZCBvcmRlciB3YXMgbm90IHJldHVybmVkIikKCiAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIE5vbmUpCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZShzcWwpLmZldGNoYWxsKCkKICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yIGFzIGU6CiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5hcmdzWzBdLmxvd2VyKCksICJubyBzdWNoIGNvbGxhdGlvbiBzZXF1ZW5jZTogbXljb2xsIikKCiAgICBkZWYgQ2hlY2tDb2xsYXRpb25SZXR1cm5zTGFyZ2VJbnRlZ2VyKHNlbGYpOgogICAgICAgIGRlZiBteWNvbGwoeCwgeSk6CiAgICAgICAgICAgICMgcmV2ZXJzZSBvcmRlcgogICAgICAgICAgICByZXR1cm4gLSgoeCA+IHkpIC0gKHggPCB5KSkgKiAyKiozMgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIG15Y29sbCkKICAgICAgICBzcWwgPSAiIiIKICAgICAgICAgICAgc2VsZWN0IHggZnJvbSAoCiAgICAgICAgICAgIHNlbGVjdCAnYScgYXMgeAogICAgICAgICAgICB1bmlvbgogICAgICAgICAgICBzZWxlY3QgJ2InIGFzIHgKICAgICAgICAgICAgdW5pb24KICAgICAgICAgICAgc2VsZWN0ICdjJyBhcyB4CiAgICAgICAgICAgICkgb3JkZXIgYnkgeCBjb2xsYXRlIG15Y29sbAogICAgICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZShzcWwpLmZldGNoYWxsKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgWygnYycsKSwgKCdiJywpLCAoJ2EnLCldLAogICAgICAgICAgICAgICAgICAgICAgICAgbXNnPSJ0aGUgZXhwZWN0ZWQgb3JkZXIgd2FzIG5vdCByZXR1cm5lZCIpCgogICAgZGVmIENoZWNrQ29sbGF0aW9uUmVnaXN0ZXJUd2ljZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZWdpc3RlciB0d28gZGlmZmVyZW50IGNvbGxhdGlvbiBmdW5jdGlvbnMgdW5kZXIgdGhlIHNhbWUgbmFtZS4KICAgICAgICBWZXJpZnkgdGhhdCB0aGUgbGFzdCBvbmUgaXMgYWN0dWFsbHkgdXNlZC4KICAgICAgICAiIiIKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJteWNvbGwiLCBsYW1iZGEgeCwgeTogKHggPiB5KSAtICh4IDwgeSkpCiAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIGxhbWJkYSB4LCB5OiAtKCh4ID4geSkgLSAoeCA8IHkpKSkKICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZSgiIiIKICAgICAgICAgICAgc2VsZWN0IHggZnJvbSAoc2VsZWN0ICdhJyBhcyB4IHVuaW9uIHNlbGVjdCAnYicgYXMgeCkgb3JkZXIgYnkgeCBjb2xsYXRlIG15Y29sbAogICAgICAgICAgICAiIiIpLmZldGNoYWxsKCkKICAgICAgICBpZiByZXN1bHRbMF1bMF0gIT0gJ2InIG9yIHJlc3VsdFsxXVswXSAhPSAnYSc6CiAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgY29sbGF0aW9uIGZ1bmN0aW9uIGlzIHVzZWQiKQoKICAgIGRlZiBDaGVja0RlcmVnaXN0ZXJDb2xsYXRpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVnaXN0ZXIgYSBjb2xsYXRpb24sIHRoZW4gZGVyZWdpc3RlciBpdC4gTWFrZSBzdXJlIGFuIGVycm9yIGlzIHJhaXNlZCBpZiB3ZSB0cnkKICAgICAgICB0byB1c2UgaXQuCiAgICAgICAgIiIiCiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigibXljb2xsIiwgbGFtYmRhIHgsIHk6ICh4ID4geSkgLSAoeCA8IHkpKQogICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJteWNvbGwiLCBOb25lKQogICAgICAgIHRyeToKICAgICAgICAgICAgY29uLmV4ZWN1dGUoInNlbGVjdCAnYScgYXMgeCB1bmlvbiBzZWxlY3QgJ2InIGFzIHggb3JkZXIgYnkgeCBjb2xsYXRlIG15Y29sbCIpCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciBhcyBlOgogICAgICAgICAgICBpZiBub3QgZS5hcmdzWzBdLnN0YXJ0c3dpdGgoIm5vIHN1Y2ggY29sbGF0aW9uIHNlcXVlbmNlIik6CiAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIndyb25nIE9wZXJhdGlvbmFsRXJyb3IgcmFpc2VkIikKCmNsYXNzIFByb2dyZXNzVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIENoZWNrUHJvZ3Jlc3NIYW5kbGVyVXNlZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgdGhlIHByb2dyZXNzIGhhbmRsZXIgaXMgaW52b2tlZCBvbmNlIGl0IGlzIHNldC4KICAgICAgICAiIiIKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIHByb2dyZXNzX2NhbGxzID0gW10KICAgICAgICBkZWYgcHJvZ3Jlc3MoKToKICAgICAgICAgICAgcHJvZ3Jlc3NfY2FsbHMuYXBwZW5kKE5vbmUpCiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgY29uLnNldF9wcm9ncmVzc19oYW5kbGVyKHByb2dyZXNzLCAxKQogICAgICAgIGNvbi5leGVjdXRlKCIiIgogICAgICAgICAgICBjcmVhdGUgdGFibGUgZm9vKGEsIGIpCiAgICAgICAgICAgICIiIikKICAgICAgICBzZWxmLmFzc2VydFRydWUocHJvZ3Jlc3NfY2FsbHMpCgoKICAgIGRlZiBDaGVja09wY29kZUNvdW50KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgdGhhdCB0aGUgb3Bjb2RlIGFyZ3VtZW50IGlzIHJlc3BlY3RlZC4KICAgICAgICAiIiIKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIHByb2dyZXNzX2NhbGxzID0gW10KICAgICAgICBkZWYgcHJvZ3Jlc3MoKToKICAgICAgICAgICAgcHJvZ3Jlc3NfY2FsbHMuYXBwZW5kKE5vbmUpCiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgY29uLnNldF9wcm9ncmVzc19oYW5kbGVyKHByb2dyZXNzLCAxKQogICAgICAgIGN1cnMgPSBjb24uY3Vyc29yKCkKICAgICAgICBjdXJzLmV4ZWN1dGUoIiIiCiAgICAgICAgICAgIGNyZWF0ZSB0YWJsZSBmb28gKGEsIGIpCiAgICAgICAgICAgICIiIikKICAgICAgICBmaXJzdF9jb3VudCA9IGxlbihwcm9ncmVzc19jYWxscykKICAgICAgICBwcm9ncmVzc19jYWxscyA9IFtdCiAgICAgICAgY29uLnNldF9wcm9ncmVzc19oYW5kbGVyKHByb2dyZXNzLCAyKQogICAgICAgIGN1cnMuZXhlY3V0ZSgiIiIKICAgICAgICAgICAgY3JlYXRlIHRhYmxlIGJhciAoYSwgYikKICAgICAgICAgICAgIiIiKQogICAgICAgIHNlY29uZF9jb3VudCA9IGxlbihwcm9ncmVzc19jYWxscykKICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChmaXJzdF9jb3VudCwgc2Vjb25kX2NvdW50KQoKICAgIGRlZiBDaGVja0NhbmNlbE9wZXJhdGlvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgcmV0dXJuaW5nIGEgbm9uLXplcm8gdmFsdWUgc3RvcHMgdGhlIG9wZXJhdGlvbiBpbiBwcm9ncmVzcy4KICAgICAgICAiIiIKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIHByb2dyZXNzX2NhbGxzID0gW10KICAgICAgICBkZWYgcHJvZ3Jlc3MoKToKICAgICAgICAgICAgcHJvZ3Jlc3NfY2FsbHMuYXBwZW5kKE5vbmUpCiAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgY29uLnNldF9wcm9ncmVzc19oYW5kbGVyKHByb2dyZXNzLCAxKQogICAgICAgIGN1cnMgPSBjb24uY3Vyc29yKCkKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKICAgICAgICAgICAgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IsCiAgICAgICAgICAgIGN1cnMuZXhlY3V0ZSwKICAgICAgICAgICAgImNyZWF0ZSB0YWJsZSBiYXIgKGEsIGIpIikKCiAgICBkZWYgQ2hlY2tDbGVhckhhbmRsZXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCB0aGF0IHNldHRpbmcgdGhlIHByb2dyZXNzIGhhbmRsZXIgdG8gTm9uZSBjbGVhcnMgdGhlIHByZXZpb3VzbHkgc2V0IGhhbmRsZXIuCiAgICAgICAgIiIiCiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBhY3Rpb24gPSAwCiAgICAgICAgZGVmIHByb2dyZXNzKCk6CiAgICAgICAgICAgIG5vbmxvY2FsIGFjdGlvbgogICAgICAgICAgICBhY3Rpb24gPSAxCiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgY29uLnNldF9wcm9ncmVzc19oYW5kbGVyKHByb2dyZXNzLCAxKQogICAgICAgIGNvbi5zZXRfcHJvZ3Jlc3NfaGFuZGxlcihOb25lLCAxKQogICAgICAgIGNvbi5leGVjdXRlKCJzZWxlY3QgMSB1bmlvbiBzZWxlY3QgMiB1bmlvbiBzZWxlY3QgMyIpLmZldGNoYWxsKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdGlvbiwgMCwgInByb2dyZXNzIGhhbmRsZXIgd2FzIG5vdCBjbGVhcmVkIikKCmNsYXNzIFRyYWNlQ2FsbGJhY2tUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgQ2hlY2tUcmFjZUNhbGxiYWNrVXNlZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgdGhlIHRyYWNlIGNhbGxiYWNrIGlzIGludm9rZWQgb25jZSBpdCBpcyBzZXQuCiAgICAgICAgIiIiCiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICB0cmFjZWRfc3RhdGVtZW50cyA9IFtdCiAgICAgICAgZGVmIHRyYWNlKHN0YXRlbWVudCk6CiAgICAgICAgICAgIHRyYWNlZF9zdGF0ZW1lbnRzLmFwcGVuZChzdGF0ZW1lbnQpCiAgICAgICAgY29uLnNldF90cmFjZV9jYWxsYmFjayh0cmFjZSkKICAgICAgICBjb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIGZvbyhhLCBiKSIpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRyYWNlZF9zdGF0ZW1lbnRzKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhbnkoImNyZWF0ZSB0YWJsZSBmb28iIGluIHN0bXQgZm9yIHN0bXQgaW4gdHJhY2VkX3N0YXRlbWVudHMpKQoKICAgIGRlZiBDaGVja0NsZWFyVHJhY2VDYWxsYmFjayhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgc2V0dGluZyB0aGUgdHJhY2UgY2FsbGJhY2sgdG8gTm9uZSBjbGVhcnMgdGhlIHByZXZpb3VzbHkgc2V0IGNhbGxiYWNrLgogICAgICAgICIiIgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgdHJhY2VkX3N0YXRlbWVudHMgPSBbXQogICAgICAgIGRlZiB0cmFjZShzdGF0ZW1lbnQpOgogICAgICAgICAgICB0cmFjZWRfc3RhdGVtZW50cy5hcHBlbmQoc3RhdGVtZW50KQogICAgICAgIGNvbi5zZXRfdHJhY2VfY2FsbGJhY2sodHJhY2UpCiAgICAgICAgY29uLnNldF90cmFjZV9jYWxsYmFjayhOb25lKQogICAgICAgIGNvbi5leGVjdXRlKCJjcmVhdGUgdGFibGUgZm9vKGEsIGIpIikKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHRyYWNlZF9zdGF0ZW1lbnRzLCAidHJhY2UgY2FsbGJhY2sgd2FzIG5vdCBjbGVhcmVkIikKCiAgICBkZWYgQ2hlY2tVbmljb2RlQ29udGVudChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgdGhlIHN0YXRlbWVudCBjYW4gY29udGFpbiB1bmljb2RlIGxpdGVyYWxzLgogICAgICAgICIiIgogICAgICAgIHVuaWNvZGVfdmFsdWUgPSAnXHhmNlx4ZTRceGZjXHhkNlx4YzRceGRjXHhkZlx1MjBhYycKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIHRyYWNlZF9zdGF0ZW1lbnRzID0gW10KICAgICAgICBkZWYgdHJhY2Uoc3RhdGVtZW50KToKICAgICAgICAgICAgdHJhY2VkX3N0YXRlbWVudHMuYXBwZW5kKHN0YXRlbWVudCkKICAgICAgICBjb24uc2V0X3RyYWNlX2NhbGxiYWNrKHRyYWNlKQogICAgICAgIGNvbi5leGVjdXRlKCJjcmVhdGUgdGFibGUgZm9vKHgpIikKICAgICAgICAjIENhbid0IGV4ZWN1dGUgYm91bmQgcGFyYW1ldGVycyBhcyB0aGVpciB2YWx1ZXMgZG9uJ3QgYXBwZWFyCiAgICAgICAgIyBpbiB0cmFjZWQgc3RhdGVtZW50cyBiZWZvcmUgU1FMaXRlIDMuNi4yMQogICAgICAgICMgKGNmLiBodHRwOi8vd3d3LnNxbGl0ZS5vcmcvZHJhZnQvcmVsZWFzZWxvZy8zXzZfMjEuaHRtbCkKICAgICAgICBjb24uZXhlY3V0ZSgnaW5zZXJ0IGludG8gZm9vKHgpIHZhbHVlcyAoIiVzIiknICUgdW5pY29kZV92YWx1ZSkKICAgICAgICBjb24uY29tbWl0KCkKICAgICAgICBzZWxmLmFzc2VydFRydWUoYW55KHVuaWNvZGVfdmFsdWUgaW4gc3RtdCBmb3Igc3RtdCBpbiB0cmFjZWRfc3RhdGVtZW50cyksCiAgICAgICAgICAgICAgICAgICAgICAgICJVbmljb2RlIGRhdGEgJXMgZ2FyYmxlZCBpbiB0cmFjZSBjYWxsYmFjazogJXMiCiAgICAgICAgICAgICAgICAgICAgICAgICUgKGFzY2lpKHVuaWNvZGVfdmFsdWUpLCAnLCAnLmpvaW4obWFwKGFzY2lpLCB0cmFjZWRfc3RhdGVtZW50cykpKSkKCgoKZGVmIHN1aXRlKCk6CiAgICBjb2xsYXRpb25fc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQ29sbGF0aW9uVGVzdHMsICJDaGVjayIpCiAgICBwcm9ncmVzc19zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShQcm9ncmVzc1Rlc3RzLCAiQ2hlY2siKQogICAgdHJhY2Vfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoVHJhY2VDYWxsYmFja1Rlc3RzLCAiQ2hlY2siKQogICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgoY29sbGF0aW9uX3N1aXRlLCBwcm9ncmVzc19zdWl0ZSwgdHJhY2Vfc3VpdGUpKQoKZGVmIHRlc3QoKToKICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKCkKICAgIHJ1bm5lci5ydW4oc3VpdGUoKSkKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICB0ZXN0KCkK