LS0gQGF1dGhvcnMJCUZy6WTpcmljIEpvdWF1bHQKLS0gQGRhdGUJCTIwMDcvMDcvMjUKLS0gQGRlc2NyaXB0aW9uCVRoaXMgVENTIG1vZGVsIGRlZmluZXMgdGhlIHN5bnRheCBvZiB0aGUgQUNHIGxhbmd1YWdlLgpzeW50YXggQUNHIHsKCglwcmltaXRpdmVUZW1wbGF0ZSBpZGVudGlmaWVyIGZvciBTdHJpbmcgZGVmYXVsdCB1c2luZyBOQU1FOgoJCXZhbHVlID0gIiV0b2tlbiUiOwoKCXByaW1pdGl2ZVRlbXBsYXRlIGlkZW50aWZpZXJPcktleXdvcmQgZm9yIFN0cmluZyB1c2luZyBOQU1FIG9yS2V5d29yZDoKCQl2YWx1ZSA9ICIldG9rZW4lIjsKCglwcmltaXRpdmVUZW1wbGF0ZSBzdHJpbmdTeW1ib2wgZm9yIFN0cmluZyB1c2luZyBTVFJJTkc6CgkJdmFsdWUgPSAiZWkudW5lc2NhcGVTdHJpbmcoJXRva2VuJSwgMSkiLAoJCXNlcmlhbGl6ZXI9IidcJycgKyAldmFsdWUlLnRvQ1N0cmluZygpICsgJ1wnJyI7CgoJcHJpbWl0aXZlVGVtcGxhdGUgaW50ZWdlclN5bWJvbCBmb3IgSW50ZWdlciBkZWZhdWx0IHVzaW5nIElOVDoKCQl2YWx1ZSA9ICJJbnRlZ2VyLnZhbHVlT2YoJXRva2VuJSkiOwoKCXRlbXBsYXRlIEFDRyBtYWluCgkJOgkiYWNnIiBtZXRhbW9kZWwgInN0YXJ0c1dpdGgiIHN0YXJ0c1dpdGggInsiIFsKCQkJCWVsZW1lbnRzCgkJCV0gIn0iCgkJOwoKCXRlbXBsYXRlIEFDR0VsZW1lbnQgYWJzdHJhY3Q7CgoJdGVtcGxhdGUgRnVuY3Rpb24KCQk6CSJmdW5jdGlvbiIgY29udGV4dCAiOjoiIG5hbWUKCQkJCSIoIiAoaXNEZWZpbmVkKHBhcmFtZXRlcnMpID8gcGFyYW1ldGVyc3tmb3JjZWRMb3dlciA9IDEsIHNlcGFyYXRvciA9ICIsIn0gKSAiKSIgIj0iCgkJCQlib2R5ICI7IgoJCTsKCgl0ZW1wbGF0ZSBBdHRyaWJ1dGUKCQk6CSJhdHRyaWJ1dGUiIGNvbnRleHQgIjo6IiBuYW1lICI9IgoJCQkJYm9keSAiOyIKCQk7CgoJdGVtcGxhdGUgUGFyYW1ldGVyIGFkZFRvQ29udGV4dAoJCToJbmFtZQoJCTsKCi0tIEBiZWdpbiBOb2RlcwoJdGVtcGxhdGUgTm9kZSBhYnN0cmFjdDsKCgl0ZW1wbGF0ZSBBU01Ob2RlIGNvbnRleHQKCQk6CSJhc20iIGVsZW1lbnQgIm5hbWUiIG5hbWUKLS0gTk8gbW9kZSBvciBndWFyZCBmb3IgQVNNTm9kZXM6Ci0tCQkJKGlzRGVmaW5lZChtb2RlKSA/Ci0tCQkJCSJtb2RlIiBtb2RlCi0tCQkJKQotLQkJCShpc0RlZmluZWQoZ3VhcmQpID8gInwiIGd1YXJkKQoJCQkieyIgWwoJCQkJc3RhdGVtZW50cwoJCQldICJ9IgoJCTsKCgl0ZW1wbGF0ZSBDb2RlTm9kZSBjb250ZXh0CgkJOgkiY29kZSIgZWxlbWVudAoJCQkoaXNEZWZpbmVkKG1vZGUpID8KCQkJCSJtb2RlIiBtb2RlCgkJCSkKCQkJKGlzRGVmaW5lZChndWFyZCkgPyAifCIgZ3VhcmQpCgkJCSJ7IiBbCgkJCQlzdGF0ZW1lbnRzCgkJCV0gIn0iCgkJOwoKCXRlbXBsYXRlIFNpbXBsZU5vZGUgY29udGV4dAoJCToJZWxlbWVudAoJCQkoaXNEZWZpbmVkKG1vZGUpID8KCQkJCSJtb2RlIiBtb2RlCgkJCSkKCQkJKGlzRGVmaW5lZChndWFyZCkgPyAifCIgZ3VhcmQpCgkJCSJ7IiBbCgkJCQlzdGF0ZW1lbnRzCgkJCV0gIn0iCgkJOwotLSBAZW5kIE5vZGVzCgotLSBAYmVnaW4gU3RhdGVtZW50cwoJdGVtcGxhdGUgU3RhdGVtZW50IGFic3RyYWN0OwoKLS0gQGJlZ2luIENvbXBvdW5kU3RhdHMKCXRlbXBsYXRlIENvbXBvdW5kU3RhdChkaXNhbWJpZ3VhdGUgPSAiKFwiaWZcIiBMUEFSRU4gZXhwcmVzc2lvbiBSUEFSRU4gTENVUkxZKSB8IFwiZm9yZWFjaFwiIHwgXCJ2YXJpYWJsZVwiIHwgXCJvcGVyYXRpb25cIiB8IExTUVVBUkUgfCBcImxldFwiIHwgXCJhbmFseXplXCIiKSBhYnN0cmFjdCBjb250ZXh0OwoKCXRlbXBsYXRlIEZvckVhY2hTdGF0IGNvbnRleHQKCQk6CSJmb3JlYWNoIiAiKCIgaXRlcmF0b3IgImluIiBjb2xsZWN0aW9uICIpIiAieyIgWwoJCQkJc3RhdGVtZW50cwoJCQldICJ9IgoJCTsKCgl0ZW1wbGF0ZSBPbmNlU3RhdAoJCToJIlsiIFsKCQkJCXN0YXRlbWVudHMKCQkJXSAiXSIKCQk7CgoJdGVtcGxhdGUgVmFyaWFibGVTdGF0CgkJOgkidmFyaWFibGUiIGRlZmluaXRpb24gIm5hbWVkIiBuYW1lICJ7IiBbCgkJCQlzdGF0ZW1lbnRzCgkJCV0gIn0iCgkJOwoKCXRlbXBsYXRlIE9wZXJhdGlvblN0YXQgY29udGV4dAoJCToJIm9wZXJhdGlvbiIgImNvbnRleHQiIGNvbnRleHQgIm5hbWUiIG5hbWUgInsiIFsKCQkJCXN0YXRlbWVudHMKCQkJXSAifSIKCQk7CgoJdGVtcGxhdGUgQ29uZGl0aW9uYWxTdGF0CgkJOgkiaWYiICIoIiBjb25kaXRpb24gIikiICJ7IiBbCgkJCQlzdGF0ZW1lbnRzCgkJCV0gIn0iCgkJCShpc0RlZmluZWQoZWxzZVN0YXRlbWVudHMpID8KCQkJCSJlbHNlIiAieyIgWwoJCQkJCWVsc2VTdGF0ZW1lbnRzCgkJCQldICJ9IgoJCQkpCgkJOwoKCXRlbXBsYXRlIExldFN0YXQgY29udGV4dAoJCToJImxldCIgdmFyaWFibGUgIj0iIHZhbHVlICJ7IiBbCgkJCQlzdGF0ZW1lbnRzCgkJCV0gIn0iCgkJOwoKCXRlbXBsYXRlIEFuYWx5emVTdGF0CgkJOgkiYW5hbHl6ZSIgdGFyZ2V0CgkJCShpc0RlZmluZWQobW9kZSkgPwoJCQkJIm1vZGUiIG1vZGUKCQkJKQoJCQkoaXNEZWZpbmVkKHN0YXRlbWVudHMpID8KCQkJCSJ7IiBbCgkJCQkJc3RhdGVtZW50cwoJCQkJXSAifSIKCQkJKQoJCTsKLS0gQGVuZCBDb21wb3VuZFN0YXRzCgoJdGVtcGxhdGUgUmVwb3J0U3RhdAoJCToJInJlcG9ydCIgc2V2ZXJpdHkgbWVzc2FnZQoJCTsKCgllbnVtZXJhdGlvblRlbXBsYXRlIFNldmVyaXR5CgkJOgkjY3JpdGljCQk9ICJjcml0aWMiLAoJCQkjZXJyb3IJCT0gImVycm9yIiwKCQkJI3dhcm5pbmcJPSAid2FybmluZyIKCQk7CgoJdGVtcGxhdGUgRmllbGRTdGF0CgkJOgkiZmllbGQiIG5hbWUgIjoiIHR5cGUKCQk7CgoJdGVtcGxhdGUgUGFyYW1TdGF0CgkJOgkicGFyYW0iIG5hbWUgIjoiIHR5cGUKCQk7CgotLSBAYmVnaW4gRW1pdFN0YXRzCgl0ZW1wbGF0ZSBFbWl0U3RhdCBhYnN0cmFjdDsKCgl0ZW1wbGF0ZSBMYWJlbFN0YXQgYWRkVG9Db250ZXh0CgkJOgluYW1lIChpc0RlZmluZWQoaWQpID8gIigiIGlkICIpIikgIjoiCgkJOwoKCXRlbXBsYXRlIE5ld1N0YXQKCQk6CSJuZXciCgkJOwoJCQoJdGVtcGxhdGUgTmV3aW5TdGF0CgkJOgkibmV3aW4iCgkJOwoKCXRlbXBsYXRlIERlbGV0ZVN0YXQKCQk6CSJkZWxldGUiCgkJOwoKCXRlbXBsYXRlIER1cFN0YXQKCQk6CSJkdXAiCgkJOwoKCXRlbXBsYXRlIER1cFgxU3RhdAoJCToJImR1cF94MSIKCQk7CgoJdGVtcGxhdGUgUG9wU3RhdAoJCToJInBvcCIKCQk7CgoJdGVtcGxhdGUgU3dhcFN0YXQKCQk6CSJzd2FwIgoJCTsKCgl0ZW1wbGF0ZSBJdGVyYXRlU3RhdAoJCToJIml0ZXJhdGUiCgkJOwoKCXRlbXBsYXRlIEVuZEl0ZXJhdGVTdGF0CgkJOgkiZW5kaXRlcmF0ZSIKCQk7CgoJdGVtcGxhdGUgR2V0QXNtU3RhdAoJCToJImdldGFzbSIKCQk7CgoJdGVtcGxhdGUgRmluZE1FU3RhdAoJCToJImZpbmRtZSIKCQk7CgoJdGVtcGxhdGUgUHVzaFRTdGF0CgkJOgkicHVzaHQiCgkJOwoKCXRlbXBsYXRlIFB1c2hGU3RhdAoJCToJInB1c2hmIgoJCTsKCi0tIEBiZWdpbiBFbWl0V2l0aE9wZXJhbmRTdGF0cwoJdGVtcGxhdGUgRW1pdFdpdGhPcGVyYW5kU3RhdCBhYnN0cmFjdDsKCgl0ZW1wbGF0ZSBQdXNoU3RhdAoJCToJInB1c2giIG9wZXJhbmQKCQk7CgoJdGVtcGxhdGUgUHVzaElTdGF0CgkJOgkicHVzaGkiIG9wZXJhbmQKCQk7CgoJdGVtcGxhdGUgUHVzaERTdGF0CgkJOgkicHVzaGQiIG9wZXJhbmQKCQk7CgoJdGVtcGxhdGUgTG9hZFN0YXQKCQk6CSJsb2FkIiBvcGVyYW5kCgkJOwoKCXRlbXBsYXRlIFN0b3JlU3RhdAoJCToJInN0b3JlIiBvcGVyYW5kCgkJOwoKCXRlbXBsYXRlIENhbGxTdGF0CgkJOgkiY2FsbCIgb3BlcmFuZAoJCTsKCgl0ZW1wbGF0ZSBQQ2FsbFN0YXQKCQk6CSJwY2FsbCIgb3BlcmFuZAoJCTsKCgl0ZW1wbGF0ZSBTdXBlckNhbGxTdGF0CgkJOgkic3VwZXJjYWxsIiBvcGVyYW5kCgkJOwoKCXRlbXBsYXRlIEdldFN0YXQKCQk6CSJnZXQiIG9wZXJhbmQKCQk7CgoJdGVtcGxhdGUgU2V0U3RhdAoJCToJInNldCIgb3BlcmFuZAoJCTsKLS0gQGVuZCBFbWl0V2l0aE9wZXJhbmRTdGF0cwoKLS0gQGJlZ2luIEVtaXRXaXRoTGFiZWxSZWZTdGF0cwoJdGVtcGxhdGUgRW1pdFdpdGhMYWJlbFJlZlN0YXQgYWJzdHJhY3Q7CgoJdGVtcGxhdGUgR290b1N0YXQKCQk6CSJnb3RvIiBsYWJlbHtyZWZlcnNUbyA9IG5hbWV9CgkJOwoKCXRlbXBsYXRlIElmU3RhdAoJCToJImlmIiBsYWJlbHtyZWZlcnNUbyA9IG5hbWV9CgkJOwotLSBAZW5kIEVtaXRXaXRoTGFiZWxSZWZTdGF0cwotLSBAZW5kIEVtaXRTdGF0cwotLSBAZW5kIFN0YXRlbWVudHMKCgl0ZW1wbGF0ZSBWYXJpYWJsZURlY2wgYWRkVG9Db250ZXh0CgkJOgluYW1lCgkJOwoKLS0gQGJlZ2luIEV4cHJlc3Npb25zCgl0ZW1wbGF0ZSBFeHByZXNzaW9uIGFic3RyYWN0IG9wZXJhdG9yZWQ7CgoJdGVtcGxhdGUgVmFyaWFibGVFeHAKCQk6CXZhcmlhYmxle3JlZmVyc1RvID0gbmFtZX0KCQk7CgoJdGVtcGxhdGUgU2VsZkV4cAoJCToJInNlbGYiCgkJOwoKCXRlbXBsYXRlIExhc3RFeHAKCQk6CSJsYXN0IgoJCTsKCgl0ZW1wbGF0ZSBJZkV4cAoJCToJImlmIiBjb25kaXRpb24gInRoZW4iIHRoZW5FeHAgImVsc2UiIGVsc2VFeHAgImVuZGlmIgoJCTsKCglvcGVyYXRvclRlbXBsYXRlIElzQUV4cChvcGVyYXRvcnMgPSBvcElzYSwgc291cmNlID0gJ3NvdXJjZScpCgkJOgl0eXBlCgkJOwoKCXRlbXBsYXRlIExldEV4cCBjb250ZXh0IG5vblByaW1hcnkKCQk6CSJsZXQiIHZhcmlhYmxlICI9IiB2YWx1ZSAiaW4iIGluCgkJOwoKLS0gQGJlZ2luIFByb3BlcnR5Q2FsbEV4cHMKCW9wZXJhdG9yVGVtcGxhdGUgTmF2aWdhdGlvbkV4cChvcGVyYXRvcnMgPSBvcFBvaW50LCBzb3VyY2UgPSAnc291cmNlJykKCQk6CW5hbWV7YXMgPSBpZGVudGlmaWVyT3JLZXl3b3JkfQoJCTsKCglvcGVyYXRvclRlbXBsYXRlIEl0ZXJhdG9yRXhwKG9wZXJhdG9ycyA9IG9wUmFycm93LCBzb3VyY2UgPSAnc291cmNlJykgY29udGV4dAoJCToJbmFtZXthcyA9IGlkZW50aWZpZXJPcktleXdvcmR9ICIoIiBpdGVyYXRvciAifCIgYm9keSAiKSIKCQk7CgoJb3BlcmF0b3JUZW1wbGF0ZSBPcGVyYXRpb25DYWxsRXhwKG9wZXJhdG9ycyA9IG9wUG9pbnQsIHNvdXJjZSA9ICdzb3VyY2UnKQoJCToJbmFtZSB7YXMgPSBpZGVudGlmaWVyT3JLZXl3b3JkfSAiKCIgYXJndW1lbnRze3NlcGFyYXRvciA9ICIsIn0gIikiCgkJOwoKCW9wZXJhdG9yVGVtcGxhdGUgT3BlcmF0b3JDYWxsRXhwKG9wZXJhdG9ycyA9CgkJCW9wTm90IG9wTWludXMxCgkJCW9wU3RhciBvcFNsYXNoIG9wRGl2IG9wTW9kCgkJCW9wUGx1cyBvcE1pbnVzMgoJCQlvcEVxIG9wR3Qgb3BMdCBvcEdlIG9wTGUgb3BOZQoJCQlvcEFuZCBvcE9yIG9wWG9yIG9wSW1wbGllcywKCQkJc291cmNlID0gJ3NvdXJjZScsIHN0b3JlT3BUbyA9IG5hbWUsIHN0b3JlUmlnaHRUbyA9IGFyZ3VtZW50cyk7Ci0tIEBlbmQgUHJvcGVydHlDYWxsRXhwcwoKLS0gQGJlZ2luIExpdGVyYWxFeHBzCgl0ZW1wbGF0ZSBMaXRlcmFsRXhwIGFic3RyYWN0OwoKCXRlbXBsYXRlIE9jbFVuZGVmaW5lZEV4cAoJCToJIk9jbFVuZGVmaW5lZCIKCQk7CgotLSBAYmVnaW4gQ29sbGVjdGlvbkV4cHMKCXRlbXBsYXRlIENvbGxlY3Rpb25FeHAgYWJzdHJhY3Q7CgoJdGVtcGxhdGUgU2VxdWVuY2VFeHAKCQk6CSJTZXF1ZW5jZSIgInsiIGVsZW1lbnRze3NlcGFyYXRvciA9ICIsIn0gIn0iCgkJOwotLSBAZW5kIENvbGxlY3Rpb25FeHBzCgotLSBAYmVnaW4gUHJpbWl0aXZlIExpdGVyYWxFeHBzCgl0ZW1wbGF0ZSBCb29sZWFuRXhwCgkJOgkodmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKQoJCTsKCgl0ZW1wbGF0ZSBJbnRlZ2VyRXhwCgkJOgl2YWx1ZQoJCTsKCgl0ZW1wbGF0ZSBTdHJpbmdFeHAKCQk6CXZhbHVle2FzID0gc3RyaW5nU3ltYm9sfQoJCTsKLS0gQGVuZCBQcmltaXRpdmUgTGl0ZXJhbEV4cHMKLS0gQGVuZCBMaXRlcmFsRXhwcwotLSBAZW5kIEV4cHJlc3Npb25zCgoJc3ltYm9scyB7CgkJbHNxdWFyZQkJPSAiWyI7CgkJcnNxdWFyZQkJPSAiXSIJOiByaWdodFNwYWNlOwoJCWV4Y2wJCT0gIiEiOwoJCWNvbWEJCT0gIiwiCTogbGVmdE5vbmUsIHJpZ2h0U3BhY2U7CgkJbHBhcmVuCQk9ICIoIjsKCQlycGFyZW4JCT0gIikiCTogbGVmdE5vbmUsIHJpZ2h0U3BhY2U7CgkJbGN1cmx5CQk9ICJ7Igk6IGxlZnRTcGFjZTsKCQlyY3VybHkJCT0gIn0iCTogbGVmdE5vbmUsIHJpZ2h0U3BhY2U7CgkJc2VtaQkJPSAiOyIJOiBsZWZ0Tm9uZSwgcmlnaHRTcGFjZTsKCQljb2xvbgkJPSAiOiIJOiBsZWZ0U3BhY2UsIHJpZ2h0U3BhY2U7CS0tIGV4Y2VwdCBhZnRlciBkZWYgd2hlcmUgaXQgaXMgbGVmdE5vbmUsIHJpZ2h0U3BhY2UKCQlwaXBlCQk9ICJ8Igk6IGxlZnRTcGFjZSwgcmlnaHRTcGFjZTsKCQlzaGFycAkJPSAiIyIJOiBsZWZ0U3BhY2U7CgkJcW1hcmsJCT0gIj8iOwoJCWNvbG9uY29sb24JPSAiOjoiCTogbGVmdE5vbmUsIHJpZ2h0Tm9uZTsKCgkJLS0gb3BlcmF0b3Igc3ltYm9scwoJCXBvaW50CQk9ICIuIgk6IGxlZnROb25lOwoJCXJhcnJvdwkJPSAiLT4iCTogbGVmdE5vbmU7CgkJbWludXMJCT0gIi0iCTogbGVmdFNwYWNlLCByaWdodFNwYWNlOwoJCXN0YXIJCT0gIioiCTogbGVmdFNwYWNlLCByaWdodFNwYWNlOwoJCXNsYXNoCQk9ICIvIgk6IGxlZnRTcGFjZSwgcmlnaHRTcGFjZTsKCQlwbHVzCQk9ICIrIgk6IGxlZnRTcGFjZSwgcmlnaHRTcGFjZTsKCQllcQkJPSAiPSIJOiBsZWZ0U3BhY2UsIHJpZ2h0U3BhY2U7CgkJZ3QJCT0gIj4iCTogbGVmdFNwYWNlLCByaWdodFNwYWNlOwoJCWx0CQk9ICI8Igk6IGxlZnRTcGFjZSwgcmlnaHRTcGFjZTsKCQlnZQkJPSAiPj0iCTogbGVmdFNwYWNlLCByaWdodFNwYWNlOwoJCWxlCQk9ICI8PSIJOiBsZWZ0U3BhY2UsIHJpZ2h0U3BhY2U7CgkJbmUJCT0gIjw+Igk6IGxlZnRTcGFjZSwgcmlnaHRTcGFjZTsKCQlsYXJyb3cJCT0gIjwtIgk6IGxlZnRTcGFjZSwgcmlnaHRTcGFjZTsKCX0KCglvcGVyYXRvcnMgewoJCXByaW9yaXR5IDAgewktLSAwIGlzIGhpZ2hlc3QKCQkJb3BQb2ludCA9IHBvaW50LCAyOwoJCQlvcFJhcnJvdyA9IHJhcnJvdywgMjsKCQl9CgoJCXByaW9yaXR5IDEgewoJCQlvcE5vdCA9ICJub3QiLCAxOwkJLS0gbm8gY29ycmVzcG9uZGluZyBzeW1ib2wgPT4gc3ltYm9sIGlzIHRoZSBrZXl3b3JkIGRlZmluZWQgYnkgdGhlIHF1b3RlZCBzdHJpbmcgKHdoaWNoIGlzIGFsc28gdGhlIG5hbWUpCgkJCW9wTWludXMxID0gbWludXMsIDE7CgkJfQoKCQlwcmlvcml0eSAyIHsKCQkJb3BTdGFyID0gc3RhciwgMjsKCQkJb3BTbGFzaCA9IHNsYXNoLCAyOwoJCQlvcERpdiA9ICJkaXYiLCAyOwoJCQlvcE1vZCA9ICJtb2QiLCAyOwoJCX0KCgkJcHJpb3JpdHkgMyB7CgkJCW9wUGx1cyA9IHBsdXMsIDI7CgkJCW9wTWludXMyID0gbWludXMsIDI7CgkJfQoKCQlwcmlvcml0eSA0IHsKCQkJb3BFcSA9IGVxLCAyOwoJCQlvcEd0ID0gZ3QsIDI7CgkJCW9wTHQgPSBsdCwgMjsKCQkJb3BHZSA9IGdlLCAyOwoJCQlvcExlID0gbGUsIDI7CgkJCW9wTmUgPSBuZSwgMjsKCQkJb3BJc2EgPSAiaXNhIiwgMjsKCQl9CgoJCXByaW9yaXR5IDUgewoJCQlvcEFuZCA9ICJhbmQiLCAyOwoJCQlvcE9yID0gIm9yIiwgMjsKCQkJb3BYb3IgPSAieG9yIiwgMjsKCQkJb3BJbXBsaWVzID0gImltcGxpZXMiLCAyOwoJCX0KCX0KCgl0b2tlbiBDT01NRU5UCTogZW5kT2ZMaW5lKHN0YXJ0ID0gIi0tIik7Cgl0b2tlbiBTVFJJTkcJOiBtdWx0aUxpbmUoc3RhcnQgPSAiXCciLCBlbmQgPSAiXCciLCBlc2MgPSAiXFwiKTsKCglsZXhlciA9ICIKTkwKCToJKAknXFxyJyAnXFxuJwoJCXwJJ1xcbicgJ1xccicJLy9JbXByb2JhYmxlCgkJfAknXFxyJwoJCXwJJ1xcbicKCQkpCgl7bmV3bGluZSgpO30KCTsKCldTCgk6CSgJJyAnCgkJfAknXFx0JwoJCSkKCTsKCiVwcm90ZWN0ZWQKRElHSVQKCToJJzAnLi4nOScKCTsKCiVwcm90ZWN0ZWQKQUxQSEEKCToJJ2EnLi4neicKCXwJJ0EnLi4nWicKCXwJJ18nCgkvL0ZvciBVbmljb2RlIGNvbXBhdGliaWxpdHkgKGZyb20gMDAwMCB0byAwMGZmKQoJfAknXFx1MDBDMCcgLi4gJ1xcdTAwRDYnCgl8CSdcXHUwMEQ4JyAuLiAnXFx1MDBGNicKCXwJJ1xcdTAwRjgnIC4uICdcXHUwMEZGJwoJOwoKJXByb3RlY3RlZApTTkFNRQoldjIJb3B0aW9ucyB7CiV2MgkJdGVzdExpdGVyYWxzID0gdHJ1ZTsKJXYyCX0KCToJKEFMUEhBKSAoQUxQSEEgfCBESUdJVCkqCjsKCk5BTUUKCToJKAoldjMJCQlTTkFNRQoldjIJCQlzOlNOQU1FIHtpZihzLmdldFR5cGUoKSAhPSBTTkFNRSkgJHNldFR5cGUocy5nZXRUeXBlKCkpO30KCQl8CSdcIichCgkJCSgJRVNDCgkJCXwJJ1xcbicge25ld2xpbmUoKTt9CgkJCXwJfignXFxcXCd8J1xcXCInfCdcXG4nKQoJCQkpKgoJCQknXCInIQoldjMJCQl7c2V0VGV4dChlaS51bmVzY2FwZVN0cmluZyhnZXRUZXh0KCksIDEpKTt9CgkJKQoJOwoKSU5UCgk6CShESUdJVCkrCiV2MgkJKCgnLicgRElHSVQpPT4gJy4nIChESUdJVCkrIHskc2V0VHlwZShGTE9BVCk7fSk/Cgk7CgoldjMJRkxPQVQJOglESUdJVCsgJy4nIERJR0lUKgk7CgolcHJvdGVjdGVkCkVTQwoJOgknXFxcXCchCgkJKAknbicgJXYyeyVzZXRUZXh0KFwiXFxuXCIpO30KCQl8CSdyJyAldjJ7JXNldFRleHQoXCJcXHJcIik7fQoJCXwJJ3QnICV2Mnslc2V0VGV4dChcIlxcdFwiKTt9CgkJfAknYicgJXYyeyVzZXRUZXh0KFwiXFxiXCIpO30KCQl8CSdmJyAldjJ7JXNldFRleHQoXCJcXGZcIik7fQoJCXwJJ1wiJyAldjJ7JXNldFRleHQoXCJcXFwiXCIpO30KCQl8CSdcXCcnICV2Mnslc2V0VGV4dChcIlxcJ1wiKTt9CgkJfAknXFxcXCcgJXYyeyVzZXRUZXh0KFwiXFxcXFwiKTt9CgkJfAkoCgkJCQkoJzAnLi4nMycpCgkJCQkoCiV2MgkJCQkJb3B0aW9ucyB7CiV2MgkJCQkJCXdhcm5XaGVuRm9sbG93QW1iaWcgPSBmYWxzZTsKJXYyCQkJCQl9CgkJCQk6CSgnMCcuLic3JykKCQkJCQkoCiV2MgkJCQkJCW9wdGlvbnMgewoldjIJCQkJCQkJd2FybldoZW5Gb2xsb3dBbWJpZyA9IGZhbHNlOwoldjIJCQkJCQl9CgkJCQkJOgknMCcuLic3JwoJCQkJCSk/CgkJCQkpPwoJCQl8CSgnNCcuLic3JykKCQkJCSgKJXYyCQkJCQlvcHRpb25zIHsKJXYyCQkJCQkJd2FybldoZW5Gb2xsb3dBbWJpZyA9IGZhbHNlOwoldjIJCQkJCX0KCQkJCToJKCcwJy4uJzcnKQoJCQkJKT8KCQkJKQoJCQkJewoldjIJCQkJCVN0cmluZyBzID0gJWdldFRleHQ7CiV2MgkJCQkJaW50IGk7CiV2MgkJCQkJaW50IHJldCA9IDA7CiV2MgkJCQkJU3RyaW5nIGFuczsKJXYyCQkJCQlmb3IgKGk9MDsgaTxzLmxlbmd0aCgpOyArK2kpCiV2MgkJCQkJCXJldCA9IHJldCo4ICsgcy5jaGFyQXQoaSkgLSAnMCc7CiV2MgkJCQkJYW5zID0gU3RyaW5nLnZhbHVlT2YoKGNoYXIpIHJldCk7CiV2MgkJCQkJJXNldFRleHQoYW5zKTsKCQkJCX0KCQkpCgk7CgkiOwoKfQo=