ZGlmZiAtLWdpdCBhL1Rvb2xzL2kxOG4vcHlnZXR0ZXh0LnB5IGIvVG9vbHMvaTE4bi9weWdldHRleHQucHkKaW5kZXggZmNkNmI5NS4uNGZmNDk2MiAxMDA3NTUKLS0tIGEvVG9vbHMvaTE4bi9weWdldHRleHQucHkKKysrIGIvVG9vbHMvaTE4bi9weWdldHRleHQucHkKQEAgLTEsNSArMSw4IEBACiAjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCiAjIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBCYXJyeSBXYXJzYXcgPGJ3YXJzYXdAcHl0aG9uLm9yZz4KKyMKKyMgbWluaW1hbGx5IHBhdGNoZWQgdG8gbWFrZSBpdCBldmVuIG1vcmUgeGdldHRleHQgY29tcGF0aWJsZSAKKyMgYnkgUGV0ZXIgRnVuayA8cGZAYXJ0Y29tLWdtYmguZGU+CiAKICIiInB5Z2V0dGV4dCAtLSBQeXRob24gZXF1aXZhbGVudCBvZiB4Z2V0dGV4dCgxKQogCkBAIC0zNSw3ICszOCw4IEBACiAgWzJdIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nZXR0ZXh0L2dldHRleHQuaHRtbAogCiBOT1RFOiBweWdldHRleHQgYXR0ZW1wdHMgdG8gYmUgb3B0aW9uIGFuZCBmZWF0dXJlIGNvbXBhdGlibGUgd2l0aCBHTlUgeGdldHRleHQKLXdoZXJlIGV2ZXIgcG9zc2libGUuCit3aGVyZSBldmVyIHBvc3NpYmxlLiAgSG93ZXZlciBzb21lIG9wdGlvbnMgYXJlIHN0aWxsIG1pc3Npbmcgb3IgYXJlIG5vdCBmdWxseQoraW1wbGVtZW50ZWQuCiAKIFVzYWdlOiBweWdldHRleHQgW29wdGlvbnNdIGZpbGVuYW1lIC4uLgogCkBAIC00NSw5ICs0OSwxNyBAQAogICAgIC0tZXh0cmFjdC1hbGwKICAgICAgICAgRXh0cmFjdCBhbGwgc3RyaW5ncwogCi0gICAgLWQgZGVmYXVsdC1kb21haW4KLSAgICAtLWRlZmF1bHQtZG9tYWluPWRlZmF1bHQtZG9tYWluCi0gICAgICAgIFJlbmFtZSB0aGUgZGVmYXVsdCBvdXRwdXQgZmlsZSBmcm9tIG1lc3NhZ2VzLnBvdCB0byBkZWZhdWx0LWRvbWFpbi5wb3QgCisgICAgLWQgbmFtZQorICAgIC0tZGVmYXVsdC1kb21haW49bmFtZQorICAgICAgICBSZW5hbWUgdGhlIGRlZmF1bHQgb3V0cHV0IGZpbGUgZnJvbSBtZXNzYWdlcy5wb3QgdG8gbmFtZS5wb3QgCisKKyAgICAtRQorICAgIC0tZXNjYXBlCisgICAgICAgIHJlcGxhY2Ugbm9uLUFTQ0lJIGNoYXJhY3RlcnMgd2l0aCBvY3RhbCBlc2NhcGUgc2VxdWVuY2VzLgorCisgICAgLWgKKyAgICAtLWhlbHAKKyAgICAgICAgcHJpbnQgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKIAogICAgIC1rIFt3b3JkXQogICAgIC0ta2V5d29yZFs9d29yZF0KQEAgLTczLDEzICs4NSwzMSBAQAogICAgICAgICBJZiBzdHlsZSBpcyBvbWl0dGVkLCBHbnUgaXMgdXNlZC4gIFRoZSBzdHlsZSBuYW1lIGlzIGNhc2UKICAgICAgICAgaW5zZW5zaXRpdmUuICBCeSBkZWZhdWx0LCBsb2NhdGlvbnMgYXJlIGluY2x1ZGVkLgogCisgICAgLW8gZmlsZW5hbWUKKyAgICAtLW91dHB1dD1maWxlbmFtZQorICAgICAgICBSZW5hbWUgdGhlIGRlZmF1bHQgb3V0cHV0IGZpbGUgZnJvbSBtZXNzYWdlcy5wb3QgdG8gZmlsZW5hbWUuCisKKyAgICAtcCBkaXIKKyAgICAtLW91dHB1dC1kaXI9ZGlyCisgICAgICAgIE91dHB1dCBmaWxlcyB3aWxsIGJlIHBsYWNlZCBpbiBkaXJlY3RvcnkgZGlyLgorCiAgICAgLXYKICAgICAtLXZlcmJvc2UKICAgICAgICAgUHJpbnQgdGhlIG5hbWVzIG9mIHRoZSBmaWxlcyBiZWluZyBwcm9jZXNzZWQuCiAKLSAgICAtLWhlbHAKLSAgICAtaAotICAgICAgICBwcmludCB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgIC1WCisgICAgLS12ZXJzaW9uCisgICAgICAgIFByaW50IHRoZSB2ZXJzaW9uIG9mIHB5Z2V0dGV4dCBhbmQgZXhpdC4KKworICAgIC13IGNvbHVtbnMKKyAgICAtLXdpZHRoPWNvbHVtbnMKKyAgICAgICAgU2V0IHdpZHRoIG9mIG91dHB1dCB0byBjb2x1bW5zLgorCisgICAgLXggZmlsZW5hbWUKKyAgICAtLWV4Y2x1ZGUtZmlsZT1maWxlbmFtZQorICAgICAgICBTcGVjaWZ5IGEgZmlsZSB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZiBzdHJpbmdzIHRoYXQgYXJlIG5vdCBiZQorICAgICAgICBleHRyYWN0ZWQgZnJvbSB0aGUgaW5wdXQgZmlsZXMuICBFYWNoIHN0cmluZyB0byBiZSBleGNsdWRlZCBtdXN0CisgICAgICAgIGFwcGVhciBvbiBhIGxpbmUgYnkgaXRzZWxmIGluIHRoZSBmaWxlLgogCiAiIiIKIApAQCAtOTAsMTIgKzEyMCwxNiBAQAogaW1wb3J0IGdldG9wdAogaW1wb3J0IHRva2VuaXplCiAKLV9fdmVyc2lvbl9fID0gJzAuMicKK19fdmVyc2lvbl9fID0gJzEuMCcKIAogCiAMCiAjIGZvciBzZWxmdGVzdGluZwotZGVmIF8ocyk6IHJldHVybiBzCit0cnk6CisgICAgaW1wb3J0IGZpbnRsCisgICAgXyA9IGZpbnRsLmdldHRleHQKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBkZWYgXyhzKTogcmV0dXJuIHMKIAogCiAjIFRoZSBub3JtYWwgcG90LWZpbGUgaGVhZGVyLiBtc2dtZXJnZSBhbmQgRU1BQ1MnIHBvLW1vZGUgd29yayBiZXR0ZXIgaWYKQEAgLTEyNSwyMSArMTU5LDMxIEBACiAgICAgICAgIHByaW50IG1zZwogICAgIHN5cy5leGl0KGNvZGUpCiAKKwogDAogZXNjYXBlcyA9IFtdCi1mb3IgaSBpbiByYW5nZSgyNTYpOgotICAgIGlmIGkgPCAzMiBvciBpID4gMTI3OgotICAgICAgICBlc2NhcGVzLmFwcGVuZCgiXFwlMDNvIiAlIGkpCi0gICAgZWxzZToKLSAgICAgICAgZXNjYXBlcy5hcHBlbmQoY2hyKGkpKQogCi1lc2NhcGVzW29yZCgnXFwnKV0gPSAnXFxcXCcKLWVzY2FwZXNbb3JkKCdcdCcpXSA9ICdcXHQnCi1lc2NhcGVzW29yZCgnXHInKV0gPSAnXFxyJwotZXNjYXBlc1tvcmQoJ1xuJyldID0gJ1xcbicKLWVzY2FwZXNbb3JkKCdcIicpXSA9ICdcXCInCitkZWYgbWFrZV9lc2NhcGVzKHBhc3NfaXNvODg1OSk6CisgICAgZ2xvYmFsIGVzY2FwZXMKKyAgICBmb3IgaSBpbiByYW5nZSgyNTYpOgorICAgICAgICBpZiBwYXNzX2lzbzg4NTk6CisgICAgICAgICAgICAjIEFsbG93IGlzby04ODU5IGNoYXJhY3RlcnMgdG8gcGFzcyB0aHJvdWdoIHNvIHRoYXQgZS5nLiAnbXNnaWQKKyAgICAgICAgICAgICMgIkj2aGUiJyB3b3VsZCByZXN1bHQgbm90IHJlc3VsdCBpbiAnbXNnaWQgIkhcMzY2aGUiJy4gIE90aGVyd2lzZQorICAgICAgICAgICAgIyB3ZSBlc2NhcGUgYW55IGNoYXJhY3RlciBvdXRzaWRlIHRoZSAzMi4uMTI2IHJhbmdlLgorICAgICAgICAgICAgaSA9IGkgJSAxMjgKKyAgICAgICAgaWYgMzIgPD0gaSA8PSAxMjY6CisgICAgICAgICAgICBlc2NhcGVzLmFwcGVuZChjaHIoaSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlc2NhcGVzLmFwcGVuZCgiXFwlMDNvIiAlIGkpCisgICAgZXNjYXBlc1tvcmQoJ1xcJyldID0gJ1xcXFwnCisgICAgZXNjYXBlc1tvcmQoJ1x0JyldID0gJ1xcdCcKKyAgICBlc2NhcGVzW29yZCgnXHInKV0gPSAnXFxyJworICAgIGVzY2FwZXNbb3JkKCdcbicpXSA9ICdcXG4nCisgICAgZXNjYXBlc1tvcmQoJ1wiJyldID0gJ1xcIicKKwogCiBkZWYgZXNjYXBlKHMpOgorICAgIGdsb2JhbCBlc2NhcGVzCiAgICAgcyA9IGxpc3QocykKICAgICBmb3IgaSBpbiByYW5nZShsZW4ocykpOgogICAgICAgICBzW2ldID0gZXNjYXBlc1tvcmQoc1tpXSldCkBAIC0yMDAsMTIgKzI0NCwxMyBAQAogICAgICAgICAgICAgIyB3ZXJlIG5vIHN0cmluZ3MgaW5zaWRlIF8oKSwgdGhlbiBqdXN0IGlnbm9yZSB0aGlzIGVudHJ5LgogICAgICAgICAgICAgaWYgc2VsZi5fX2RhdGE6CiAgICAgICAgICAgICAgICAgbXNnID0gc3RyaW5nLmpvaW4oc2VsZi5fX2RhdGEsICcnKQotICAgICAgICAgICAgICAgIGVudHJ5ID0gKHNlbGYuX19jdXJmaWxlLCBzZWxmLl9fbGluZW5vKQotICAgICAgICAgICAgICAgIGxpbmVub3MgPSBzZWxmLl9fbWVzc2FnZXMuZ2V0KG1zZykKLSAgICAgICAgICAgICAgICBpZiBsaW5lbm9zIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuX19tZXNzYWdlc1ttc2ddID0gW2VudHJ5XQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVub3MuYXBwZW5kKGVudHJ5KQorICAgICAgICAgICAgICAgIGlmIG5vdCBtc2cgaW4gc2VsZi5fX29wdGlvbnMudG9leGNsdWRlOgorICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IChzZWxmLl9fY3VyZmlsZSwgc2VsZi5fX2xpbmVubykKKyAgICAgICAgICAgICAgICAgICAgbGluZW5vcyA9IHNlbGYuX19tZXNzYWdlcy5nZXQobXNnKQorICAgICAgICAgICAgICAgICAgICBpZiBsaW5lbm9zIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fbWVzc2FnZXNbbXNnXSA9IFtlbnRyeV0KKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVub3MuYXBwZW5kKGVudHJ5KQogICAgICAgICAgICAgc2VsZi5fX3N0YXRlID0gc2VsZi5fX3dhaXRpbmcKICAgICAgICAgZWxpZiB0dHlwZSA9PSB0b2tlbml6ZS5TVFJJTkc6CiAgICAgICAgICAgICBzZWxmLl9fZGF0YS5hcHBlbmQoc2FmZV9ldmFsKHRzdHJpbmcpKQpAQCAtMjIyLDIwICsyNjcsMzAgQEAKICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBmcAogICAgICAgICAgICAgIyBUaGUgdGltZSBzdGFtcCBpbiB0aGUgaGVhZGVyIGRvZXNuJ3QgaGF2ZSB0aGUgc2FtZSBmb3JtYXQKICAgICAgICAgICAgICMgYXMgdGhhdCBnZW5lcmF0ZWQgYnkgeGdldHRleHQuLi4KLSAgICAgICAgICAgIHByaW50IHBvdF9oZWFkZXIgJSB7J3RpbWUnOiB0aW1lc3RhbXAsICd2ZXJzaW9uJzpfX3ZlcnNpb25fX30KKyAgICAgICAgICAgIHByaW50IHBvdF9oZWFkZXIgJSB7J3RpbWUnOiB0aW1lc3RhbXAsICd2ZXJzaW9uJzogX192ZXJzaW9uX199CiAgICAgICAgICAgICBmb3IgaywgdiBpbiBzZWxmLl9fbWVzc2FnZXMuaXRlbXMoKToKLSAgICAgICAgICAgICAgICBmb3IgZmlsZW5hbWUsIGxpbmVubyBpbiB2OgotICAgICAgICAgICAgICAgICAgICAjIGxvY2F0aW9uIGNvbW1lbnRzIGFyZSBkaWZmZXJlbnQgYi93IFNvbGFyaXMgYW5kIEdOVQotICAgICAgICAgICAgICAgICAgICBkID0geydmaWxlbmFtZSc6IGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5lbm8nOiBsaW5lbm99Ci0gICAgICAgICAgICAgICAgICAgIGlmIG9wdGlvbnMubG9jYXRpb24gPT0gb3B0aW9ucy5TT0xBUklTOgorICAgICAgICAgICAgICAgICMgbG9jYXRpb24gY29tbWVudHMgYXJlIGRpZmZlcmVudCBiL3cgU29sYXJpcyBhbmQgR05VOgorICAgICAgICAgICAgICAgIGlmIG9wdGlvbnMubG9jYXRpb24gPT0gb3B0aW9ucy5TT0xBUklTOgorICAgICAgICAgICAgICAgICAgICBmb3IgZmlsZW5hbWUsIGxpbmVubyBpbiB2OgorICAgICAgICAgICAgICAgICAgICAgICAgZCA9IHsnZmlsZW5hbWUnOiBmaWxlbmFtZSwgJ2xpbmVubyc6IGxpbmVub30KICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IF8oJyMgRmlsZTogJShmaWxlbmFtZSlzLCBsaW5lOiAlKGxpbmVubylkJykgJSBkCi0gICAgICAgICAgICAgICAgICAgIGVsaWYgb3B0aW9ucy5sb2NhdGlvbiA9PSBvcHRpb25zLkdOVToKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IF8oJyM6ICUoZmlsZW5hbWUpczolKGxpbmVubylkJykgJSBkCisgICAgICAgICAgICAgICAgZWxpZiBvcHRpb25zLmxvY2F0aW9uID09IG9wdGlvbnMuR05VOgorICAgICAgICAgICAgICAgICAgICAjIGZpdCBhcyBtYW55IGxvY2F0aW9ucyBvbiBvbmUgbGluZSwgYXMgbG9uZyBhcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgIyByZXN1bHRpbmcgbGluZSBsZW5ndGggZG9lc24ndCBleGNlZWRzICdvcHRpb25zLndpZHRoJworICAgICAgICAgICAgICAgICAgICBsb2NsaW5lID0gJyM6JworICAgICAgICAgICAgICAgICAgICBmb3IgZmlsZW5hbWUsIGxpbmVubyBpbiB2OgorICAgICAgICAgICAgICAgICAgICAgICAgZCA9IHsnZmlsZW5hbWUnOiBmaWxlbmFtZSwgJ2xpbmVubyc6IGxpbmVub30KKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBfKCcgJShmaWxlbmFtZSlzOiUobGluZW5vKWQnKSAlIGQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxlbihsb2NsaW5lKSArIGxlbihzKSA8PSBvcHRpb25zLndpZHRoOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2xpbmUgPSBsb2NsaW5lICsgcworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCBsb2NsaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jbGluZSA9ICIjOiIgKyBzCisgICAgICAgICAgICAgICAgICAgIGlmIGxlbihsb2NsaW5lKSA+IDI6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCBsb2NsaW5lCiAgICAgICAgICAgICAgICAgIyBUQkQ6IHNvcnRpbmcsIG5vcm1hbGl6aW5nCiAgICAgICAgICAgICAgICAgcHJpbnQgJ21zZ2lkJywgbm9ybWFsaXplKGspCi0gICAgICAgICAgICAgICAgcHJpbnQgJ21zZ3N0ciAiIicKLSAgICAgICAgICAgICAgICBwcmludAorICAgICAgICAgICAgICAgIHByaW50ICdtc2dzdHIgIiJcbicKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzeXMuX19zdGRvdXRfXwogCkBAIC0yNDUsOSArMzAwLDExIEBACiAgICAgdHJ5OgogICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdCgKICAgICAgICAgICAgIHN5cy5hcmd2WzE6XSwKLSAgICAgICAgICAgICdrOmQ6bjpodicsCi0gICAgICAgICAgICBbJ2tleXdvcmQnLCAnZGVmYXVsdC1kb21haW4nLCAnaGVscCcsCi0gICAgICAgICAgICAgJ2FkZC1sb2NhdGlvbj0nLCAnbm8tbG9jYXRpb24nLCAndmVyYm9zZSddKQorICAgICAgICAgICAgJ2FkOkVoazpuOm86cDpWdnc6eDonLAorICAgICAgICAgICAgWydleHRyYWN0LWFsbCcsICdkZWZhdWx0LWRvbWFpbicsICdlc2NhcGUnLCAnaGVscCcsICdrZXl3b3JkJywKKyAgICAgICAgICAgICAnYWRkLWxvY2F0aW9uJywgJ25vLWxvY2F0aW9uJywgJ291dHB1dD0nLCAnb3V0cHV0LWRpcj0nLAorICAgICAgICAgICAgICd2ZXJib3NlJywgJ3ZlcnNpb24nLCAnd2lkdGg9JywgJ2V4Y2x1ZGUtZmlsZT0nLAorICAgICAgICAgICAgIF0pCiAgICAgZXhjZXB0IGdldG9wdC5lcnJvciwgbXNnOgogICAgICAgICB1c2FnZSgxLCBtc2cpCiAKQEAgLTI1NywxMCArMzE0LDE1IEBACiAgICAgICAgIEdOVSA9IDEKICAgICAgICAgU09MQVJJUyA9IDIKICAgICAgICAgIyBkZWZhdWx0cworICAgICAgICBleHRyYWN0YWxsID0gMCAjIEZJWE1FOiBjdXJyZW50bHkgdGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBhdCBhbGwuCisgICAgICAgIGVzY2FwZSA9IDAKICAgICAgICAga2V5d29yZHMgPSBbXQorICAgICAgICBvdXRwYXRoID0gJycKICAgICAgICAgb3V0ZmlsZSA9ICdtZXNzYWdlcy5wb3QnCiAgICAgICAgIGxvY2F0aW9uID0gR05VCiAgICAgICAgIHZlcmJvc2UgPSAwCisgICAgICAgIHdpZHRoID0gNzgKKyAgICAgICAgZXhjbHVkZWZpbGVuYW1lID0gJycKIAogICAgIG9wdGlvbnMgPSBPcHRpb25zKCkKICAgICBsb2NhdGlvbnMgPSB7J2dudScgOiBvcHRpb25zLkdOVSwKQEAgLTI3MSwxMiArMzMzLDE2IEBACiAgICAgZm9yIG9wdCwgYXJnIGluIG9wdHM6CiAgICAgICAgIGlmIG9wdCBpbiAoJy1oJywgJy0taGVscCcpOgogICAgICAgICAgICAgdXNhZ2UoMCkKKyAgICAgICAgZWxpZiBvcHQgaW4gKCctYScsICctLWV4dHJhY3QtYWxsJyk6CisgICAgICAgICAgICBvcHRpb25zLmV4dHJhY3RhbGwgPSAxCisgICAgICAgIGVsaWYgb3B0IGluICgnLWQnLCAnLS1kZWZhdWx0LWRvbWFpbicpOgorICAgICAgICAgICAgb3B0aW9ucy5vdXRmaWxlID0gYXJnICsgJy5wb3QnCisgICAgICAgIGVsaWYgb3B0IGluICgnLUUnLCAnLS1lc2NhcGUnKToKKyAgICAgICAgICAgIG9wdGlvbnMuZXNjYXBlID0gMQogICAgICAgICBlbGlmIG9wdCBpbiAoJy1rJywgJy0ta2V5d29yZCcpOgogICAgICAgICAgICAgaWYgYXJnIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgZGVmYXVsdF9rZXl3b3JkcyA9IFtdCiAgICAgICAgICAgICBvcHRpb25zLmtleXdvcmRzLmFwcGVuZChhcmcpCi0gICAgICAgIGVsaWYgb3B0IGluICgnLWQnLCAnLS1kZWZhdWx0LWRvbWFpbicpOgotICAgICAgICAgICAgb3B0aW9ucy5vdXRmaWxlID0gYXJnICsgJy5wb3QnCiAgICAgICAgIGVsaWYgb3B0IGluICgnLW4nLCAnLS1hZGQtbG9jYXRpb24nKToKICAgICAgICAgICAgIGlmIGFyZyBpcyBOb25lOgogICAgICAgICAgICAgICAgIGFyZyA9ICdnbnUnCkBAIC0yODcsMTIgKzM1Myw0NCBAQAogICAgICAgICAgICAgICAgIHVzYWdlKDEsIF8oJ0ludmFsaWQgdmFsdWUgZm9yIC0tYWRkLWxvY2F0aW9uOiAlKGFyZylzJykgJSBkKQogICAgICAgICBlbGlmIG9wdCBpbiAoJy0tbm8tbG9jYXRpb24nLCk6CiAgICAgICAgICAgICBvcHRpb25zLmxvY2F0aW9uID0gMAorICAgICAgICBlbGlmIG9wdCBpbiAoJy1vJywgJy0tb3V0cHV0Jyk6CisgICAgICAgICAgICBvcHRpb25zLm91dGZpbGUgPSBhcmcKKyAgICAgICAgZWxpZiBvcHQgaW4gKCctcCcsICctLW91dHB1dC1kaXInKToKKyAgICAgICAgICAgIG9wdGlvbnMub3V0cGF0aCA9IGFyZwogICAgICAgICBlbGlmIG9wdCBpbiAoJy12JywgJy0tdmVyYm9zZScpOgogICAgICAgICAgICAgb3B0aW9ucy52ZXJib3NlID0gMQorICAgICAgICBlbGlmIG9wdCBpbiAoJy1WJywgJy0tdmVyc2lvbicpOgorICAgICAgICAgICAgcHJpbnQgXygncHlnZXR0ZXh0LnB5ICh4Z2V0dGV4dCBmb3IgUHl0aG9uKSAlcycpICUgX192ZXJzaW9uX18KKyAgICAgICAgICAgIHN5cy5leGl0KDApCisgICAgICAgIGVsaWYgb3B0IGluICgnLXcnLCAnLS13aWR0aCcpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9wdGlvbnMud2lkdGggPSBpbnQoYXJnKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgZCA9IHsnYXJnJzphcmd9CisgICAgICAgICAgICAgICAgdXNhZ2UoMSwgXygnSW52YWxpZCB2YWx1ZSBmb3IgLS13aWR0aDogJShhcmcpcywgbXVzdCBiZSBpbnQnKQorICAgICAgICAgICAgICAgICAgICAgICUgZCkKKyAgICAgICAgZWxpZiBvcHQgaW4gKCcteCcsICctLWV4Y2x1ZGUtZmlsZScpOgorICAgICAgICAgICAgb3B0aW9ucy5leGNsdWRlZmlsZW5hbWUgPSBhcmcKKworICAgICMgY2FsY3VsYXRlIGVzY2FwZXMKKyAgICBtYWtlX2VzY2FwZXMob3B0aW9ucy5lc2NhcGVzKQogCiAgICAgIyBjYWxjdWxhdGUgYWxsIGtleXdvcmRzCiAgICAgb3B0aW9ucy5rZXl3b3Jkcy5leHRlbmQoZGVmYXVsdF9rZXl3b3JkcykKIAorICAgICMgaW5pdGlhbGl6ZSBsaXN0IG9mIHN0cmluZ3MgdG8gZXhjbHVkZQorICAgIGlmIG9wdGlvbnMuZXhjbHVkZWZpbGVuYW1lOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcCA9IG9wZW4ob3B0aW9ucy5leGNsdWRlZmlsZW5hbWUpCisgICAgICAgICAgICBvcHRpb25zLnRvZXhjbHVkZSA9IGZwLnJlYWRsaW5lcygpCisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZShfKCJDYW4ndCByZWFkIC0tZXhjbHVkZS1maWxlOiAlcyIpICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5leGNsdWRlZmlsZW5hbWUpCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgIGVsc2U6CisgICAgICAgIG9wdGlvbnMudG9leGNsdWRlID0gW10KKwogICAgICMgc2x1cnAgdGhyb3VnaCBhbGwgdGhlIGZpbGVzCiAgICAgZWF0ZXIgPSBUb2tlbkVhdGVyKG9wdGlvbnMpCiAgICAgZm9yIGZpbGVuYW1lIGluIGFyZ3M6CkBAIC0zMDMsNiArNDAxLDggQEAKICAgICAgICAgdG9rZW5pemUudG9rZW5pemUoZnAucmVhZGxpbmUsIGVhdGVyKQogICAgICAgICBmcC5jbG9zZSgpCiAKKyAgICBpZiBvcHRpb25zLm91dHBhdGg6CisgICAgICAgIG9wdGlvbnMub3V0ZmlsZSA9IG9zLnBhdGguam9pbihvcHRpb25zLm91dHBhdGgsIG9wdGlvbnMub3V0ZmlsZSkKICAgICBmcCA9IG9wZW4ob3B0aW9ucy5vdXRmaWxlLCAndycpCiAgICAgZWF0ZXIud3JpdGUoZnApCiAgICAgZnAuY2xvc2UoKQo=