ZGlmZiAtLWdpdCBhL01hYy9MaWIvdG9vbGJveC9BcHBsZVNjcmlwdF9TdWl0ZS5weSBiL01hYy9MaWIvdG9vbGJveC9BcHBsZVNjcmlwdF9TdWl0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2VhMGNjCi0tLSAvZGV2L251bGwKKysrIGIvTWFjL0xpYi90b29sYm94L0FwcGxlU2NyaXB0X1N1aXRlLnB5CkBAIC0wLDAgKzEsMTUwMiBAQAorIiIiU3VpdGUgQXBwbGVTY3JpcHQgU3VpdGU6IEdvb2RpZXMgZm9yIEd1c3RhdgorTGV2ZWwgMSwgdmVyc2lvbiAxCisKK0dlbmVyYXRlZCBmcm9tIE1vZXM6U3lzdGVtIGZvbGRlcjpFeHRlbnNpb25zOlNjcmlwdGluZyBBZGRpdGlvbnM6RGlhbGVjdHM6RW5nbGlzaCBEaWFsZWN0CitBRVRFL0FFVVQgcmVzb3VyY2UgdmVyc2lvbiAxLzAsIGxhbmd1YWdlIDAsIHNjcmlwdCAwCisiIiIKKworaW1wb3J0IGFkZHBhY2sKK2FkZHBhY2suYWRkcGFjaygnVG9vbHMnKQorYWRkcGFjay5hZGRwYWNrKCdiZ2VuJykKK2FkZHBhY2suYWRkcGFjaygnYWUnKQorCitpbXBvcnQgYWV0b29scworaW1wb3J0IE1hY09TCisKK19jb2RlID0gJ2FzY3InCisKK19FbnVtX2NvbnMgPSB7CisJJ2Nhc2UnIDogJ2Nhc2UnLAkjIGNhc2UKKwknZGlhY3JpdGljYWxzJyA6ICdkaWFjJywJIyBkaWFjcml0aWNhbHMKKwknd2hpdGVfc3BhY2UnIDogJ3doaXQnLAkjIHdoaXRlIHNwYWNlCisJJ2h5cGhlbnMnIDogJ2h5cGgnLAkjIGh5cGhlbnMKKwknZXhwYW5zaW9uJyA6ICdleHBhJywJIyBleHBhbnNpb24KKwkncHVuY3R1YXRpb24nIDogJ3B1bmMnLAkjIHB1bmN0dWF0aW9uCisJJ2FwcGxpY2F0aW9uX3Jlc3BvbnNlcycgOiAncm10ZScsCSMgcmVtb3RlIGV2ZW50IHJlcGxpZXMKK30KKworX0VudW1fYm9vdiA9IHsKKwkndHJ1ZScgOiAndHJ1ZScsCSMgdGhlIHRydWUgYm9vbGVhbiB2YWx1ZQorCSdmYWxzZScgOiAnZmFscycsCSMgdGhlIGZhbHNlIGJvb2xlYW4gdmFsdWUKK30KKworX0VudW1fbWlzYyA9IHsKKwknY3VycmVudF9hcHBsaWNhdGlvbicgOiAnY3VyYScsCSMgdGhlIGN1cnJlbnQgYXBwbGljYXRpb24KK30KKworY2xhc3MgQXBwbGVTY3JpcHRfU3VpdGU6CisKKwlkZWYgYWN0aXZhdGUoc2VsZiwgKmFyZ3VtZW50cyk6CisJCSIiImFjdGl2YXRlOiBCcmluZyB0YXJnZXRlZCBhcHBsaWNhdGlvbiBwcm9ncmFtIHRvIHRoZSBmcm9udC4KKwkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorCQkiIiIKKwkJX2NvZGUgPSAnbWlzYycKKwkJX3N1YmNvZGUgPSAnYWN0dicKKworCQlpZiBsZW4oYXJndW1lbnRzKSA+IDE6CisJCQlyYWlzZSBUeXBlRXJyb3IsICdUb28gbWFueSBhcmd1bWVudHMnCisJCWlmIGFyZ3VtZW50czoKKwkJCWFyZ3VtZW50cyA9IGFyZ3VtZW50c1swXQorCQkJaWYgdHlwZShhcmd1bWVudHMpIDw+IHR5cGUoe30pOgorCQkJCXJhaXNlIFR5cGVFcnJvciwgJ011c3QgYmUgYSBtYXBwaW5nJworCQllbHNlOgorCQkJYXJndW1lbnRzID0ge30KKworCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnX2F0dHJpYnV0ZXMnKToKKwkJCWF0dHJpYnV0ZXMgPSBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJCWRlbCBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJZWxzZToKKwkJCWF0dHJpYnV0ZXMgPSB7fQorCisKKwkJcmVwbHksIGFyZ3VtZW50cywgYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisJCQkJYXJndW1lbnRzLCBhdHRyaWJ1dGVzKQorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorCQkJcmFpc2UgTWFjT1MuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJndW1lbnRzKQorCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisJCQlyZXR1cm4gYXJndW1lbnRzWyctLS0tJ10KKworCWRlZiBsb2coc2VsZiwgb2JqZWN0LCAqYXJndW1lbnRzKToKKwkJIiIibG9nOiBDYXVzZSBhIGNvbW1lbnQgdG8gYmUgbG9nZ2VkLgorCQlSZXF1aXJlZCBhcmd1bWVudDogYW55dGhpbmcKKwkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorCQkiIiIKKwkJX2NvZGUgPSAnYXNjcicKKwkJX3N1YmNvZGUgPSAnY21udCcKKworCQlpZiBsZW4oYXJndW1lbnRzKSA+IDE6CisJCQlyYWlzZSBUeXBlRXJyb3IsICdUb28gbWFueSBhcmd1bWVudHMnCisJCWlmIGFyZ3VtZW50czoKKwkJCWFyZ3VtZW50cyA9IGFyZ3VtZW50c1swXQorCQkJaWYgdHlwZShhcmd1bWVudHMpIDw+IHR5cGUoe30pOgorCQkJCXJhaXNlIFR5cGVFcnJvciwgJ011c3QgYmUgYSBtYXBwaW5nJworCQllbHNlOgorCQkJYXJndW1lbnRzID0ge30KKwkJYXJndW1lbnRzWyctLS0tJ10gPSBvYmplY3QKKworCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnX2F0dHJpYnV0ZXMnKToKKwkJCWF0dHJpYnV0ZXMgPSBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJCWRlbCBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJZWxzZToKKwkJCWF0dHJpYnV0ZXMgPSB7fQorCisKKwkJcmVwbHksIGFyZ3VtZW50cywgYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisJCQkJYXJndW1lbnRzLCBhdHRyaWJ1dGVzKQorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorCQkJcmFpc2UgTWFjT1MuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJndW1lbnRzKQorCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisJCQlyZXR1cm4gYXJndW1lbnRzWyctLS0tJ10KKworCWRlZiBzdG9wX2xvZyhzZWxmLCAqYXJndW1lbnRzKToKKwkJIiIic3RvcCBsb2c6IAorCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisJCSIiIgorCQlfY29kZSA9ICdUb3lTJworCQlfc3ViY29kZSA9ICdsb2cwJworCisJCWlmIGxlbihhcmd1bWVudHMpID4gMToKKwkJCXJhaXNlIFR5cGVFcnJvciwgJ1RvbyBtYW55IGFyZ3VtZW50cycKKwkJaWYgYXJndW1lbnRzOgorCQkJYXJndW1lbnRzID0gYXJndW1lbnRzWzBdCisJCQlpZiB0eXBlKGFyZ3VtZW50cykgPD4gdHlwZSh7fSk6CisJCQkJcmFpc2UgVHlwZUVycm9yLCAnTXVzdCBiZSBhIG1hcHBpbmcnCisJCWVsc2U6CisJCQlhcmd1bWVudHMgPSB7fQorCisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCdfYXR0cmlidXRlcycpOgorCQkJYXR0cmlidXRlcyA9IGFyZ3VtZW50c1snX2F0dHJpYnV0ZXMnXQorCQkJZGVsIGFyZ3VtZW50c1snX2F0dHJpYnV0ZXMnXQorCQllbHNlOgorCQkJYXR0cmlidXRlcyA9IHt9CisKKworCQlyZXBseSwgYXJndW1lbnRzLCBhdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKwkJCQlhcmd1bWVudHMsIGF0dHJpYnV0ZXMpCisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisJCQlyYWlzZSBNYWNPUy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmd1bWVudHMpCisJCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKwkJCXJldHVybiBhcmd1bWVudHNbJy0tLS0nXQorCisJZGVmIHN0YXJ0X2xvZyhzZWxmLCAqYXJndW1lbnRzKToKKwkJIiIic3RhcnQgbG9nOiAKKwkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorCQkiIiIKKwkJX2NvZGUgPSAnVG95UycKKwkJX3N1YmNvZGUgPSAnbG9nMScKKworCQlpZiBsZW4oYXJndW1lbnRzKSA+IDE6CisJCQlyYWlzZSBUeXBlRXJyb3IsICdUb28gbWFueSBhcmd1bWVudHMnCisJCWlmIGFyZ3VtZW50czoKKwkJCWFyZ3VtZW50cyA9IGFyZ3VtZW50c1swXQorCQkJaWYgdHlwZShhcmd1bWVudHMpIDw+IHR5cGUoe30pOgorCQkJCXJhaXNlIFR5cGVFcnJvciwgJ011c3QgYmUgYSBtYXBwaW5nJworCQllbHNlOgorCQkJYXJndW1lbnRzID0ge30KKworCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnX2F0dHJpYnV0ZXMnKToKKwkJCWF0dHJpYnV0ZXMgPSBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJCWRlbCBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJZWxzZToKKwkJCWF0dHJpYnV0ZXMgPSB7fQorCisKKwkJcmVwbHksIGFyZ3VtZW50cywgYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisJCQkJYXJndW1lbnRzLCBhdHRyaWJ1dGVzKQorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorCQkJcmFpc2UgTWFjT1MuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJndW1lbnRzKQorCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisJCQlyZXR1cm4gYXJndW1lbnRzWyctLS0tJ10KKworCWRlZiBjb3B5KHNlbGYsICphcmd1bWVudHMpOgorCQkiIiJjb3B5OiBDb3B5IGFuIG9iamVjdCB0byB0aGUgY2xpcGJvYXJkCisJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKwkJIiIiCisJCV9jb2RlID0gJ21pc2MnCisJCV9zdWJjb2RlID0gJ2NvcHknCisKKwkJaWYgbGVuKGFyZ3VtZW50cykgPiAxOgorCQkJcmFpc2UgVHlwZUVycm9yLCAnVG9vIG1hbnkgYXJndW1lbnRzJworCQlpZiBhcmd1bWVudHM6CisJCQlhcmd1bWVudHMgPSBhcmd1bWVudHNbMF0KKwkJCWlmIHR5cGUoYXJndW1lbnRzKSA8PiB0eXBlKHt9KToKKwkJCQlyYWlzZSBUeXBlRXJyb3IsICdNdXN0IGJlIGEgbWFwcGluZycKKwkJZWxzZToKKwkJCWFyZ3VtZW50cyA9IHt9CisKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ19hdHRyaWJ1dGVzJyk6CisJCQlhdHRyaWJ1dGVzID0gYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCQlkZWwgYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCWVsc2U6CisJCQlhdHRyaWJ1dGVzID0ge30KKworCisJCXJlcGx5LCBhcmd1bWVudHMsIGF0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorCQkJCWFyZ3VtZW50cywgYXR0cmlidXRlcykKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKwkJCXJhaXNlIE1hY09TLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorCQkJcmV0dXJuIGFyZ3VtZW50c1snLS0tLSddCisKKwlkZWYgZG9fc2NyaXB0KHNlbGYsIG9iamVjdCwgKmFyZ3VtZW50cyk6CisJCSIiImRvIHNjcmlwdDogRXhlY3V0ZSBhIHNjcmlwdAorCQlSZXF1aXJlZCBhcmd1bWVudDogdGhlIHNjcmlwdCB0byBleGVjdXRlCisJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKwkJUmV0dXJuczogYW55dGhpbmcKKwkJIiIiCisJCV9jb2RlID0gJ21pc2MnCisJCV9zdWJjb2RlID0gJ2Rvc2MnCisKKwkJaWYgbGVuKGFyZ3VtZW50cykgPiAxOgorCQkJcmFpc2UgVHlwZUVycm9yLCAnVG9vIG1hbnkgYXJndW1lbnRzJworCQlpZiBhcmd1bWVudHM6CisJCQlhcmd1bWVudHMgPSBhcmd1bWVudHNbMF0KKwkJCWlmIHR5cGUoYXJndW1lbnRzKSA8PiB0eXBlKHt9KToKKwkJCQlyYWlzZSBUeXBlRXJyb3IsICdNdXN0IGJlIGEgbWFwcGluZycKKwkJZWxzZToKKwkJCWFyZ3VtZW50cyA9IHt9CisJCWFyZ3VtZW50c1snLS0tLSddID0gb2JqZWN0CisKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ19hdHRyaWJ1dGVzJyk6CisJCQlhdHRyaWJ1dGVzID0gYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCQlkZWwgYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCWVsc2U6CisJCQlhdHRyaWJ1dGVzID0ge30KKworCisJCXJlcGx5LCBhcmd1bWVudHMsIGF0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorCQkJCWFyZ3VtZW50cywgYXR0cmlidXRlcykKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKwkJCXJhaXNlIE1hY09TLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorCQkJcmV0dXJuIGFyZ3VtZW50c1snLS0tLSddCisKKwlkZWYgaWRsZShzZWxmLCAqYXJndW1lbnRzKToKKwkJIiIiaWRsZTogU2VudCB0byBhIHNjcmlwdCBhcHBsaWNhdGlvbiB3aGVuIGl0IGlzIGlkbGUKKwkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorCQlSZXR1cm5zOiBOdW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGZvciBuZXh0IGlkbGUgZXZlbnQKKwkJIiIiCisJCV9jb2RlID0gJ21pc2MnCisJCV9zdWJjb2RlID0gJ2lkbGUnCisKKwkJaWYgbGVuKGFyZ3VtZW50cykgPiAxOgorCQkJcmFpc2UgVHlwZUVycm9yLCAnVG9vIG1hbnkgYXJndW1lbnRzJworCQlpZiBhcmd1bWVudHM6CisJCQlhcmd1bWVudHMgPSBhcmd1bWVudHNbMF0KKwkJCWlmIHR5cGUoYXJndW1lbnRzKSA8PiB0eXBlKHt9KToKKwkJCQlyYWlzZSBUeXBlRXJyb3IsICdNdXN0IGJlIGEgbWFwcGluZycKKwkJZWxzZToKKwkJCWFyZ3VtZW50cyA9IHt9CisKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ19hdHRyaWJ1dGVzJyk6CisJCQlhdHRyaWJ1dGVzID0gYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCQlkZWwgYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCWVsc2U6CisJCQlhdHRyaWJ1dGVzID0ge30KKworCisJCXJlcGx5LCBhcmd1bWVudHMsIGF0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorCQkJCWFyZ3VtZW50cywgYXR0cmlidXRlcykKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKwkJCXJhaXNlIE1hY09TLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorCQkJcmV0dXJuIGFyZ3VtZW50c1snLS0tLSddCisKKwlkZWYgbGF1bmNoKHNlbGYsICphcmd1bWVudHMpOgorCQkiIiJsYXVuY2g6IFN0YXJ0IGFuIGFwcGxpY2F0aW9uIGZvciBzY3JpcHRpbmcKKwkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorCQlSZXR1cm5zOiBhbnl0aGluZworCQkiIiIKKwkJX2NvZGUgPSAnYXNjcicKKwkJX3N1YmNvZGUgPSAnbm9vcCcKKworCQlpZiBsZW4oYXJndW1lbnRzKSA+IDE6CisJCQlyYWlzZSBUeXBlRXJyb3IsICdUb28gbWFueSBhcmd1bWVudHMnCisJCWlmIGFyZ3VtZW50czoKKwkJCWFyZ3VtZW50cyA9IGFyZ3VtZW50c1swXQorCQkJaWYgdHlwZShhcmd1bWVudHMpIDw+IHR5cGUoe30pOgorCQkJCXJhaXNlIFR5cGVFcnJvciwgJ011c3QgYmUgYSBtYXBwaW5nJworCQllbHNlOgorCQkJYXJndW1lbnRzID0ge30KKworCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnX2F0dHJpYnV0ZXMnKToKKwkJCWF0dHJpYnV0ZXMgPSBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJCWRlbCBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJZWxzZToKKwkJCWF0dHJpYnV0ZXMgPSB7fQorCisKKwkJcmVwbHksIGFyZ3VtZW50cywgYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisJCQkJYXJndW1lbnRzLCBhdHRyaWJ1dGVzKQorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorCQkJcmFpc2UgTWFjT1MuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJndW1lbnRzKQorCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisJCQlyZXR1cm4gYXJndW1lbnRzWyctLS0tJ10KKworCWRlZiB0ZWxsKHNlbGYsICphcmd1bWVudHMpOgorCQkiIiJ0ZWxsOiBNYWdpYyB0ZWxsIGV2ZW50IGZvciBldmVudCBsb2dnaW5nCisJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKwkJUmV0dXJuczogYW55dGhpbmcKKwkJIiIiCisJCV9jb2RlID0gJ2FzY3InCisJCV9zdWJjb2RlID0gJ3RlbGwnCisKKwkJaWYgbGVuKGFyZ3VtZW50cykgPiAxOgorCQkJcmFpc2UgVHlwZUVycm9yLCAnVG9vIG1hbnkgYXJndW1lbnRzJworCQlpZiBhcmd1bWVudHM6CisJCQlhcmd1bWVudHMgPSBhcmd1bWVudHNbMF0KKwkJCWlmIHR5cGUoYXJndW1lbnRzKSA8PiB0eXBlKHt9KToKKwkJCQlyYWlzZSBUeXBlRXJyb3IsICdNdXN0IGJlIGEgbWFwcGluZycKKwkJZWxzZToKKwkJCWFyZ3VtZW50cyA9IHt9CisKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ19hdHRyaWJ1dGVzJyk6CisJCQlhdHRyaWJ1dGVzID0gYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCQlkZWwgYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCWVsc2U6CisJCQlhdHRyaWJ1dGVzID0ge30KKworCisJCXJlcGx5LCBhcmd1bWVudHMsIGF0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorCQkJCWFyZ3VtZW50cywgYXR0cmlidXRlcykKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKwkJCXJhaXNlIE1hY09TLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorCQkJcmV0dXJuIGFyZ3VtZW50c1snLS0tLSddCisKKwlkZWYgZW5kX3RlbGwoc2VsZiwgKmFyZ3VtZW50cyk6CisJCSIiImVuZCB0ZWxsOiBTdGFydCBhbiBhcHBsaWNhdGlvbiBmb3Igc2NyaXB0aW5nCisJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKwkJUmV0dXJuczogYW55dGhpbmcKKwkJIiIiCisJCV9jb2RlID0gJ2FzY3InCisJCV9zdWJjb2RlID0gJ3RlbmQnCisKKwkJaWYgbGVuKGFyZ3VtZW50cykgPiAxOgorCQkJcmFpc2UgVHlwZUVycm9yLCAnVG9vIG1hbnkgYXJndW1lbnRzJworCQlpZiBhcmd1bWVudHM6CisJCQlhcmd1bWVudHMgPSBhcmd1bWVudHNbMF0KKwkJCWlmIHR5cGUoYXJndW1lbnRzKSA8PiB0eXBlKHt9KToKKwkJCQlyYWlzZSBUeXBlRXJyb3IsICdNdXN0IGJlIGEgbWFwcGluZycKKwkJZWxzZToKKwkJCWFyZ3VtZW50cyA9IHt9CisKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ19hdHRyaWJ1dGVzJyk6CisJCQlhdHRyaWJ1dGVzID0gYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCQlkZWwgYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCWVsc2U6CisJCQlhdHRyaWJ1dGVzID0ge30KKworCisJCXJlcGx5LCBhcmd1bWVudHMsIGF0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorCQkJCWFyZ3VtZW50cywgYXR0cmlidXRlcykKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKwkJCXJhaXNlIE1hY09TLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorCQkJcmV0dXJuIGFyZ3VtZW50c1snLS0tLSddCisKKwlfYXJnbWFwX2Vycm9yID0geworCQknbnVtYmVyJyA6ICdlcnJuJywKKwkJJ3BhcnRpYWxfcmVzdWx0JyA6ICdwdGxyJywKKwkJJ19mcm9tJyA6ICdlcm9iJywKKwkJJ3RvJyA6ICdlcnJ0JywKKwl9CisKKwlkZWYgZXJyb3Ioc2VsZiwgb2JqZWN0LCAqYXJndW1lbnRzKToKKwkJIiIiZXJyb3I6IFJhaXNlIGFuIGVycm9yCisJCVJlcXVpcmVkIGFyZ3VtZW50OiBhbnl0aGluZworCQlLZXl3b3JkIGFyZ3VtZW50IG51bWJlcjogYW4gZXJyb3IgbnVtYmVyCisJCUtleXdvcmQgYXJndW1lbnQgcGFydGlhbF9yZXN1bHQ6IGFueSBwYXJ0aWFsIHJlc3VsdCBvY2N1cnJpbmcgYmVmb3JlIHRoZSBlcnJvcgorCQlLZXl3b3JkIGFyZ3VtZW50IF9mcm9tOiB0aGUgb2JqZWN0IHRoYXQgY2F1c2VkIHRoZSBlcnJvcgorCQlLZXl3b3JkIGFyZ3VtZW50IHRvOiBhbm90aGVyIHBhcmFtZXRlciB0byB0aGUgZXJyb3IKKwkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorCQlSZXR1cm5zOiBhbnl0aGluZworCQkiIiIKKwkJX2NvZGUgPSAnYXNjcicKKwkJX3N1YmNvZGUgPSAnZXJyICcKKworCQlpZiBsZW4oYXJndW1lbnRzKToKKwkJCW9iamVjdCA9IGFyZ3VtZW50c1swXQorCQkJYXJndW1lbnRzID0gYXJndW1lbnRzWzE6XQorCQllbHNlOgorCQkJb2JqZWN0ID0gTm9uZQorCQlpZiBsZW4oYXJndW1lbnRzKSA+IDE6CisJCQlyYWlzZSBUeXBlRXJyb3IsICdUb28gbWFueSBhcmd1bWVudHMnCisJCWlmIGFyZ3VtZW50czoKKwkJCWFyZ3VtZW50cyA9IGFyZ3VtZW50c1swXQorCQkJaWYgdHlwZShhcmd1bWVudHMpIDw+IHR5cGUoe30pOgorCQkJCXJhaXNlIFR5cGVFcnJvciwgJ011c3QgYmUgYSBtYXBwaW5nJworCQllbHNlOgorCQkJYXJndW1lbnRzID0ge30KKwkJYXJndW1lbnRzWyctLS0tJ10gPSBvYmplY3QKKworCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnX2F0dHJpYnV0ZXMnKToKKwkJCWF0dHJpYnV0ZXMgPSBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJCWRlbCBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJZWxzZToKKwkJCWF0dHJpYnV0ZXMgPSB7fQorCisJCWFldG9vbHMua2V5c3Vic3QoYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfZXJyb3IpCisKKwkJcmVwbHksIGFyZ3VtZW50cywgYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisJCQkJYXJndW1lbnRzLCBhdHRyaWJ1dGVzKQorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorCQkJcmFpc2UgTWFjT1MuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJndW1lbnRzKQorCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisJCQlyZXR1cm4gYXJndW1lbnRzWyctLS0tJ10KKworCV9hcmdtYXBfQ2FsbF9hNV9zdWJyb3V0aW5lID0geworCQknYXQnIDogJ2F0ICAnLAorCQknX2Zyb20nIDogJ2Zyb20nLAorCQknX2ZvcicgOiAnZm9yICcsCisJCSd0bycgOiAndG8gICcsCisJCSd0aHJ1JyA6ICd0aHJ1JywKKwkJJ3Rocm91Z2gnIDogJ3RoZ2gnLAorCQknYnknIDogJ2J5ICAnLAorCQknb24nIDogJ29uICAnLAorCQknaW50bycgOiAnaW50bycsCisJCSdvbnRvJyA6ICdvbnRvJywKKwkJJ2JldHdlZW4nIDogJ2J0d24nLAorCQknYWdhaW5zdCcgOiAnYWdzdCcsCisJCSdvdXRfb2YnIDogJ291dG8nLAorCQknaW5zdGVhZF9vZicgOiAnaXN0bycsCisJCSdhc2lkZV9mcm9tJyA6ICdhc2RmJywKKwkJJ2Fyb3VuZCcgOiAnYXJuZCcsCisJCSdiZXNpZGUnIDogJ2JzaWQnLAorCQknYmVuZWF0aCcgOiAnYm50aCcsCisJCSd1bmRlcicgOiAndW5kcicsCisJCSdvdmVyJyA6ICdvdmVyJywKKwkJJ2Fib3ZlJyA6ICdhYnZlJywKKwkJJ2JlbG93JyA6ICdiZWx3JywKKwkJJ2FwYXJ0X2Zyb20nIDogJ2FwcnQnLAorCQknZ2l2ZW4nIDogJ2dpdm4nLAorCQknd2l0aCcgOiAnd2l0aCcsCisJCSd3aXRob3V0JyA6ICd3b3V0JywKKwkJJ2Fib3V0JyA6ICdhYm91JywKKwkJJ3NpbmNlJyA6ICdzbmNlJywKKwkJJ3VudGlsJyA6ICd0aWxsJywKKwkJJ3JldHVybmluZycgOiAnS3J0bicsCisJfQorCisJZGVmIENhbGxfYTVfc3Vicm91dGluZShzZWxmLCBvYmplY3QsICphcmd1bWVudHMpOgorCQkiIiJDYWxspXN1YnJvdXRpbmU6IEEgc3Vicm91dGluZSBjYWxsCisJCVJlcXVpcmVkIGFyZ3VtZW50OiBhbnl0aGluZworCQlLZXl3b3JkIGFyZ3VtZW50IGF0OiBhIHByZXBvc2l0aW9uCisJCUtleXdvcmQgYXJndW1lbnQgX2Zyb206IGEgcHJlcG9zaXRpb24KKwkJS2V5d29yZCBhcmd1bWVudCBfZm9yOiBhIHByZXBvc2l0aW9uCisJCUtleXdvcmQgYXJndW1lbnQgdG86IGEgcHJlcG9zaXRpb24KKwkJS2V5d29yZCBhcmd1bWVudCB0aHJ1OiBhIHByZXBvc2l0aW9uCisJCUtleXdvcmQgYXJndW1lbnQgdGhyb3VnaDogYSBwcmVwb3NpdGlvbgorCQlLZXl3b3JkIGFyZ3VtZW50IGJ5OiBhIHByZXBvc2l0aW9uCisJCUtleXdvcmQgYXJndW1lbnQgb246IGEgcHJlcG9zaXRpb24KKwkJS2V5d29yZCBhcmd1bWVudCBpbnRvOiBhIHByZXBvc2l0aW9uCisJCUtleXdvcmQgYXJndW1lbnQgb250bzogYSBwcmVwb3NpdGlvbgorCQlLZXl3b3JkIGFyZ3VtZW50IGJldHdlZW46IGEgcHJlcG9zaXRpb24KKwkJS2V5d29yZCBhcmd1bWVudCBhZ2FpbnN0OiBhIHByZXBvc2l0aW9uCisJCUtleXdvcmQgYXJndW1lbnQgb3V0X29mOiBhIHByZXBvc2l0aW9uCisJCUtleXdvcmQgYXJndW1lbnQgaW5zdGVhZF9vZjogYSBwcmVwb3NpdGlvbgorCQlLZXl3b3JkIGFyZ3VtZW50IGFzaWRlX2Zyb206IGEgcHJlcG9zaXRpb24KKwkJS2V5d29yZCBhcmd1bWVudCBhcm91bmQ6IGEgcHJlcG9zaXRpb24KKwkJS2V5d29yZCBhcmd1bWVudCBiZXNpZGU6IGEgcHJlcG9zaXRpb24KKwkJS2V5d29yZCBhcmd1bWVudCBiZW5lYXRoOiBhIHByZXBvc2l0aW9uCisJCUtleXdvcmQgYXJndW1lbnQgdW5kZXI6IGEgcHJlcG9zaXRpb24KKwkJS2V5d29yZCBhcmd1bWVudCBvdmVyOiBhIHByZXBvc2l0aW9uCisJCUtleXdvcmQgYXJndW1lbnQgYWJvdmU6IGEgcHJlcG9zaXRpb24KKwkJS2V5d29yZCBhcmd1bWVudCBiZWxvdzogYSBwcmVwb3NpdGlvbgorCQlLZXl3b3JkIGFyZ3VtZW50IGFwYXJ0X2Zyb206IGEgcHJlcG9zaXRpb24KKwkJS2V5d29yZCBhcmd1bWVudCBnaXZlbjogYSBwcmVwb3NpdGlvbgorCQlLZXl3b3JkIGFyZ3VtZW50IHdpdGg6IHNwZWNpYWwgcHJlcG9zaXRpb24gZm9yIHNldHRpbmcgZXZlbnQgcHJvcGVydGllcworCQlLZXl3b3JkIGFyZ3VtZW50IHdpdGhvdXQ6IHNwZWNpYWwgcHJlcG9zaXRpb24gZm9yIGNsZWFyaW5nIGV2ZW50IHByb3BlcnRpZXMKKwkJS2V5d29yZCBhcmd1bWVudCBhYm91dDogYSBwcmVwb3NpdGlvbgorCQlLZXl3b3JkIGFyZ3VtZW50IHNpbmNlOiBhIHByZXBvc2l0aW9uCisJCUtleXdvcmQgYXJndW1lbnQgdW50aWw6IGEgcHJlcG9zaXRpb24KKwkJS2V5d29yZCBhcmd1bWVudCByZXR1cm5pbmc6IHNwZWNpZmllcyBhIHBhdHRlcm4gdG8gbWF0Y2ggcmVzdWx0cyB0bworCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisJCVJldHVybnM6IGFueXRoaW5nCisJCSIiIgorCQlfY29kZSA9ICdhc2NyJworCQlfc3ViY29kZSA9ICdwc2JyJworCisJCWlmIGxlbihhcmd1bWVudHMpOgorCQkJb2JqZWN0ID0gYXJndW1lbnRzWzBdCisJCQlhcmd1bWVudHMgPSBhcmd1bWVudHNbMTpdCisJCWVsc2U6CisJCQlvYmplY3QgPSBOb25lCisJCWlmIGxlbihhcmd1bWVudHMpID4gMToKKwkJCXJhaXNlIFR5cGVFcnJvciwgJ1RvbyBtYW55IGFyZ3VtZW50cycKKwkJaWYgYXJndW1lbnRzOgorCQkJYXJndW1lbnRzID0gYXJndW1lbnRzWzBdCisJCQlpZiB0eXBlKGFyZ3VtZW50cykgPD4gdHlwZSh7fSk6CisJCQkJcmFpc2UgVHlwZUVycm9yLCAnTXVzdCBiZSBhIG1hcHBpbmcnCisJCWVsc2U6CisJCQlhcmd1bWVudHMgPSB7fQorCQlhcmd1bWVudHNbJy0tLS0nXSA9IG9iamVjdAorCisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCdfYXR0cmlidXRlcycpOgorCQkJYXR0cmlidXRlcyA9IGFyZ3VtZW50c1snX2F0dHJpYnV0ZXMnXQorCQkJZGVsIGFyZ3VtZW50c1snX2F0dHJpYnV0ZXMnXQorCQllbHNlOgorCQkJYXR0cmlidXRlcyA9IHt9CisKKwkJYWV0b29scy5rZXlzdWJzdChhcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9DYWxsX2E1X3N1YnJvdXRpbmUpCisKKwkJcmVwbHksIGFyZ3VtZW50cywgYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisJCQkJYXJndW1lbnRzLCBhdHRyaWJ1dGVzKQorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorCQkJcmFpc2UgTWFjT1MuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJndW1lbnRzKQorCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisJCQlyZXR1cm4gYXJndW1lbnRzWyctLS0tJ10KKworCWRlZiBfM2RfKHNlbGYsIG9iamVjdCwgKmFyZ3VtZW50cyk6CisJCSIiIj06IEVxdWFsaXR5CisJCVJlcXVpcmVkIGFyZ3VtZW50OiBhbiBBRSBvYmplY3QgcmVmZXJlbmNlCisJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKwkJUmV0dXJuczogYW55dGhpbmcKKwkJIiIiCisJCV9jb2RlID0gJ2FzY3InCisJCV9zdWJjb2RlID0gJz0gICAnCisKKwkJaWYgbGVuKGFyZ3VtZW50cykgPiAxOgorCQkJcmFpc2UgVHlwZUVycm9yLCAnVG9vIG1hbnkgYXJndW1lbnRzJworCQlpZiBhcmd1bWVudHM6CisJCQlhcmd1bWVudHMgPSBhcmd1bWVudHNbMF0KKwkJCWlmIHR5cGUoYXJndW1lbnRzKSA8PiB0eXBlKHt9KToKKwkJCQlyYWlzZSBUeXBlRXJyb3IsICdNdXN0IGJlIGEgbWFwcGluZycKKwkJZWxzZToKKwkJCWFyZ3VtZW50cyA9IHt9CisJCWFyZ3VtZW50c1snLS0tLSddID0gb2JqZWN0CisKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ19hdHRyaWJ1dGVzJyk6CisJCQlhdHRyaWJ1dGVzID0gYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCQlkZWwgYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCWVsc2U6CisJCQlhdHRyaWJ1dGVzID0ge30KKworCisJCXJlcGx5LCBhcmd1bWVudHMsIGF0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorCQkJCWFyZ3VtZW50cywgYXR0cmlidXRlcykKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKwkJCXJhaXNlIE1hY09TLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorCQkJcmV0dXJuIGFyZ3VtZW50c1snLS0tLSddCisKKwlkZWYgX2FkXyhzZWxmLCBvYmplY3QsICphcmd1bWVudHMpOgorCQkiIiKtOiBJbmVxdWFsaXR5CisJCVJlcXVpcmVkIGFyZ3VtZW50OiBhbiBBRSBvYmplY3QgcmVmZXJlbmNlCisJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKwkJUmV0dXJuczogYW55dGhpbmcKKwkJIiIiCisJCV9jb2RlID0gJ2FzY3InCisJCV9zdWJjb2RlID0gJ1wyNTUgICAnCisKKwkJaWYgbGVuKGFyZ3VtZW50cykgPiAxOgorCQkJcmFpc2UgVHlwZUVycm9yLCAnVG9vIG1hbnkgYXJndW1lbnRzJworCQlpZiBhcmd1bWVudHM6CisJCQlhcmd1bWVudHMgPSBhcmd1bWVudHNbMF0KKwkJCWlmIHR5cGUoYXJndW1lbnRzKSA8PiB0eXBlKHt9KToKKwkJCQlyYWlzZSBUeXBlRXJyb3IsICdNdXN0IGJlIGEgbWFwcGluZycKKwkJZWxzZToKKwkJCWFyZ3VtZW50cyA9IHt9CisJCWFyZ3VtZW50c1snLS0tLSddID0gb2JqZWN0CisKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ19hdHRyaWJ1dGVzJyk6CisJCQlhdHRyaWJ1dGVzID0gYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCQlkZWwgYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCWVsc2U6CisJCQlhdHRyaWJ1dGVzID0ge30KKworCisJCXJlcGx5LCBhcmd1bWVudHMsIGF0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorCQkJCWFyZ3VtZW50cywgYXR0cmlidXRlcykKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKwkJCXJhaXNlIE1hY09TLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorCQkJcmV0dXJuIGFyZ3VtZW50c1snLS0tLSddCisKKwlkZWYgXzJiXyhzZWxmLCBvYmplY3QsICphcmd1bWVudHMpOgorCQkiIiIrOiBBZGRpdGlvbgorCQlSZXF1aXJlZCBhcmd1bWVudDogYW4gQUUgb2JqZWN0IHJlZmVyZW5jZQorCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisJCVJldHVybnM6IGFueXRoaW5nCisJCSIiIgorCQlfY29kZSA9ICdhc2NyJworCQlfc3ViY29kZSA9ICcrICAgJworCisJCWlmIGxlbihhcmd1bWVudHMpID4gMToKKwkJCXJhaXNlIFR5cGVFcnJvciwgJ1RvbyBtYW55IGFyZ3VtZW50cycKKwkJaWYgYXJndW1lbnRzOgorCQkJYXJndW1lbnRzID0gYXJndW1lbnRzWzBdCisJCQlpZiB0eXBlKGFyZ3VtZW50cykgPD4gdHlwZSh7fSk6CisJCQkJcmFpc2UgVHlwZUVycm9yLCAnTXVzdCBiZSBhIG1hcHBpbmcnCisJCWVsc2U6CisJCQlhcmd1bWVudHMgPSB7fQorCQlhcmd1bWVudHNbJy0tLS0nXSA9IG9iamVjdAorCisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCdfYXR0cmlidXRlcycpOgorCQkJYXR0cmlidXRlcyA9IGFyZ3VtZW50c1snX2F0dHJpYnV0ZXMnXQorCQkJZGVsIGFyZ3VtZW50c1snX2F0dHJpYnV0ZXMnXQorCQllbHNlOgorCQkJYXR0cmlidXRlcyA9IHt9CisKKworCQlyZXBseSwgYXJndW1lbnRzLCBhdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKwkJCQlhcmd1bWVudHMsIGF0dHJpYnV0ZXMpCisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisJCQlyYWlzZSBNYWNPUy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmd1bWVudHMpCisJCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKwkJCXJldHVybiBhcmd1bWVudHNbJy0tLS0nXQorCisJZGVmIF8yZF8oc2VsZiwgb2JqZWN0LCAqYXJndW1lbnRzKToKKwkJIiIiLTogU3VidHJhY3Rpb24KKwkJUmVxdWlyZWQgYXJndW1lbnQ6IGFuIEFFIG9iamVjdCByZWZlcmVuY2UKKwkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorCQlSZXR1cm5zOiBhbnl0aGluZworCQkiIiIKKwkJX2NvZGUgPSAnYXNjcicKKwkJX3N1YmNvZGUgPSAnLSAgICcKKworCQlpZiBsZW4oYXJndW1lbnRzKSA+IDE6CisJCQlyYWlzZSBUeXBlRXJyb3IsICdUb28gbWFueSBhcmd1bWVudHMnCisJCWlmIGFyZ3VtZW50czoKKwkJCWFyZ3VtZW50cyA9IGFyZ3VtZW50c1swXQorCQkJaWYgdHlwZShhcmd1bWVudHMpIDw+IHR5cGUoe30pOgorCQkJCXJhaXNlIFR5cGVFcnJvciwgJ011c3QgYmUgYSBtYXBwaW5nJworCQllbHNlOgorCQkJYXJndW1lbnRzID0ge30KKwkJYXJndW1lbnRzWyctLS0tJ10gPSBvYmplY3QKKworCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnX2F0dHJpYnV0ZXMnKToKKwkJCWF0dHJpYnV0ZXMgPSBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJCWRlbCBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJZWxzZToKKwkJCWF0dHJpYnV0ZXMgPSB7fQorCisKKwkJcmVwbHksIGFyZ3VtZW50cywgYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisJCQkJYXJndW1lbnRzLCBhdHRyaWJ1dGVzKQorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorCQkJcmFpc2UgTWFjT1MuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJndW1lbnRzKQorCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisJCQlyZXR1cm4gYXJndW1lbnRzWyctLS0tJ10KKworCWRlZiBfMmFfKHNlbGYsIG9iamVjdCwgKmFyZ3VtZW50cyk6CisJCSIiIio6IE11bHRpcGxpY2F0aW9uCisJCVJlcXVpcmVkIGFyZ3VtZW50OiBhbiBBRSBvYmplY3QgcmVmZXJlbmNlCisJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKwkJUmV0dXJuczogYW55dGhpbmcKKwkJIiIiCisJCV9jb2RlID0gJ2FzY3InCisJCV9zdWJjb2RlID0gJyogICAnCisKKwkJaWYgbGVuKGFyZ3VtZW50cykgPiAxOgorCQkJcmFpc2UgVHlwZUVycm9yLCAnVG9vIG1hbnkgYXJndW1lbnRzJworCQlpZiBhcmd1bWVudHM6CisJCQlhcmd1bWVudHMgPSBhcmd1bWVudHNbMF0KKwkJCWlmIHR5cGUoYXJndW1lbnRzKSA8PiB0eXBlKHt9KToKKwkJCQlyYWlzZSBUeXBlRXJyb3IsICdNdXN0IGJlIGEgbWFwcGluZycKKwkJZWxzZToKKwkJCWFyZ3VtZW50cyA9IHt9CisJCWFyZ3VtZW50c1snLS0tLSddID0gb2JqZWN0CisKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ19hdHRyaWJ1dGVzJyk6CisJCQlhdHRyaWJ1dGVzID0gYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCQlkZWwgYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCWVsc2U6CisJCQlhdHRyaWJ1dGVzID0ge30KKworCisJCXJlcGx5LCBhcmd1bWVudHMsIGF0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorCQkJCWFyZ3VtZW50cywgYXR0cmlidXRlcykKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKwkJCXJhaXNlIE1hY09TLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorCQkJcmV0dXJuIGFyZ3VtZW50c1snLS0tLSddCisKKwlkZWYgX2Q2XyhzZWxmLCBvYmplY3QsICphcmd1bWVudHMpOgorCQkiIiLWOiBEaXZpc2lvbgorCQlSZXF1aXJlZCBhcmd1bWVudDogYW4gQUUgb2JqZWN0IHJlZmVyZW5jZQorCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisJCVJldHVybnM6IGFueXRoaW5nCisJCSIiIgorCQlfY29kZSA9ICdhc2NyJworCQlfc3ViY29kZSA9ICcvICAgJworCisJCWlmIGxlbihhcmd1bWVudHMpID4gMToKKwkJCXJhaXNlIFR5cGVFcnJvciwgJ1RvbyBtYW55IGFyZ3VtZW50cycKKwkJaWYgYXJndW1lbnRzOgorCQkJYXJndW1lbnRzID0gYXJndW1lbnRzWzBdCisJCQlpZiB0eXBlKGFyZ3VtZW50cykgPD4gdHlwZSh7fSk6CisJCQkJcmFpc2UgVHlwZUVycm9yLCAnTXVzdCBiZSBhIG1hcHBpbmcnCisJCWVsc2U6CisJCQlhcmd1bWVudHMgPSB7fQorCQlhcmd1bWVudHNbJy0tLS0nXSA9IG9iamVjdAorCisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCdfYXR0cmlidXRlcycpOgorCQkJYXR0cmlidXRlcyA9IGFyZ3VtZW50c1snX2F0dHJpYnV0ZXMnXQorCQkJZGVsIGFyZ3VtZW50c1snX2F0dHJpYnV0ZXMnXQorCQllbHNlOgorCQkJYXR0cmlidXRlcyA9IHt9CisKKworCQlyZXBseSwgYXJndW1lbnRzLCBhdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKwkJCQlhcmd1bWVudHMsIGF0dHJpYnV0ZXMpCisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisJCQlyYWlzZSBNYWNPUy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmd1bWVudHMpCisJCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKwkJCXJldHVybiBhcmd1bWVudHNbJy0tLS0nXQorCisJZGVmIGRpdihzZWxmLCBvYmplY3QsICphcmd1bWVudHMpOgorCQkiIiJkaXY6IFF1b3RpZW50CisJCVJlcXVpcmVkIGFyZ3VtZW50OiBhbiBBRSBvYmplY3QgcmVmZXJlbmNlCisJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKwkJUmV0dXJuczogYW55dGhpbmcKKwkJIiIiCisJCV9jb2RlID0gJ2FzY3InCisJCV9zdWJjb2RlID0gJ2RpdiAnCisKKwkJaWYgbGVuKGFyZ3VtZW50cykgPiAxOgorCQkJcmFpc2UgVHlwZUVycm9yLCAnVG9vIG1hbnkgYXJndW1lbnRzJworCQlpZiBhcmd1bWVudHM6CisJCQlhcmd1bWVudHMgPSBhcmd1bWVudHNbMF0KKwkJCWlmIHR5cGUoYXJndW1lbnRzKSA8PiB0eXBlKHt9KToKKwkJCQlyYWlzZSBUeXBlRXJyb3IsICdNdXN0IGJlIGEgbWFwcGluZycKKwkJZWxzZToKKwkJCWFyZ3VtZW50cyA9IHt9CisJCWFyZ3VtZW50c1snLS0tLSddID0gb2JqZWN0CisKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ19hdHRyaWJ1dGVzJyk6CisJCQlhdHRyaWJ1dGVzID0gYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCQlkZWwgYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCWVsc2U6CisJCQlhdHRyaWJ1dGVzID0ge30KKworCisJCXJlcGx5LCBhcmd1bWVudHMsIGF0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorCQkJCWFyZ3VtZW50cywgYXR0cmlidXRlcykKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKwkJCXJhaXNlIE1hY09TLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorCQkJcmV0dXJuIGFyZ3VtZW50c1snLS0tLSddCisKKwlkZWYgbW9kKHNlbGYsIG9iamVjdCwgKmFyZ3VtZW50cyk6CisJCSIiIm1vZDogUmVtYWluZGVyCisJCVJlcXVpcmVkIGFyZ3VtZW50OiBhbiBBRSBvYmplY3QgcmVmZXJlbmNlCisJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKwkJUmV0dXJuczogYW55dGhpbmcKKwkJIiIiCisJCV9jb2RlID0gJ2FzY3InCisJCV9zdWJjb2RlID0gJ21vZCAnCisKKwkJaWYgbGVuKGFyZ3VtZW50cykgPiAxOgorCQkJcmFpc2UgVHlwZUVycm9yLCAnVG9vIG1hbnkgYXJndW1lbnRzJworCQlpZiBhcmd1bWVudHM6CisJCQlhcmd1bWVudHMgPSBhcmd1bWVudHNbMF0KKwkJCWlmIHR5cGUoYXJndW1lbnRzKSA8PiB0eXBlKHt9KToKKwkJCQlyYWlzZSBUeXBlRXJyb3IsICdNdXN0IGJlIGEgbWFwcGluZycKKwkJZWxzZToKKwkJCWFyZ3VtZW50cyA9IHt9CisJCWFyZ3VtZW50c1snLS0tLSddID0gb2JqZWN0CisKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ19hdHRyaWJ1dGVzJyk6CisJCQlhdHRyaWJ1dGVzID0gYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCQlkZWwgYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCWVsc2U6CisJCQlhdHRyaWJ1dGVzID0ge30KKworCisJCXJlcGx5LCBhcmd1bWVudHMsIGF0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorCQkJCWFyZ3VtZW50cywgYXR0cmlidXRlcykKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKwkJCXJhaXNlIE1hY09TLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorCQkJcmV0dXJuIGFyZ3VtZW50c1snLS0tLSddCisKKwlkZWYgXzVlXyhzZWxmLCBvYmplY3QsICphcmd1bWVudHMpOgorCQkiIiJeOiBFeHBvbmVudGlhdGlvbgorCQlSZXF1aXJlZCBhcmd1bWVudDogYW4gQUUgb2JqZWN0IHJlZmVyZW5jZQorCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisJCVJldHVybnM6IGFueXRoaW5nCisJCSIiIgorCQlfY29kZSA9ICdhc2NyJworCQlfc3ViY29kZSA9ICdeICAgJworCisJCWlmIGxlbihhcmd1bWVudHMpID4gMToKKwkJCXJhaXNlIFR5cGVFcnJvciwgJ1RvbyBtYW55IGFyZ3VtZW50cycKKwkJaWYgYXJndW1lbnRzOgorCQkJYXJndW1lbnRzID0gYXJndW1lbnRzWzBdCisJCQlpZiB0eXBlKGFyZ3VtZW50cykgPD4gdHlwZSh7fSk6CisJCQkJcmFpc2UgVHlwZUVycm9yLCAnTXVzdCBiZSBhIG1hcHBpbmcnCisJCWVsc2U6CisJCQlhcmd1bWVudHMgPSB7fQorCQlhcmd1bWVudHNbJy0tLS0nXSA9IG9iamVjdAorCisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCdfYXR0cmlidXRlcycpOgorCQkJYXR0cmlidXRlcyA9IGFyZ3VtZW50c1snX2F0dHJpYnV0ZXMnXQorCQkJZGVsIGFyZ3VtZW50c1snX2F0dHJpYnV0ZXMnXQorCQllbHNlOgorCQkJYXR0cmlidXRlcyA9IHt9CisKKworCQlyZXBseSwgYXJndW1lbnRzLCBhdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKwkJCQlhcmd1bWVudHMsIGF0dHJpYnV0ZXMpCisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisJCQlyYWlzZSBNYWNPUy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmd1bWVudHMpCisJCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKwkJCXJldHVybiBhcmd1bWVudHNbJy0tLS0nXQorCisJZGVmIF8zZV8oc2VsZiwgb2JqZWN0LCAqYXJndW1lbnRzKToKKwkJIiIiPjogR3JlYXRlciB0aGFuCisJCVJlcXVpcmVkIGFyZ3VtZW50OiBhbiBBRSBvYmplY3QgcmVmZXJlbmNlCisJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKwkJUmV0dXJuczogYW55dGhpbmcKKwkJIiIiCisJCV9jb2RlID0gJ2FzY3InCisJCV9zdWJjb2RlID0gJz4gICAnCisKKwkJaWYgbGVuKGFyZ3VtZW50cykgPiAxOgorCQkJcmFpc2UgVHlwZUVycm9yLCAnVG9vIG1hbnkgYXJndW1lbnRzJworCQlpZiBhcmd1bWVudHM6CisJCQlhcmd1bWVudHMgPSBhcmd1bWVudHNbMF0KKwkJCWlmIHR5cGUoYXJndW1lbnRzKSA8PiB0eXBlKHt9KToKKwkJCQlyYWlzZSBUeXBlRXJyb3IsICdNdXN0IGJlIGEgbWFwcGluZycKKwkJZWxzZToKKwkJCWFyZ3VtZW50cyA9IHt9CisJCWFyZ3VtZW50c1snLS0tLSddID0gb2JqZWN0CisKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ19hdHRyaWJ1dGVzJyk6CisJCQlhdHRyaWJ1dGVzID0gYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCQlkZWwgYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCWVsc2U6CisJCQlhdHRyaWJ1dGVzID0ge30KKworCisJCXJlcGx5LCBhcmd1bWVudHMsIGF0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorCQkJCWFyZ3VtZW50cywgYXR0cmlidXRlcykKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKwkJCXJhaXNlIE1hY09TLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorCQkJcmV0dXJuIGFyZ3VtZW50c1snLS0tLSddCisKKwlkZWYgX2IzXyhzZWxmLCBvYmplY3QsICphcmd1bWVudHMpOgorCQkiIiKzOiBHcmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8KKwkJUmVxdWlyZWQgYXJndW1lbnQ6IGFuIEFFIG9iamVjdCByZWZlcmVuY2UKKwkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorCQlSZXR1cm5zOiBhbnl0aGluZworCQkiIiIKKwkJX2NvZGUgPSAnYXNjcicKKwkJX3N1YmNvZGUgPSAnPj0gICcKKworCQlpZiBsZW4oYXJndW1lbnRzKSA+IDE6CisJCQlyYWlzZSBUeXBlRXJyb3IsICdUb28gbWFueSBhcmd1bWVudHMnCisJCWlmIGFyZ3VtZW50czoKKwkJCWFyZ3VtZW50cyA9IGFyZ3VtZW50c1swXQorCQkJaWYgdHlwZShhcmd1bWVudHMpIDw+IHR5cGUoe30pOgorCQkJCXJhaXNlIFR5cGVFcnJvciwgJ011c3QgYmUgYSBtYXBwaW5nJworCQllbHNlOgorCQkJYXJndW1lbnRzID0ge30KKwkJYXJndW1lbnRzWyctLS0tJ10gPSBvYmplY3QKKworCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnX2F0dHJpYnV0ZXMnKToKKwkJCWF0dHJpYnV0ZXMgPSBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJCWRlbCBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJZWxzZToKKwkJCWF0dHJpYnV0ZXMgPSB7fQorCisKKwkJcmVwbHksIGFyZ3VtZW50cywgYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisJCQkJYXJndW1lbnRzLCBhdHRyaWJ1dGVzKQorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorCQkJcmFpc2UgTWFjT1MuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJndW1lbnRzKQorCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisJCQlyZXR1cm4gYXJndW1lbnRzWyctLS0tJ10KKworCWRlZiBfM2NfKHNlbGYsIG9iamVjdCwgKmFyZ3VtZW50cyk6CisJCSIiIjw6IExlc3MgdGhhbgorCQlSZXF1aXJlZCBhcmd1bWVudDogYW4gQUUgb2JqZWN0IHJlZmVyZW5jZQorCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisJCVJldHVybnM6IGFueXRoaW5nCisJCSIiIgorCQlfY29kZSA9ICdhc2NyJworCQlfc3ViY29kZSA9ICc8ICAgJworCisJCWlmIGxlbihhcmd1bWVudHMpID4gMToKKwkJCXJhaXNlIFR5cGVFcnJvciwgJ1RvbyBtYW55IGFyZ3VtZW50cycKKwkJaWYgYXJndW1lbnRzOgorCQkJYXJndW1lbnRzID0gYXJndW1lbnRzWzBdCisJCQlpZiB0eXBlKGFyZ3VtZW50cykgPD4gdHlwZSh7fSk6CisJCQkJcmFpc2UgVHlwZUVycm9yLCAnTXVzdCBiZSBhIG1hcHBpbmcnCisJCWVsc2U6CisJCQlhcmd1bWVudHMgPSB7fQorCQlhcmd1bWVudHNbJy0tLS0nXSA9IG9iamVjdAorCisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCdfYXR0cmlidXRlcycpOgorCQkJYXR0cmlidXRlcyA9IGFyZ3VtZW50c1snX2F0dHJpYnV0ZXMnXQorCQkJZGVsIGFyZ3VtZW50c1snX2F0dHJpYnV0ZXMnXQorCQllbHNlOgorCQkJYXR0cmlidXRlcyA9IHt9CisKKworCQlyZXBseSwgYXJndW1lbnRzLCBhdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKwkJCQlhcmd1bWVudHMsIGF0dHJpYnV0ZXMpCisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisJCQlyYWlzZSBNYWNPUy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmd1bWVudHMpCisJCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKwkJCXJldHVybiBhcmd1bWVudHNbJy0tLS0nXQorCisJZGVmIF9iMl8oc2VsZiwgb2JqZWN0LCAqYXJndW1lbnRzKToKKwkJIiIisjogTGVzcyB0aGFuIG9yIGVxdWFsIHRvCisJCVJlcXVpcmVkIGFyZ3VtZW50OiBhbiBBRSBvYmplY3QgcmVmZXJlbmNlCisJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKwkJUmV0dXJuczogYW55dGhpbmcKKwkJIiIiCisJCV9jb2RlID0gJ2FzY3InCisJCV9zdWJjb2RlID0gJzw9ICAnCisKKwkJaWYgbGVuKGFyZ3VtZW50cykgPiAxOgorCQkJcmFpc2UgVHlwZUVycm9yLCAnVG9vIG1hbnkgYXJndW1lbnRzJworCQlpZiBhcmd1bWVudHM6CisJCQlhcmd1bWVudHMgPSBhcmd1bWVudHNbMF0KKwkJCWlmIHR5cGUoYXJndW1lbnRzKSA8PiB0eXBlKHt9KToKKwkJCQlyYWlzZSBUeXBlRXJyb3IsICdNdXN0IGJlIGEgbWFwcGluZycKKwkJZWxzZToKKwkJCWFyZ3VtZW50cyA9IHt9CisJCWFyZ3VtZW50c1snLS0tLSddID0gb2JqZWN0CisKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ19hdHRyaWJ1dGVzJyk6CisJCQlhdHRyaWJ1dGVzID0gYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCQlkZWwgYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCWVsc2U6CisJCQlhdHRyaWJ1dGVzID0ge30KKworCisJCXJlcGx5LCBhcmd1bWVudHMsIGF0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorCQkJCWFyZ3VtZW50cywgYXR0cmlidXRlcykKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKwkJCXJhaXNlIE1hY09TLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorCQkJcmV0dXJuIGFyZ3VtZW50c1snLS0tLSddCisKKwlkZWYgXzI2XyhzZWxmLCBvYmplY3QsICphcmd1bWVudHMpOgorCQkiIiImOiBDb25jYXRlbmF0aW9uCisJCVJlcXVpcmVkIGFyZ3VtZW50OiBhbiBBRSBvYmplY3QgcmVmZXJlbmNlCisJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKwkJUmV0dXJuczogYW55dGhpbmcKKwkJIiIiCisJCV9jb2RlID0gJ2FzY3InCisJCV9zdWJjb2RlID0gJ2NjYXQnCisKKwkJaWYgbGVuKGFyZ3VtZW50cykgPiAxOgorCQkJcmFpc2UgVHlwZUVycm9yLCAnVG9vIG1hbnkgYXJndW1lbnRzJworCQlpZiBhcmd1bWVudHM6CisJCQlhcmd1bWVudHMgPSBhcmd1bWVudHNbMF0KKwkJCWlmIHR5cGUoYXJndW1lbnRzKSA8PiB0eXBlKHt9KToKKwkJCQlyYWlzZSBUeXBlRXJyb3IsICdNdXN0IGJlIGEgbWFwcGluZycKKwkJZWxzZToKKwkJCWFyZ3VtZW50cyA9IHt9CisJCWFyZ3VtZW50c1snLS0tLSddID0gb2JqZWN0CisKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ19hdHRyaWJ1dGVzJyk6CisJCQlhdHRyaWJ1dGVzID0gYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCQlkZWwgYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCWVsc2U6CisJCQlhdHRyaWJ1dGVzID0ge30KKworCisJCXJlcGx5LCBhcmd1bWVudHMsIGF0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorCQkJCWFyZ3VtZW50cywgYXR0cmlidXRlcykKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKwkJCXJhaXNlIE1hY09TLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorCQkJcmV0dXJuIGFyZ3VtZW50c1snLS0tLSddCisKKwlkZWYgc3RhcnRzX3dpdGgoc2VsZiwgb2JqZWN0LCAqYXJndW1lbnRzKToKKwkJIiIic3RhcnRzIHdpdGg6IFN0YXJ0cyB3aXRoCisJCVJlcXVpcmVkIGFyZ3VtZW50OiBhbiBBRSBvYmplY3QgcmVmZXJlbmNlCisJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKwkJUmV0dXJuczogYW55dGhpbmcKKwkJIiIiCisJCV9jb2RlID0gJ2FzY3InCisJCV9zdWJjb2RlID0gJ2Jnd3QnCisKKwkJaWYgbGVuKGFyZ3VtZW50cykgPiAxOgorCQkJcmFpc2UgVHlwZUVycm9yLCAnVG9vIG1hbnkgYXJndW1lbnRzJworCQlpZiBhcmd1bWVudHM6CisJCQlhcmd1bWVudHMgPSBhcmd1bWVudHNbMF0KKwkJCWlmIHR5cGUoYXJndW1lbnRzKSA8PiB0eXBlKHt9KToKKwkJCQlyYWlzZSBUeXBlRXJyb3IsICdNdXN0IGJlIGEgbWFwcGluZycKKwkJZWxzZToKKwkJCWFyZ3VtZW50cyA9IHt9CisJCWFyZ3VtZW50c1snLS0tLSddID0gb2JqZWN0CisKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ19hdHRyaWJ1dGVzJyk6CisJCQlhdHRyaWJ1dGVzID0gYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCQlkZWwgYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCWVsc2U6CisJCQlhdHRyaWJ1dGVzID0ge30KKworCisJCXJlcGx5LCBhcmd1bWVudHMsIGF0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorCQkJCWFyZ3VtZW50cywgYXR0cmlidXRlcykKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKwkJCXJhaXNlIE1hY09TLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorCQkJcmV0dXJuIGFyZ3VtZW50c1snLS0tLSddCisKKwlkZWYgZW5kc193aXRoKHNlbGYsIG9iamVjdCwgKmFyZ3VtZW50cyk6CisJCSIiImVuZHMgd2l0aDogRW5kcyB3aXRoCisJCVJlcXVpcmVkIGFyZ3VtZW50OiBhbiBBRSBvYmplY3QgcmVmZXJlbmNlCisJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKwkJUmV0dXJuczogYW55dGhpbmcKKwkJIiIiCisJCV9jb2RlID0gJ2FzY3InCisJCV9zdWJjb2RlID0gJ2VuZHMnCisKKwkJaWYgbGVuKGFyZ3VtZW50cykgPiAxOgorCQkJcmFpc2UgVHlwZUVycm9yLCAnVG9vIG1hbnkgYXJndW1lbnRzJworCQlpZiBhcmd1bWVudHM6CisJCQlhcmd1bWVudHMgPSBhcmd1bWVudHNbMF0KKwkJCWlmIHR5cGUoYXJndW1lbnRzKSA8PiB0eXBlKHt9KToKKwkJCQlyYWlzZSBUeXBlRXJyb3IsICdNdXN0IGJlIGEgbWFwcGluZycKKwkJZWxzZToKKwkJCWFyZ3VtZW50cyA9IHt9CisJCWFyZ3VtZW50c1snLS0tLSddID0gb2JqZWN0CisKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ19hdHRyaWJ1dGVzJyk6CisJCQlhdHRyaWJ1dGVzID0gYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCQlkZWwgYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCWVsc2U6CisJCQlhdHRyaWJ1dGVzID0ge30KKworCisJCXJlcGx5LCBhcmd1bWVudHMsIGF0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorCQkJCWFyZ3VtZW50cywgYXR0cmlidXRlcykKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKwkJCXJhaXNlIE1hY09TLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorCQkJcmV0dXJuIGFyZ3VtZW50c1snLS0tLSddCisKKwlkZWYgY29udGFpbnMoc2VsZiwgb2JqZWN0LCAqYXJndW1lbnRzKToKKwkJIiIiY29udGFpbnM6IENvbnRhaW5tZW50CisJCVJlcXVpcmVkIGFyZ3VtZW50OiBhbiBBRSBvYmplY3QgcmVmZXJlbmNlCisJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKwkJUmV0dXJuczogYW55dGhpbmcKKwkJIiIiCisJCV9jb2RlID0gJ2FzY3InCisJCV9zdWJjb2RlID0gJ2NvbnQnCisKKwkJaWYgbGVuKGFyZ3VtZW50cykgPiAxOgorCQkJcmFpc2UgVHlwZUVycm9yLCAnVG9vIG1hbnkgYXJndW1lbnRzJworCQlpZiBhcmd1bWVudHM6CisJCQlhcmd1bWVudHMgPSBhcmd1bWVudHNbMF0KKwkJCWlmIHR5cGUoYXJndW1lbnRzKSA8PiB0eXBlKHt9KToKKwkJCQlyYWlzZSBUeXBlRXJyb3IsICdNdXN0IGJlIGEgbWFwcGluZycKKwkJZWxzZToKKwkJCWFyZ3VtZW50cyA9IHt9CisJCWFyZ3VtZW50c1snLS0tLSddID0gb2JqZWN0CisKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ19hdHRyaWJ1dGVzJyk6CisJCQlhdHRyaWJ1dGVzID0gYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCQlkZWwgYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCWVsc2U6CisJCQlhdHRyaWJ1dGVzID0ge30KKworCisJCXJlcGx5LCBhcmd1bWVudHMsIGF0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorCQkJCWFyZ3VtZW50cywgYXR0cmlidXRlcykKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKwkJCXJhaXNlIE1hY09TLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorCQkJcmV0dXJuIGFyZ3VtZW50c1snLS0tLSddCisKKwlkZWYgX2FuZChzZWxmLCBvYmplY3QsICphcmd1bWVudHMpOgorCQkiIiJhbmQ6IExvZ2ljYWwgY29uanVuY3Rpb24KKwkJUmVxdWlyZWQgYXJndW1lbnQ6IGFuIEFFIG9iamVjdCByZWZlcmVuY2UKKwkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorCQlSZXR1cm5zOiBhbnl0aGluZworCQkiIiIKKwkJX2NvZGUgPSAnYXNjcicKKwkJX3N1YmNvZGUgPSAnQU5EICcKKworCQlpZiBsZW4oYXJndW1lbnRzKSA+IDE6CisJCQlyYWlzZSBUeXBlRXJyb3IsICdUb28gbWFueSBhcmd1bWVudHMnCisJCWlmIGFyZ3VtZW50czoKKwkJCWFyZ3VtZW50cyA9IGFyZ3VtZW50c1swXQorCQkJaWYgdHlwZShhcmd1bWVudHMpIDw+IHR5cGUoe30pOgorCQkJCXJhaXNlIFR5cGVFcnJvciwgJ011c3QgYmUgYSBtYXBwaW5nJworCQllbHNlOgorCQkJYXJndW1lbnRzID0ge30KKwkJYXJndW1lbnRzWyctLS0tJ10gPSBvYmplY3QKKworCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnX2F0dHJpYnV0ZXMnKToKKwkJCWF0dHJpYnV0ZXMgPSBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJCWRlbCBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJZWxzZToKKwkJCWF0dHJpYnV0ZXMgPSB7fQorCisKKwkJcmVwbHksIGFyZ3VtZW50cywgYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisJCQkJYXJndW1lbnRzLCBhdHRyaWJ1dGVzKQorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorCQkJcmFpc2UgTWFjT1MuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJndW1lbnRzKQorCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisJCQlyZXR1cm4gYXJndW1lbnRzWyctLS0tJ10KKworCWRlZiBfb3Ioc2VsZiwgb2JqZWN0LCAqYXJndW1lbnRzKToKKwkJIiIib3I6IExvZ2ljYWwgZGlzanVuY3Rpb24KKwkJUmVxdWlyZWQgYXJndW1lbnQ6IGFuIEFFIG9iamVjdCByZWZlcmVuY2UKKwkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorCQlSZXR1cm5zOiBhbnl0aGluZworCQkiIiIKKwkJX2NvZGUgPSAnYXNjcicKKwkJX3N1YmNvZGUgPSAnT1IgICcKKworCQlpZiBsZW4oYXJndW1lbnRzKSA+IDE6CisJCQlyYWlzZSBUeXBlRXJyb3IsICdUb28gbWFueSBhcmd1bWVudHMnCisJCWlmIGFyZ3VtZW50czoKKwkJCWFyZ3VtZW50cyA9IGFyZ3VtZW50c1swXQorCQkJaWYgdHlwZShhcmd1bWVudHMpIDw+IHR5cGUoe30pOgorCQkJCXJhaXNlIFR5cGVFcnJvciwgJ011c3QgYmUgYSBtYXBwaW5nJworCQllbHNlOgorCQkJYXJndW1lbnRzID0ge30KKwkJYXJndW1lbnRzWyctLS0tJ10gPSBvYmplY3QKKworCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnX2F0dHJpYnV0ZXMnKToKKwkJCWF0dHJpYnV0ZXMgPSBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJCWRlbCBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJZWxzZToKKwkJCWF0dHJpYnV0ZXMgPSB7fQorCisKKwkJcmVwbHksIGFyZ3VtZW50cywgYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisJCQkJYXJndW1lbnRzLCBhdHRyaWJ1dGVzKQorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorCQkJcmFpc2UgTWFjT1MuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJndW1lbnRzKQorCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisJCQlyZXR1cm4gYXJndW1lbnRzWyctLS0tJ10KKworCWRlZiBhcyhzZWxmLCBvYmplY3QsICphcmd1bWVudHMpOgorCQkiIiJhczogQ29lcmNpb24KKwkJUmVxdWlyZWQgYXJndW1lbnQ6IGFuIEFFIG9iamVjdCByZWZlcmVuY2UKKwkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorCQlSZXR1cm5zOiBhbnl0aGluZworCQkiIiIKKwkJX2NvZGUgPSAnYXNjcicKKwkJX3N1YmNvZGUgPSAnY29lcicKKworCQlpZiBsZW4oYXJndW1lbnRzKSA+IDE6CisJCQlyYWlzZSBUeXBlRXJyb3IsICdUb28gbWFueSBhcmd1bWVudHMnCisJCWlmIGFyZ3VtZW50czoKKwkJCWFyZ3VtZW50cyA9IGFyZ3VtZW50c1swXQorCQkJaWYgdHlwZShhcmd1bWVudHMpIDw+IHR5cGUoe30pOgorCQkJCXJhaXNlIFR5cGVFcnJvciwgJ011c3QgYmUgYSBtYXBwaW5nJworCQllbHNlOgorCQkJYXJndW1lbnRzID0ge30KKwkJYXJndW1lbnRzWyctLS0tJ10gPSBvYmplY3QKKworCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnX2F0dHJpYnV0ZXMnKToKKwkJCWF0dHJpYnV0ZXMgPSBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJCWRlbCBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJZWxzZToKKwkJCWF0dHJpYnV0ZXMgPSB7fQorCisKKwkJcmVwbHksIGFyZ3VtZW50cywgYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisJCQkJYXJndW1lbnRzLCBhdHRyaWJ1dGVzKQorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorCQkJcmFpc2UgTWFjT1MuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJndW1lbnRzKQorCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisJCQlyZXR1cm4gYXJndW1lbnRzWyctLS0tJ10KKworCWRlZiBfbm90KHNlbGYsIG9iamVjdCwgKmFyZ3VtZW50cyk6CisJCSIiIm5vdDogTG9naWNhbCBuZWdhdGlvbgorCQlSZXF1aXJlZCBhcmd1bWVudDogYW4gQUUgb2JqZWN0IHJlZmVyZW5jZQorCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisJCVJldHVybnM6IGFueXRoaW5nCisJCSIiIgorCQlfY29kZSA9ICdhc2NyJworCQlfc3ViY29kZSA9ICdOT1QgJworCisJCWlmIGxlbihhcmd1bWVudHMpID4gMToKKwkJCXJhaXNlIFR5cGVFcnJvciwgJ1RvbyBtYW55IGFyZ3VtZW50cycKKwkJaWYgYXJndW1lbnRzOgorCQkJYXJndW1lbnRzID0gYXJndW1lbnRzWzBdCisJCQlpZiB0eXBlKGFyZ3VtZW50cykgPD4gdHlwZSh7fSk6CisJCQkJcmFpc2UgVHlwZUVycm9yLCAnTXVzdCBiZSBhIG1hcHBpbmcnCisJCWVsc2U6CisJCQlhcmd1bWVudHMgPSB7fQorCQlhcmd1bWVudHNbJy0tLS0nXSA9IG9iamVjdAorCisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCdfYXR0cmlidXRlcycpOgorCQkJYXR0cmlidXRlcyA9IGFyZ3VtZW50c1snX2F0dHJpYnV0ZXMnXQorCQkJZGVsIGFyZ3VtZW50c1snX2F0dHJpYnV0ZXMnXQorCQllbHNlOgorCQkJYXR0cmlidXRlcyA9IHt9CisKKworCQlyZXBseSwgYXJndW1lbnRzLCBhdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKwkJCQlhcmd1bWVudHMsIGF0dHJpYnV0ZXMpCisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisJCQlyYWlzZSBNYWNPUy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmd1bWVudHMpCisJCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKwkJCXJldHVybiBhcmd1bWVudHNbJy0tLS0nXQorCisJZGVmIG5lZ2F0ZShzZWxmLCBvYmplY3QsICphcmd1bWVudHMpOgorCQkiIiJuZWdhdGU6IE51bWVyaWMgbmVnYXRpb24KKwkJUmVxdWlyZWQgYXJndW1lbnQ6IGFuIEFFIG9iamVjdCByZWZlcmVuY2UKKwkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorCQlSZXR1cm5zOiBhbnl0aGluZworCQkiIiIKKwkJX2NvZGUgPSAnYXNjcicKKwkJX3N1YmNvZGUgPSAnbmVnICcKKworCQlpZiBsZW4oYXJndW1lbnRzKSA+IDE6CisJCQlyYWlzZSBUeXBlRXJyb3IsICdUb28gbWFueSBhcmd1bWVudHMnCisJCWlmIGFyZ3VtZW50czoKKwkJCWFyZ3VtZW50cyA9IGFyZ3VtZW50c1swXQorCQkJaWYgdHlwZShhcmd1bWVudHMpIDw+IHR5cGUoe30pOgorCQkJCXJhaXNlIFR5cGVFcnJvciwgJ011c3QgYmUgYSBtYXBwaW5nJworCQllbHNlOgorCQkJYXJndW1lbnRzID0ge30KKwkJYXJndW1lbnRzWyctLS0tJ10gPSBvYmplY3QKKworCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnX2F0dHJpYnV0ZXMnKToKKwkJCWF0dHJpYnV0ZXMgPSBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJCWRlbCBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJZWxzZToKKwkJCWF0dHJpYnV0ZXMgPSB7fQorCisKKwkJcmVwbHksIGFyZ3VtZW50cywgYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisJCQkJYXJndW1lbnRzLCBhdHRyaWJ1dGVzKQorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorCQkJcmFpc2UgTWFjT1MuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJndW1lbnRzKQorCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisJCQlyZXR1cm4gYXJndW1lbnRzWyctLS0tJ10KKworCisjICAgIENsYXNzICcnICgndW5kZicpIC0tICd0aGUgdW5kZWZpbmVkIHZhbHVlJworCisjICAgIENsYXNzICd1cHBlciBjYXNlJyAoJ2Nhc2UnKSAtLSAnVGV4dCB3aXRoIGxvd2VyIGNhc2UgY29udmVydGVkIHRvIHVwcGVyIGNhc2UnCisKKyMgICAgQ2xhc3MgJ21hY2hpbmVzJyAoJ21hY2gnKSAtLSAnZXZlcnkgY29tcHV0ZXInCisjICAgICAgICBwcm9wZXJ0eSAnJyAoJ2NAIyEnKSAndHlwZScgLS0gJycgWzBdCisKKyMgICAgQ2xhc3MgJ21hY2hpbmUnICgnbWFjaCcpIC0tICdBIGNvbXB1dGVyJworCisjICAgIENsYXNzICd6b25lcycgKCd6b25lJykgLS0gJ2V2ZXJ5IEFwcGxlVGFsayB6b25lJworIyAgICAgICAgcHJvcGVydHkgJycgKCdjQCMhJykgJ3R5cGUnIC0tICcnIFswXQorCisjICAgIENsYXNzICd6b25lJyAoJ3pvbmUnKSAtLSAnQXBwbGVUYWxrIHpvbmUnCisKKyMgICAgQ2xhc3MgJ3NlY29uZHMnICgnc2NuZCcpIC0tICdtb3JlIHRoYW4gb25lIHNlY29uZCcKKworIyAgICBDbGFzcyAnaXRlbScgKCdjb2JqJykgLS0gJ0FuIGl0ZW0gb2YgYW55IHR5cGUnCisjICAgICAgICBwcm9wZXJ0eSAnaWQnICgnSUQgICcpICdsb25nJyAtLSAndGhlIHVuaXF1ZSBpZCBudW1iZXIgb2YgdGhpcyBvYmplY3QnIFttdXRhYmxlXQorCisjICAgIENsYXNzICdpdGVtcycgKCdjb2JqJykgLS0gJ0V2ZXJ5IGl0ZW0nCisjICAgICAgICBwcm9wZXJ0eSAnJyAoJ2NAIyEnKSAndHlwZScgLS0gJycgWzBdCisKKyMgICAgQ2xhc3MgJ3RleHQgaXRlbXMnICgnY2l0bScpIC0tICcnCisjICAgICAgICBwcm9wZXJ0eSAnJyAoJ2NAIyEnKSAndHlwZScgLS0gJycgWzBdCisKKyMgICAgQ2xhc3MgJ3RleHQgaXRlbScgKCdjaXRtJykgLS0gJycKKworIyAgICBDbGFzcyAnZGF0ZScgKCdsZHQgJykgLS0gJ0Fic29sdXRlIGRhdGUgYW5kIHRpbWUgdmFsdWVzJworIyAgICAgICAgcHJvcGVydHkgJ3dlZWtkYXknICgnd2tkeScpICd3a2R5JyAtLSAndGhlIGRheSBvZiBhIHdlZWsgb2YgYSBkYXRlJyBbXQorIyAgICAgICAgcHJvcGVydHkgJ21vbnRoJyAoJ21udGgnKSAnbW50aCcgLS0gJ3RoZSBtb250aCBvZiBhIGRhdGUnIFtdCisjICAgICAgICBwcm9wZXJ0eSAnZGF5JyAoJ2RheSAnKSAnbG9uZycgLS0gJ3RoZSBkYXkgb2YgdGhlIG1vbnRoIG9mIGEgZGF0ZScgW10KKyMgICAgICAgIHByb3BlcnR5ICd5ZWFyJyAoJ3llYXInKSAnbG9uZycgLS0gJ3RoZSB5ZWFyIG9mIGEgZGF0ZScgW10KKyMgICAgICAgIHByb3BlcnR5ICd0aW1lJyAoJ3RpbWUnKSAnbG9uZycgLS0gJ3RoZSB0aW1lIHNpbmNlIG1pZG5pZ2h0IG9mIGEgZGF0ZScgW10KKyMgICAgICAgIHByb3BlcnR5ICdkYXRlIHN0cmluZycgKCdkc3RyJykgJ1RFWFQnIC0tICd0aGUgZGF0ZSBwb3J0aW9uIG9mIGEgZGF0ZS10aW1lIHZhbHVlIGFzIGEgc3RyaW5nJyBbXQorIyAgICAgICAgcHJvcGVydHkgJ3RpbWUgc3RyaW5nJyAoJ3RzdHInKSAnVEVYVCcgLS0gJ3RoZSB0aW1lIHBvcnRpb24gb2YgYSBkYXRlLXRpbWUgdmFsdWUgYXMgYSBzdHJpbmcnIFtdCisKKyMgICAgQ2xhc3MgJ2RhdGVzJyAoJ2xkdCAnKSAtLSAnZXZlcnkgZGF0ZScKKyMgICAgICAgIHByb3BlcnR5ICcnICgnY0AjIScpICd0eXBlJyAtLSAnJyBbMF0KKworIyAgICBDbGFzcyAnbW9udGgnICgnbW50aCcpIC0tICdhIG1vbnRoJworCisjICAgIENsYXNzICdtb250aHMnICgnbW50aCcpIC0tICdldmVyeSBtb250aCcKKyMgICAgICAgIHByb3BlcnR5ICcnICgnY0AjIScpICd0eXBlJyAtLSAnJyBbMF0KKworIyAgICBDbGFzcyAnSmFudWFyeScgKCdqYW4gJykgLS0gIkl0J3MgSnVuZSBpbiBKYW51YXJ5Li4uIgorCisjICAgIENsYXNzICdGZWJydWFyeScgKCdmZWIgJykgLS0gJ3RoZSBtb250aCBvZiBGZWJydWFyeScKKworIyAgICBDbGFzcyAnTWFyY2gnICgnbWFyICcpIC0tICd0aGUgbW9udGggb2YgTWFyY2gnCisKKyMgICAgQ2xhc3MgJ0FwcmlsJyAoJ2FwciAnKSAtLSAndGhlIG1vbnRoIG9mIEFwcmlsJworCisjICAgIENsYXNzICdNYXknICgnbWF5ICcpIC0tICd0aGUgdmVyeSBtZXJyeSBtb250aCBvZiBNYXknCisKKyMgICAgQ2xhc3MgJ0p1bmUnICgnanVuICcpIC0tICd0aGUgbW9udGggb2YgSnVuZScKKworIyAgICBDbGFzcyAnSnVseScgKCdqdWwgJykgLS0gJ3RoZSBtb250aCBvZiBKdWx5JworCisjICAgIENsYXNzICdBdWd1c3QnICgnYXVnICcpIC0tICd0aGUgbW9udGggb2YgQXVndXN0JworCisjICAgIENsYXNzICdTZXB0ZW1iZXInICgnc2VwICcpIC0tICd0aGUgbW9udGggb2YgU2VwdGVtYmVyJworCisjICAgIENsYXNzICdPY3RvYmVyJyAoJ29jdCAnKSAtLSAndGhlIG1vbnRoIG9mIE9jdG9iZXInCisKKyMgICAgQ2xhc3MgJ05vdmVtYmVyJyAoJ25vdiAnKSAtLSAndGhlIG1vbnRoIG9mIE5vdmVtYmVyJworCisjICAgIENsYXNzICdEZWNlbWJlcicgKCdkZWMgJykgLS0gJ3RoZSBtb250aCBvZiBEZWNlbWJlcicKKworIyAgICBDbGFzcyAnd2Vla2RheScgKCd3a2R5JykgLS0gJ2Egd2Vla2RheScKKworIyAgICBDbGFzcyAnd2Vla2RheXMnICgnd2tkeScpIC0tICdldmVyeSB3ZWVrZGF5JworIyAgICAgICAgcHJvcGVydHkgJycgKCdjQCMhJykgJ3R5cGUnIC0tICcnIFswXQorCisjICAgIENsYXNzICdTdW5kYXknICgnc3VuICcpIC0tICdTdW5kYXkgQmxvb2R5IFN1bmRheScKKworIyAgICBDbGFzcyAnTW9uZGF5JyAoJ21vbiAnKSAtLSAnQmx1ZSBNb25kYXknCisKKyMgICAgQ2xhc3MgJ1R1ZXNkYXknICgndHVlICcpIC0tICdSdWJ5IFR1ZXNkYXknCisKKyMgICAgQ2xhc3MgJ1dlZG5lc2RheScgKCd3ZWQgJykgLS0gJ1dlZG5lc2RheSBXZWVrJworCisjICAgIENsYXNzICdUaHVyc2RheScgKCd0aHUgJykgLS0gJ1RodXJzZGF5IEFmdGVybm9vbicKKworIyAgICBDbGFzcyAnRnJpZGF5JyAoJ2ZyaSAnKSAtLSAnRnJpZGF5JworCisjICAgIENsYXNzICdTYXR1cmRheScgKCdzYXQgJykgLS0gIlNhdHVyZGF5IE5pZ2h0J3MgQWxyaWdodCBmb3IgRmlnaHRpbmciCisKKyMgICAgQ2xhc3MgJ1JHQiBjb2xvcicgKCdjUkdCJykgLS0gJ1RocmVlIG51bWJlcnMgc3BlY2lmeWluZyByZWQsIGdyZWVuLCBibHVlIGNvbG9yIHZhbHVlcycKKworIyAgICBDbGFzcyAnUkdCIGNvbG9ycycgKCdjUkdCJykgLS0gJ2V2ZXJ5IFJHQiBjb2xvcicKKyMgICAgICAgIHByb3BlcnR5ICcnICgnY0AjIScpICd0eXBlJyAtLSAnJyBbMF0KKworIyAgICBDbGFzcyAnaW50ZWdlcicgKCdsb25nJykgLS0gJ0FuIGludGVncmFsIG51bWJlcicKKworIyAgICBDbGFzcyAnaW50ZWdlcnMnICgnbG9uZycpIC0tICdldmVyeSBpbnRlZ2VyJworIyAgICAgICAgcHJvcGVydHkgJycgKCdjQCMhJykgJ3R5cGUnIC0tICcnIFswXQorCisjICAgIENsYXNzICdib29sZWFuJyAoJ2Jvb2wnKSAtLSAnQSB0cnVlIG9yIGZhbHNlIHZhbHVlJworCisjICAgIENsYXNzICdib29sZWFucycgKCdib29sJykgLS0gJ2V2ZXJ5IGJvb2xlYW4nCisjICAgICAgICBwcm9wZXJ0eSAnJyAoJ2NAIyEnKSAndHlwZScgLS0gJycgWzBdCisKKyMgICAgQ2xhc3MgJ3JlYWwnICgnZG91YicpIC0tICdBIHJlYWwgbnVtYmVyJworCisjICAgIENsYXNzICdyZWFscycgKCdkb3ViJykgLS0gJ2V2ZXJ5IHJlYWwnCisjICAgICAgICBwcm9wZXJ0eSAnJyAoJ2NAIyEnKSAndHlwZScgLS0gJycgWzBdCisKKyMgICAgQ2xhc3MgJ2xpc3QnICgnbGlzdCcpIC0tICdBbiBvcmRlcmVkIGNvbGxlY3Rpb24gb2YgaXRlbXMnCisjICAgICAgICBwcm9wZXJ0eSAnbGVuZ3RoJyAoJ2xlbmcnKSAnbG9uZycgLS0gJ3RoZSBsZW5ndGggb2YgYSBsaXN0JyBbXQorCisjICAgIENsYXNzICdsaXN0cycgKCdsaXN0JykgLS0gJ2V2ZXJ5IGxpc3QnCisjICAgICAgICBwcm9wZXJ0eSAnJyAoJ2NAIyEnKSAndHlwZScgLS0gJycgWzBdCisKKyMgICAgQ2xhc3MgJ2xpbmtlZCBsaXN0JyAoJ2xsc3QnKSAtLSAnQW4gb3JkZXJlZCBjb2xsZWN0aW9uIG9mIGl0ZW1zJworIyAgICAgICAgcHJvcGVydHkgJ2xlbmd0aCcgKCdsZW5nJykgJ2xvbmcnIC0tICd0aGUgbGVuZ3RoIG9mIGEgbGlzdCcgW10KKworIyAgICBDbGFzcyAnbGlua2VkIGxpc3RzJyAoJ2xsc3QnKSAtLSAnZXZlcnkgbGlua2VkIGxpc3QnCisjICAgICAgICBwcm9wZXJ0eSAnJyAoJ2NAIyEnKSAndHlwZScgLS0gJycgWzBdCisKKyMgICAgQ2xhc3MgJ3ZlY3RvcicgKCd2ZWN0JykgLS0gJ0FuIG9yZGVyZWQgY29sbGVjdGlvbiBvZiBpdGVtcycKKyMgICAgICAgIHByb3BlcnR5ICdsZW5ndGgnICgnbGVuZycpICdsb25nJyAtLSAndGhlIGxlbmd0aCBvZiBhIGxpc3QnIFtdCisKKyMgICAgQ2xhc3MgJ3ZlY3RvcnMnICgndmVjdCcpIC0tICdldmVyeSB2ZWN0b3InCisjICAgICAgICBwcm9wZXJ0eSAnJyAoJ2NAIyEnKSAndHlwZScgLS0gJycgWzBdCisKKyMgICAgQ2xhc3MgJ3JlY29yZCcgKCdyZWNvJykgLS0gJ0Egc2V0IG9mIGxhYmVsZWQgaXRlbXMnCisKKyMgICAgQ2xhc3MgJ3JlY29yZHMnICgncmVjbycpIC0tICdldmVyeSByZWNvcmQnCisjICAgICAgICBwcm9wZXJ0eSAnJyAoJ2NAIyEnKSAndHlwZScgLS0gJycgWzBdCisKKyMgICAgQ2xhc3MgJ3NjcmlwdCcgKCdzY3B0JykgLS0gJ0FuIEFwcGxlU2NyaXB0IHNjcmlwdCcKKyMgICAgICAgIHByb3BlcnR5ICdwYXJlbnQnICgncGFyZScpICdzY3B0JyAtLSAndGhlIHBhcmVudCBvZiBhIHNjcmlwdCcgW10KKworIyAgICBDbGFzcyAnc2NyaXB0cycgKCdzY3B0JykgLS0gJ2V2ZXJ5IHNjcmlwdCcKKyMgICAgICAgIHByb3BlcnR5ICcnICgnY0AjIScpICd0eXBlJyAtLSAnJyBbMF0KKworIyAgICBDbGFzcyAnc3RyaW5nJyAoJ1RFWFQnKSAtLSAnYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzJworCisjICAgIENsYXNzICdzdHJpbmdzJyAoJ1RFWFQnKSAtLSAnZXZlcnkgc3RyaW5nJworIyAgICAgICAgcHJvcGVydHkgJycgKCdjQCMhJykgJ3R5cGUnIC0tICcnIFswXQorCisjICAgIENsYXNzICdzdHlsZWQgdGV4dCcgKCdTVFhUJykgLS0gJ2Egc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyB3aXRoIHN0eWxlJworIyAgICAgICAgcHJvcGVydHkgJycgKCdjQCMhJykgJ3R5cGUnIC0tICcnIFswXQorCisjICAgIENsYXNzICdudW1iZXInICgnbm1icicpIC0tICdhbiBpbnRlZ2VyIG9yIGZsb2F0aW5nIHBvaW50IG51bWJlcicKKworIyAgICBDbGFzcyAnbnVtYmVycycgKCdubWJyJykgLS0gJ2V2ZXJ5IG51bWJlcicKKyMgICAgICAgIHByb3BlcnR5ICcnICgnY0AjIScpICd0eXBlJyAtLSAnJyBbMF0KKworIyAgICBDbGFzcyAnY2xhc3MnICgncGNscycpIC0tICd0aGUgdHlwZSBvZiBhIHZhbHVlJworIyAgICAgICAgcHJvcGVydHkgJ2luaGVyaXRzJyAoJ2NAI14nKSAncGNscycgLS0gJ2NsYXNzZXMgdG8gaW5oZXJpdCBwcm9wZXJ0aWVzIGZyb20nIFtdCisKKyMgICAgQ2xhc3MgJ2NsYXNzZXMnICgncGNscycpIC0tICdldmVyeSBjbGFzcycKKyMgICAgICAgIHByb3BlcnR5ICcnICgnY0AjIScpICd0eXBlJyAtLSAnJyBbMF0KKworIyAgICBDbGFzcyAnZXZlbnQnICgnZXZudCcpIC0tICdhbiBBcHBsZUV2ZW50cyBldmVudCcKKworIyAgICBDbGFzcyAnZXZlbnRzJyAoJ2V2bnQnKSAtLSAnZXZlcnkgZXZlbnQnCisjICAgICAgICBwcm9wZXJ0eSAnJyAoJ2NAIyEnKSAndHlwZScgLS0gJycgWzBdCisKKyMgICAgQ2xhc3MgJ3Byb3BlcnR5JyAoJ3Byb3AnKSAtLSAnYW4gQXBwbGVFdmVudHMgcHJvcGVydHknCisKKyMgICAgQ2xhc3MgJ3Byb3BlcnRpZXMnICgncHJvcCcpIC0tICdldmVyeSBwcm9wZXJ0eScKKyMgICAgICAgIHByb3BlcnR5ICcnICgnY0AjIScpICd0eXBlJyAtLSAnJyBbMF0KKworIyAgICBDbGFzcyAnY29uc3RhbnQnICgnZW51bScpIC0tICdBIGNvbnN0YW50IHZhbHVlJworCisjICAgIENsYXNzICdjb25zdGFudHMnICgnZW51bScpIC0tICdldmVyeSBjb25zdGFudCcKKyMgICAgICAgIHByb3BlcnR5ICcnICgnY0AjIScpICd0eXBlJyAtLSAnJyBbMF0KKworIyAgICBDbGFzcyAncHJlcG9zaXRpb24nICgncHJlcCcpIC0tICdhbiBBcHBsZUV2ZW50cyBwcmVwb3NpdGlvbicKKworIyAgICBDbGFzcyAncHJlcG9zaXRpb25zJyAoJ3ByZXAnKSAtLSAnZXZlcnkgcHJlcG9zaXRpb24nCisjICAgICAgICBwcm9wZXJ0eSAnJyAoJ2NAIyEnKSAndHlwZScgLS0gJycgWzBdCisKKyMgICAgQ2xhc3MgJ2tleScgKCdrZXlmJykgLS0gJ2FuIEFwcGxlRXZlbnRzIGtleSBmb3JtJworCisjICAgIENsYXNzICdrZXlzJyAoJ2tleWYnKSAtLSAnZXZlcnkga2V5JworIyAgICAgICAgcHJvcGVydHkgJycgKCdjQCMhJykgJ3R5cGUnIC0tICcnIFswXQorCisjICAgIENsYXNzICdwaWN0dXJlJyAoJ1BJQ1QnKSAtLSAnQSBwaWN0dXJlJworCisjICAgIENsYXNzICdwaWN0dXJlcycgKCdQSUNUJykgLS0gJ2V2ZXJ5IHBpY3R1cmUnCisjICAgICAgICBwcm9wZXJ0eSAnJyAoJ2NAIyEnKSAndHlwZScgLS0gJycgWzBdCisKKyMgICAgQ2xhc3MgJ3JlZmVyZW5jZScgKCdvYmogJykgLS0gJ0FuIEFwcGxlU2NyaXB0IHJlZmVyZW5jZScKKworIyAgICBDbGFzcyAncmVmZXJlbmNlcycgKCdvYmogJykgLS0gJ2V2ZXJ5IHJlZmVyZW5jZScKKyMgICAgICAgIHByb3BlcnR5ICcnICgnY0AjIScpICd0eXBlJyAtLSAnJyBbMF0KKworIyAgICBDbGFzcyAnZGF0YScgKCdyZGF0JykgLS0gJ0FuIEFwcGxlU2NyaXB0IHJhdyBkYXRhIG9iamVjdCcKKworIyAgICBDbGFzcyAnaGFuZGxlcicgKCdoYW5kJykgLS0gJ0FuIEFwcGxlU2NyaXB0IGhhbmRsZXInCisKKyMgICAgQ2xhc3MgJ2hhbmRsZXJzJyAoJ2hhbmQnKSAtLSAnZXZlcnkgaGFuZGxlcicKKyMgICAgICAgIHByb3BlcnR5ICcnICgnY0AjIScpICd0eXBlJyAtLSAnJyBbMF0KKworIyAgICBDbGFzcyAnbGlzdCBvciByZWNvcmQnICgnbHIgICcpIC0tICdhIGxpc3Qgb3IgcmVjb3JkJworCisjICAgIENsYXNzICdsaXN0IG9yIHN0cmluZycgKCdscyAgJykgLS0gJ2EgbGlzdCBvciBzdHJpbmcnCisKKyMgICAgQ2xhc3MgJ2xpc3QsIHJlY29yZCBvciB0ZXh0JyAoJ2xycyAnKSAtLSAnYSBsaXN0LCByZWNvcmQgb3IgdGV4dCcKKworIyAgICBDbGFzcyAnbnVtYmVyIG9yIGRhdGUnICgnbmQgICcpIC0tICdhIG51bWJlciBvciBkYXRlJworCisjICAgIENsYXNzICdudW1iZXIsIGRhdGUgb3IgdGV4dCcgKCduZHMgJykgLS0gJ2EgbnVtYmVyLCBkYXRlIG9yIHRleHQnCisKKyMgICAgQ2xhc3MgJ2FsaWFzJyAoJ2FsaXMnKSAtLSAnYSByZWZlcmVuY2UgdG8gYW4gZXhpc3RpbmcgZmlsZScKKworIyAgICBDbGFzcyAnYWxpYXNlcycgKCdhbGlzJykgLS0gJ2V2ZXJ5IGFsaWFzJworIyAgICAgICAgcHJvcGVydHkgJycgKCdjQCMhJykgJ3R5cGUnIC0tICcnIFswXQorCisjICAgIENsYXNzICdhcHBsaWNhdGlvbicgKCdjYXBwJykgLS0gJ3NwZWNpZmllcyBnbG9iYWwgcHJvcGVydGllcyBvZiBBcHBsZVNjcmlwdCcKKyMgICAgICAgIHByb3BlcnR5ICdyZXN1bHQnICgncnNsdCcpICdjb2JqJyAtLSAndGhlIGxhc3QgcmVzdWx0IG9mIGV2YWx1YXRpb24nIFtdCisjICAgICAgICBwcm9wZXJ0eSAnc3BhY2UnICgnc3BhYycpICdURVhUJyAtLSAnYSBzcGFjZSBjaGFyYWN0ZXInIFtdCisjICAgICAgICBwcm9wZXJ0eSAncmV0dXJuJyAoJ3JldCAnKSAnVEVYVCcgLS0gJ2EgcmV0dXJuIGNoYXJhY3RlcicgW10KKyMgICAgICAgIHByb3BlcnR5ICd0YWInICgndGFiICcpICdURVhUJyAtLSAnYSB0YWIgY2hhcmFjdGVyJyBbXQorIyAgICAgICAgcHJvcGVydHkgJ21pbnV0ZXMnICgnbWluICcpICdURVhUJyAtLSAndGhlIG51bWJlciBvZiBzZWNvbmRzIGluIGEgbWludXRlJyBbXQorIyAgICAgICAgcHJvcGVydHkgJ2hvdXJzJyAoJ2hvdXInKSAnVEVYVCcgLS0gJ3RoZSBudW1iZXIgb2Ygc2Vjb25kcyBpbiBhbiBob3VyJyBbXQorIyAgICAgICAgcHJvcGVydHkgJ2RheXMnICgnZGF5cycpICdURVhUJyAtLSAndGhlIG51bWJlciBvZiBzZWNvbmRzIGluIGEgZGF5JyBbXQorIyAgICAgICAgcHJvcGVydHkgJ3dlZWtzJyAoJ3dlZWsnKSAnVEVYVCcgLS0gJ3RoZSBudW1iZXIgb2Ygc2Vjb25kcyBpbiBhIHdlZWsnIFtdCisjICAgICAgICBwcm9wZXJ0eSAncGknICgncGkgICcpICdkb3ViJyAtLSAndGhlIGNvbnN0YW50IHBpJyBbXQorIyAgICAgICAgcHJvcGVydHkgJ3ByaW50IGxlbmd0aCcgKCdwcmxuJykgJ2xvbmcnIC0tICd0aGUgbWF4aW11bSBsZW5ndGggdG8gcHJpbnQnIFtdCisjICAgICAgICBwcm9wZXJ0eSAncHJpbnQgZGVwdGgnICgncHJkcCcpICdsb25nJyAtLSAndGhlIG1heGltdW0gZGVwdGggdG8gcHJpbnQnIFtdCisjICAgICAgICBwcm9wZXJ0eSAncmV2ZXJzZScgKCdydnNlJykgJ2xpc3QnIC0tICd0aGUgcmV2ZXJzZSBvZiBhIGxpc3QnIFtdCisjICAgICAgICBwcm9wZXJ0eSAncmVzdCcgKCdyZXN0JykgJ2xpc3QnIC0tICd0aGUgcmVzdCBvZiBhIGxpc3QnIFtdCisjICAgICAgICBwcm9wZXJ0eSAndGV4dCBpdGVtIGRlbGltaXRlcnMnICgndHhkbCcpICdsaXN0JyAtLSAndGhlIHRleHQgaXRlbSBkZWxpbWl0ZXJzIG9mIGEgc3RyaW5nJyBbXQorIyAgICAgICAgcHJvcGVydHkgJ0FwcGxlU2NyaXB0JyAoJ2FzY3InKSAnc2NwdCcgLS0gJ3RoZSB0b3AtbGV2ZWwgc2NyaXB0IG9iamVjdCcgW10KKworIyAgICBDbGFzcyAnYXBwbGljYXRpb25zJyAoJ2NhcHAnKSAtLSAnZXZlcnkgYXBwbGljYXRpb24nCisjICAgICAgICBwcm9wZXJ0eSAnJyAoJ2NAIyEnKSAndHlwZScgLS0gJycgWzBdCisKKyMgICAgQ2xhc3MgJ2FwcCcgKCdjYXBwJykgLS0gJ1Nob3J0IG5hbWUgZm9yIGFwcGxpY2F0aW9uJworCisjICAgIENsYXNzICd2ZXJzaW9uJyAoJ3ZlcnMnKSAtLSAnYSB2ZXJzaW9uIHZhbHVlJworCisjICAgIENsYXNzICd3cml0aW5nIGNvZGUgaW5mbycgKCdjaXRsJykgLS0gJ1NjcmlwdCBjb2RlIGFuZCBsYW5ndWFnZSBjb2RlIG9mIHRleHQgcnVuJworIyAgICAgICAgcHJvcGVydHkgJ3NjcmlwdCBjb2RlJyAoJ3BzY2QnKSAnc2hvcicgLS0gJ3RoZSBzY3JpcHQgY29kZSBmb3IgdGhlIHRleHQnIFtdCisjICAgICAgICBwcm9wZXJ0eSAnbGFuZ3VhZ2UgY29kZScgKCdwbGNkJykgJ3Nob3InIC0tICd0aGUgbGFuZ3VhZ2UgY29kZSBmb3IgdGhlIHRleHQnIFtdCisKKyMgICAgQ2xhc3MgJ3dyaXRpbmcgY29kZSBpbmZvcycgKCdjaXRsJykgLS0gJ2V2ZXJ5IHdyaXRpbmcgY29kZSBpbmZvJworIyAgICAgICAgcHJvcGVydHkgJycgKCdjQCMhJykgJ3R5cGUnIC0tICcnIFswXQpkaWZmIC0tZ2l0IGEvTWFjL0xpYi90b29sYm94L1JlcXVpcmVkX1N1aXRlLnB5IGIvTWFjL0xpYi90b29sYm94L1JlcXVpcmVkX1N1aXRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMzE3YzkKLS0tIC9kZXYvbnVsbAorKysgYi9NYWMvTGliL3Rvb2xib3gvUmVxdWlyZWRfU3VpdGUucHkKQEAgLTAsMCArMSwxNDcgQEAKKyIiIlN1aXRlIFJlcXVpcmVkIFN1aXRlOiBUZXJtcyB0aGF0IGV2ZXJ5IGFwcGxpY2F0aW9uIHNob3VsZCBzdXBwb3J0CitMZXZlbCAxLCB2ZXJzaW9uIDEKKworR2VuZXJhdGVkIGZyb20gTW9lczpTeXN0ZW0gZm9sZGVyOkV4dGVuc2lvbnM6U2NyaXB0aW5nIEFkZGl0aW9uczpEaWFsZWN0czpFbmdsaXNoIERpYWxlY3QKK0FFVEUvQUVVVCByZXNvdXJjZSB2ZXJzaW9uIDEvMCwgbGFuZ3VhZ2UgMCwgc2NyaXB0IDAKKyIiIgorCitpbXBvcnQgYWRkcGFjaworYWRkcGFjay5hZGRwYWNrKCdUb29scycpCithZGRwYWNrLmFkZHBhY2soJ2JnZW4nKQorYWRkcGFjay5hZGRwYWNrKCdhZScpCisKK2ltcG9ydCBhZXRvb2xzCitpbXBvcnQgTWFjT1MKKworX2NvZGUgPSAncmVxZCcKKworY2xhc3MgUmVxdWlyZWRfU3VpdGU6CisKKwlkZWYgb3BlbihzZWxmLCBvYmplY3QsICphcmd1bWVudHMpOgorCQkiIiJvcGVuOiBPcGVuIHRoZSBzcGVjaWZpZWQgb2JqZWN0KHMpCisJCVJlcXVpcmVkIGFyZ3VtZW50OiBsaXN0IG9mIG9iamVjdHMgdG8gb3BlbgorCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisJCSIiIgorCQlfY29kZSA9ICdhZXZ0JworCQlfc3ViY29kZSA9ICdvZG9jJworCisJCWlmIGxlbihhcmd1bWVudHMpID4gMToKKwkJCXJhaXNlIFR5cGVFcnJvciwgJ1RvbyBtYW55IGFyZ3VtZW50cycKKwkJaWYgYXJndW1lbnRzOgorCQkJYXJndW1lbnRzID0gYXJndW1lbnRzWzBdCisJCQlpZiB0eXBlKGFyZ3VtZW50cykgPD4gdHlwZSh7fSk6CisJCQkJcmFpc2UgVHlwZUVycm9yLCAnTXVzdCBiZSBhIG1hcHBpbmcnCisJCWVsc2U6CisJCQlhcmd1bWVudHMgPSB7fQorCQlhcmd1bWVudHNbJy0tLS0nXSA9IG9iamVjdAorCisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCdfYXR0cmlidXRlcycpOgorCQkJYXR0cmlidXRlcyA9IGFyZ3VtZW50c1snX2F0dHJpYnV0ZXMnXQorCQkJZGVsIGFyZ3VtZW50c1snX2F0dHJpYnV0ZXMnXQorCQllbHNlOgorCQkJYXR0cmlidXRlcyA9IHt9CisKKworCQlyZXBseSwgYXJndW1lbnRzLCBhdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKwkJCQlhcmd1bWVudHMsIGF0dHJpYnV0ZXMpCisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisJCQlyYWlzZSBNYWNPUy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmd1bWVudHMpCisJCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKwkJCXJldHVybiBhcmd1bWVudHNbJy0tLS0nXQorCisJZGVmIF9wcmludChzZWxmLCBvYmplY3QsICphcmd1bWVudHMpOgorCQkiIiJwcmludDogUHJpbnQgdGhlIHNwZWNpZmllZCBvYmplY3QocykKKwkJUmVxdWlyZWQgYXJndW1lbnQ6IGxpc3Qgb2Ygb2JqZWN0cyB0byBwcmludAorCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisJCSIiIgorCQlfY29kZSA9ICdhZXZ0JworCQlfc3ViY29kZSA9ICdwZG9jJworCisJCWlmIGxlbihhcmd1bWVudHMpID4gMToKKwkJCXJhaXNlIFR5cGVFcnJvciwgJ1RvbyBtYW55IGFyZ3VtZW50cycKKwkJaWYgYXJndW1lbnRzOgorCQkJYXJndW1lbnRzID0gYXJndW1lbnRzWzBdCisJCQlpZiB0eXBlKGFyZ3VtZW50cykgPD4gdHlwZSh7fSk6CisJCQkJcmFpc2UgVHlwZUVycm9yLCAnTXVzdCBiZSBhIG1hcHBpbmcnCisJCWVsc2U6CisJCQlhcmd1bWVudHMgPSB7fQorCQlhcmd1bWVudHNbJy0tLS0nXSA9IG9iamVjdAorCisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCdfYXR0cmlidXRlcycpOgorCQkJYXR0cmlidXRlcyA9IGFyZ3VtZW50c1snX2F0dHJpYnV0ZXMnXQorCQkJZGVsIGFyZ3VtZW50c1snX2F0dHJpYnV0ZXMnXQorCQllbHNlOgorCQkJYXR0cmlidXRlcyA9IHt9CisKKworCQlyZXBseSwgYXJndW1lbnRzLCBhdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKwkJCQlhcmd1bWVudHMsIGF0dHJpYnV0ZXMpCisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisJCQlyYWlzZSBNYWNPUy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmd1bWVudHMpCisJCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKwkJCXJldHVybiBhcmd1bWVudHNbJy0tLS0nXQorCisJZGVmIHF1aXQoc2VsZiwgKmFyZ3VtZW50cyk6CisJCSIiInF1aXQ6IFF1aXQgYXBwbGljYXRpb24KKwkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorCQkiIiIKKwkJX2NvZGUgPSAnYWV2dCcKKwkJX3N1YmNvZGUgPSAncXVpdCcKKworCQlpZiBsZW4oYXJndW1lbnRzKSA+IDE6CisJCQlyYWlzZSBUeXBlRXJyb3IsICdUb28gbWFueSBhcmd1bWVudHMnCisJCWlmIGFyZ3VtZW50czoKKwkJCWFyZ3VtZW50cyA9IGFyZ3VtZW50c1swXQorCQkJaWYgdHlwZShhcmd1bWVudHMpIDw+IHR5cGUoe30pOgorCQkJCXJhaXNlIFR5cGVFcnJvciwgJ011c3QgYmUgYSBtYXBwaW5nJworCQllbHNlOgorCQkJYXJndW1lbnRzID0ge30KKworCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnX2F0dHJpYnV0ZXMnKToKKwkJCWF0dHJpYnV0ZXMgPSBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJCWRlbCBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJZWxzZToKKwkJCWF0dHJpYnV0ZXMgPSB7fQorCisKKwkJcmVwbHksIGFyZ3VtZW50cywgYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisJCQkJYXJndW1lbnRzLCBhdHRyaWJ1dGVzKQorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorCQkJcmFpc2UgTWFjT1MuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJndW1lbnRzKQorCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisJCQlyZXR1cm4gYXJndW1lbnRzWyctLS0tJ10KKworCWRlZiBydW4oc2VsZiwgKmFyZ3VtZW50cyk6CisJCSIiInJ1bjogU2VudCB0byBhbiBhcHBsaWNhdGlvbiB3aGVuIGl0IGlzIGRvdWJsZS1jbGlja2VkCisJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKwkJIiIiCisJCV9jb2RlID0gJ2FldnQnCisJCV9zdWJjb2RlID0gJ29hcHAnCisKKwkJaWYgbGVuKGFyZ3VtZW50cykgPiAxOgorCQkJcmFpc2UgVHlwZUVycm9yLCAnVG9vIG1hbnkgYXJndW1lbnRzJworCQlpZiBhcmd1bWVudHM6CisJCQlhcmd1bWVudHMgPSBhcmd1bWVudHNbMF0KKwkJCWlmIHR5cGUoYXJndW1lbnRzKSA8PiB0eXBlKHt9KToKKwkJCQlyYWlzZSBUeXBlRXJyb3IsICdNdXN0IGJlIGEgbWFwcGluZycKKwkJZWxzZToKKwkJCWFyZ3VtZW50cyA9IHt9CisKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ19hdHRyaWJ1dGVzJyk6CisJCQlhdHRyaWJ1dGVzID0gYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCQlkZWwgYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCWVsc2U6CisJCQlhdHRyaWJ1dGVzID0ge30KKworCisJCXJlcGx5LCBhcmd1bWVudHMsIGF0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorCQkJCWFyZ3VtZW50cywgYXR0cmlidXRlcykKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKwkJCXJhaXNlIE1hY09TLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorCQkJcmV0dXJuIGFyZ3VtZW50c1snLS0tLSddCisKZGlmZiAtLWdpdCBhL01hYy9MaWIvdG9vbGJveC9TdGFuZGFyZF9TdWl0ZS5weSBiL01hYy9MaWIvdG9vbGJveC9TdGFuZGFyZF9TdWl0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTc5MDhiCi0tLSAvZGV2L251bGwKKysrIGIvTWFjL0xpYi90b29sYm94L1N0YW5kYXJkX1N1aXRlLnB5CkBAIC0wLDAgKzEsNjYzIEBACisiIiJTdWl0ZSBTdGFuZGFyZCBTdWl0ZTogQ29tbW9uIHRlcm1zIGZvciBtb3N0IGFwcGxpY2F0aW9ucworTGV2ZWwgMSwgdmVyc2lvbiAxCisKK0dlbmVyYXRlZCBmcm9tIE1vZXM6UHJvZ3JhbW1hJ3M6U3BlZWNoIFRlY2hub2xvZ3k6U2NyaXB0YWJsZSBUZXh0IEVkaXRvcgorQUVURS9BRVVUIHJlc291cmNlIHZlcnNpb24gMS8wLCBsYW5ndWFnZSAwLCBzY3JpcHQgMAorIiIiCisKK2ltcG9ydCBhZGRwYWNrCithZGRwYWNrLmFkZHBhY2soJ1Rvb2xzJykKK2FkZHBhY2suYWRkcGFjaygnYmdlbicpCithZGRwYWNrLmFkZHBhY2soJ2FlJykKKworaW1wb3J0IGFldG9vbHMKK2ltcG9ydCBNYWNPUworCitfY29kZSA9ICdDb1JlJworCitfRW51bV9zYXZvID0geworCSd5ZXMnIDogJ3llcyAnLAkjIFNhdmUgb2JqZWN0cyBub3cKKwknbm8nIDogJ25vICAnLAkjIERvIG5vdCBzYXZlIG9iamVjdHMKKwknYXNrJyA6ICdhc2sgJywJIyBBc2sgdGhlIHVzZXIgd2hldGhlciB0byBzYXZlCit9CisKK19FbnVtX2tmcm0gPSB7CisJJ2luZGV4JyA6ICdpbmR4JywJIyBrZXlmb3JtIGRlc2lnbmF0aW5nIGluZGV4ZWQgYWNjZXNzCisJJ25hbWVkJyA6ICduYW1lJywJIyBrZXlmb3JtIGRlc2lnbmF0aW5nIG5hbWVkIGFjY2VzcworCSdpZCcgOiAnSUQgICcsCSMga2V5Zm9ybSBkZXNpZ25hdGluZyBpZGVudGlmZXIgYWNjZXNzCit9CisKK2NsYXNzIFN0YW5kYXJkX1N1aXRlOgorCisJX2FyZ21hcF9jbG9zZSA9IHsKKwkJJ3NhdmluZycgOiAnc2F2bycsCisJCSdzYXZpbmdfaW4nIDogJ2tmaWwnLAorCX0KKworCWRlZiBjbG9zZShzZWxmLCBvYmplY3QsICphcmd1bWVudHMpOgorCQkiIiJjbG9zZTogQ2xvc2UgYW4gb2JqZWN0CisJCVJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgb2JqZWN0IHRvIGNsb3NlCisJCUtleXdvcmQgYXJndW1lbnQgc2F2aW5nOiBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgY2hhbmdlcyBzaG91bGQgYmUgc2F2ZWQgYmVmb3JlIGNsb3NpbmcKKwkJS2V5d29yZCBhcmd1bWVudCBzYXZpbmdfaW46IHRoZSBmaWxlIGluIHdoaWNoIHRvIHNhdmUgdGhlIG9iamVjdAorCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisJCSIiIgorCQlfY29kZSA9ICdjb3JlJworCQlfc3ViY29kZSA9ICdjbG9zJworCisJCWlmIGxlbihhcmd1bWVudHMpID4gMToKKwkJCXJhaXNlIFR5cGVFcnJvciwgJ1RvbyBtYW55IGFyZ3VtZW50cycKKwkJaWYgYXJndW1lbnRzOgorCQkJYXJndW1lbnRzID0gYXJndW1lbnRzWzBdCisJCQlpZiB0eXBlKGFyZ3VtZW50cykgPD4gdHlwZSh7fSk6CisJCQkJcmFpc2UgVHlwZUVycm9yLCAnTXVzdCBiZSBhIG1hcHBpbmcnCisJCWVsc2U6CisJCQlhcmd1bWVudHMgPSB7fQorCQlhcmd1bWVudHNbJy0tLS0nXSA9IG9iamVjdAorCisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCdfYXR0cmlidXRlcycpOgorCQkJYXR0cmlidXRlcyA9IGFyZ3VtZW50c1snX2F0dHJpYnV0ZXMnXQorCQkJZGVsIGFyZ3VtZW50c1snX2F0dHJpYnV0ZXMnXQorCQllbHNlOgorCQkJYXR0cmlidXRlcyA9IHt9CisKKwkJYWV0b29scy5rZXlzdWJzdChhcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9jbG9zZSkKKwkJYWV0b29scy5lbnVtc3Vic3QoYXJndW1lbnRzLCAnc2F2bycsIF9FbnVtX3Nhdm8pCisKKwkJcmVwbHksIGFyZ3VtZW50cywgYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisJCQkJYXJndW1lbnRzLCBhdHRyaWJ1dGVzKQorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorCQkJcmFpc2UgTWFjT1MuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJndW1lbnRzKQorCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisJCQlyZXR1cm4gYXJndW1lbnRzWyctLS0tJ10KKworCV9hcmdtYXBfY291bnQgPSB7CisJCSdlYWNoJyA6ICdrb2NsJywKKwl9CisKKwlkZWYgY291bnQoc2VsZiwgb2JqZWN0LCAqYXJndW1lbnRzKToKKwkJIiIiY291bnQ6IFJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIGEgcGFydGljdWxhciBjbGFzcyB3aXRoaW4gYW4gb2JqZWN0CisJCVJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgb2JqZWN0IHdob3NlIGVsZW1lbnRzIGFyZSB0byBiZSBjb3VudGVkCisJCUtleXdvcmQgYXJndW1lbnQgZWFjaDogdGhlIGNsYXNzIG9mIHRoZSBlbGVtZW50cyB0byBiZSBjb3VudGVkLiBLZXl3b3JkICdlYWNoJyBpcyBvcHRpb25hbCBpbiBBcHBsZVNjcmlwdAorCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisJCVJldHVybnM6IHRoZSBudW1iZXIgb2YgZWxlbWVudHMKKwkJIiIiCisJCV9jb2RlID0gJ2NvcmUnCisJCV9zdWJjb2RlID0gJ2NudGUnCisKKwkJaWYgbGVuKGFyZ3VtZW50cykgPiAxOgorCQkJcmFpc2UgVHlwZUVycm9yLCAnVG9vIG1hbnkgYXJndW1lbnRzJworCQlpZiBhcmd1bWVudHM6CisJCQlhcmd1bWVudHMgPSBhcmd1bWVudHNbMF0KKwkJCWlmIHR5cGUoYXJndW1lbnRzKSA8PiB0eXBlKHt9KToKKwkJCQlyYWlzZSBUeXBlRXJyb3IsICdNdXN0IGJlIGEgbWFwcGluZycKKwkJZWxzZToKKwkJCWFyZ3VtZW50cyA9IHt9CisJCWFyZ3VtZW50c1snLS0tLSddID0gb2JqZWN0CisKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ19hdHRyaWJ1dGVzJyk6CisJCQlhdHRyaWJ1dGVzID0gYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCQlkZWwgYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCWVsc2U6CisJCQlhdHRyaWJ1dGVzID0ge30KKworCQlhZXRvb2xzLmtleXN1YnN0KGFyZ3VtZW50cywgc2VsZi5fYXJnbWFwX2NvdW50KQorCisJCXJlcGx5LCBhcmd1bWVudHMsIGF0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorCQkJCWFyZ3VtZW50cywgYXR0cmlidXRlcykKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKwkJCXJhaXNlIE1hY09TLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorCQkJcmV0dXJuIGFyZ3VtZW50c1snLS0tLSddCisKKwlfYXJnbWFwX2RhdGFfc2l6ZSA9IHsKKwkJJ2FzJyA6ICdydHlwJywKKwl9CisKKwlkZWYgZGF0YV9zaXplKHNlbGYsIG9iamVjdCwgKmFyZ3VtZW50cyk6CisJCSIiImRhdGEgc2l6ZTogUmV0dXJuIHRoZSBzaXplIGluIGJ5dGVzIG9mIGFuIG9iamVjdAorCQlSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdCB3aG9zZSBkYXRhIHNpemUgaXMgdG8gYmUgcmV0dXJuZWQKKwkJS2V5d29yZCBhcmd1bWVudCBhczogdGhlIGRhdGEgdHlwZSBmb3Igd2hpY2ggdGhlIHNpemUgaXMgY2FsY3VsYXRlZAorCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisJCVJldHVybnM6IHRoZSBzaXplIG9mIHRoZSBvYmplY3QgaW4gYnl0ZXMKKwkJIiIiCisJCV9jb2RlID0gJ2NvcmUnCisJCV9zdWJjb2RlID0gJ2RzaXonCisKKwkJaWYgbGVuKGFyZ3VtZW50cykgPiAxOgorCQkJcmFpc2UgVHlwZUVycm9yLCAnVG9vIG1hbnkgYXJndW1lbnRzJworCQlpZiBhcmd1bWVudHM6CisJCQlhcmd1bWVudHMgPSBhcmd1bWVudHNbMF0KKwkJCWlmIHR5cGUoYXJndW1lbnRzKSA8PiB0eXBlKHt9KToKKwkJCQlyYWlzZSBUeXBlRXJyb3IsICdNdXN0IGJlIGEgbWFwcGluZycKKwkJZWxzZToKKwkJCWFyZ3VtZW50cyA9IHt9CisJCWFyZ3VtZW50c1snLS0tLSddID0gb2JqZWN0CisKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ19hdHRyaWJ1dGVzJyk6CisJCQlhdHRyaWJ1dGVzID0gYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCQlkZWwgYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCWVsc2U6CisJCQlhdHRyaWJ1dGVzID0ge30KKworCQlhZXRvb2xzLmtleXN1YnN0KGFyZ3VtZW50cywgc2VsZi5fYXJnbWFwX2RhdGFfc2l6ZSkKKworCQlyZXBseSwgYXJndW1lbnRzLCBhdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKwkJCQlhcmd1bWVudHMsIGF0dHJpYnV0ZXMpCisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisJCQlyYWlzZSBNYWNPUy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmd1bWVudHMpCisJCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKwkJCXJldHVybiBhcmd1bWVudHNbJy0tLS0nXQorCisJZGVmIGRlbGV0ZShzZWxmLCBvYmplY3QsICphcmd1bWVudHMpOgorCQkiIiJkZWxldGU6IERlbGV0ZSBhbiBlbGVtZW50IGZyb20gYW4gb2JqZWN0CisJCVJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgZWxlbWVudCB0byBkZWxldGUKKwkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorCQkiIiIKKwkJX2NvZGUgPSAnY29yZScKKwkJX3N1YmNvZGUgPSAnZGVsbycKKworCQlpZiBsZW4oYXJndW1lbnRzKSA+IDE6CisJCQlyYWlzZSBUeXBlRXJyb3IsICdUb28gbWFueSBhcmd1bWVudHMnCisJCWlmIGFyZ3VtZW50czoKKwkJCWFyZ3VtZW50cyA9IGFyZ3VtZW50c1swXQorCQkJaWYgdHlwZShhcmd1bWVudHMpIDw+IHR5cGUoe30pOgorCQkJCXJhaXNlIFR5cGVFcnJvciwgJ011c3QgYmUgYSBtYXBwaW5nJworCQllbHNlOgorCQkJYXJndW1lbnRzID0ge30KKwkJYXJndW1lbnRzWyctLS0tJ10gPSBvYmplY3QKKworCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnX2F0dHJpYnV0ZXMnKToKKwkJCWF0dHJpYnV0ZXMgPSBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJCWRlbCBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJZWxzZToKKwkJCWF0dHJpYnV0ZXMgPSB7fQorCisKKwkJcmVwbHksIGFyZ3VtZW50cywgYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisJCQkJYXJndW1lbnRzLCBhdHRyaWJ1dGVzKQorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorCQkJcmFpc2UgTWFjT1MuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJndW1lbnRzKQorCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisJCQlyZXR1cm4gYXJndW1lbnRzWyctLS0tJ10KKworCV9hcmdtYXBfZHVwbGljYXRlID0geworCQkndG8nIDogJ2luc2gnLAorCX0KKworCWRlZiBkdXBsaWNhdGUoc2VsZiwgb2JqZWN0LCAqYXJndW1lbnRzKToKKwkJIiIiZHVwbGljYXRlOiBEdXBsaWNhdGUgb2JqZWN0KHMpCisJCVJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgb2JqZWN0KHMpIHRvIGR1cGxpY2F0ZQorCQlLZXl3b3JkIGFyZ3VtZW50IHRvOiB0aGUgbmV3IGxvY2F0aW9uIGZvciB0aGUgb2JqZWN0KHMpCisJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKwkJUmV0dXJuczogdG8gdGhlIGR1cGxpY2F0ZWQgb2JqZWN0KHMpCisJCSIiIgorCQlfY29kZSA9ICdjb3JlJworCQlfc3ViY29kZSA9ICdjbG9uJworCisJCWlmIGxlbihhcmd1bWVudHMpID4gMToKKwkJCXJhaXNlIFR5cGVFcnJvciwgJ1RvbyBtYW55IGFyZ3VtZW50cycKKwkJaWYgYXJndW1lbnRzOgorCQkJYXJndW1lbnRzID0gYXJndW1lbnRzWzBdCisJCQlpZiB0eXBlKGFyZ3VtZW50cykgPD4gdHlwZSh7fSk6CisJCQkJcmFpc2UgVHlwZUVycm9yLCAnTXVzdCBiZSBhIG1hcHBpbmcnCisJCWVsc2U6CisJCQlhcmd1bWVudHMgPSB7fQorCQlhcmd1bWVudHNbJy0tLS0nXSA9IG9iamVjdAorCisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCdfYXR0cmlidXRlcycpOgorCQkJYXR0cmlidXRlcyA9IGFyZ3VtZW50c1snX2F0dHJpYnV0ZXMnXQorCQkJZGVsIGFyZ3VtZW50c1snX2F0dHJpYnV0ZXMnXQorCQllbHNlOgorCQkJYXR0cmlidXRlcyA9IHt9CisKKwkJYWV0b29scy5rZXlzdWJzdChhcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9kdXBsaWNhdGUpCisKKwkJcmVwbHksIGFyZ3VtZW50cywgYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisJCQkJYXJndW1lbnRzLCBhdHRyaWJ1dGVzKQorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorCQkJcmFpc2UgTWFjT1MuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJndW1lbnRzKQorCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisJCQlyZXR1cm4gYXJndW1lbnRzWyctLS0tJ10KKworCWRlZiBleGlzdHMoc2VsZiwgb2JqZWN0LCAqYXJndW1lbnRzKToKKwkJIiIiZXhpc3RzOiBWZXJpZnkgaWYgYW4gb2JqZWN0IGV4aXN0cworCQlSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdCBpbiBxdWVzdGlvbgorCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisJCVJldHVybnM6IHRydWUgaWYgaXQgZXhpc3RzLCBmYWxzZSBpZiBub3QKKwkJIiIiCisJCV9jb2RlID0gJ2NvcmUnCisJCV9zdWJjb2RlID0gJ2RvZXgnCisKKwkJaWYgbGVuKGFyZ3VtZW50cykgPiAxOgorCQkJcmFpc2UgVHlwZUVycm9yLCAnVG9vIG1hbnkgYXJndW1lbnRzJworCQlpZiBhcmd1bWVudHM6CisJCQlhcmd1bWVudHMgPSBhcmd1bWVudHNbMF0KKwkJCWlmIHR5cGUoYXJndW1lbnRzKSA8PiB0eXBlKHt9KToKKwkJCQlyYWlzZSBUeXBlRXJyb3IsICdNdXN0IGJlIGEgbWFwcGluZycKKwkJZWxzZToKKwkJCWFyZ3VtZW50cyA9IHt9CisJCWFyZ3VtZW50c1snLS0tLSddID0gb2JqZWN0CisKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ19hdHRyaWJ1dGVzJyk6CisJCQlhdHRyaWJ1dGVzID0gYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCQlkZWwgYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCWVsc2U6CisJCQlhdHRyaWJ1dGVzID0ge30KKworCisJCXJlcGx5LCBhcmd1bWVudHMsIGF0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorCQkJCWFyZ3VtZW50cywgYXR0cmlidXRlcykKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKwkJCXJhaXNlIE1hY09TLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorCQkJcmV0dXJuIGFyZ3VtZW50c1snLS0tLSddCisKKwlfYXJnbWFwX2dldCA9IHsKKwkJJ2FzJyA6ICdydHlwJywKKwl9CisKKwlkZWYgZ2V0KHNlbGYsIG9iamVjdCwgKmFyZ3VtZW50cyk6CisJCSIiImdldDogR2V0IHRoZSBkYXRhIGZvciBhbiBvYmplY3QKKwkJUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBvYmplY3Qgd2hvc2UgZGF0YSBpcyB0byBiZSByZXR1cm5lZAorCQlLZXl3b3JkIGFyZ3VtZW50IGFzOiB0aGUgZGVzaXJlZCB0eXBlcyBmb3IgdGhlIGRhdGEsIGluIG9yZGVyIG9mIHByZWZlcmVuY2UKKwkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorCQlSZXR1cm5zOiBUaGUgZGF0YSBmcm9tIHRoZSBvYmplY3QKKwkJIiIiCisJCV9jb2RlID0gJ2NvcmUnCisJCV9zdWJjb2RlID0gJ2dldGQnCisKKwkJaWYgbGVuKGFyZ3VtZW50cykgPiAxOgorCQkJcmFpc2UgVHlwZUVycm9yLCAnVG9vIG1hbnkgYXJndW1lbnRzJworCQlpZiBhcmd1bWVudHM6CisJCQlhcmd1bWVudHMgPSBhcmd1bWVudHNbMF0KKwkJCWlmIHR5cGUoYXJndW1lbnRzKSA8PiB0eXBlKHt9KToKKwkJCQlyYWlzZSBUeXBlRXJyb3IsICdNdXN0IGJlIGEgbWFwcGluZycKKwkJZWxzZToKKwkJCWFyZ3VtZW50cyA9IHt9CisJCWFyZ3VtZW50c1snLS0tLSddID0gb2JqZWN0CisKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ19hdHRyaWJ1dGVzJyk6CisJCQlhdHRyaWJ1dGVzID0gYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCQlkZWwgYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCWVsc2U6CisJCQlhdHRyaWJ1dGVzID0ge30KKworCQlhZXRvb2xzLmtleXN1YnN0KGFyZ3VtZW50cywgc2VsZi5fYXJnbWFwX2dldCkKKworCQlyZXBseSwgYXJndW1lbnRzLCBhdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKwkJCQlhcmd1bWVudHMsIGF0dHJpYnV0ZXMpCisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisJCQlyYWlzZSBNYWNPUy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmd1bWVudHMpCisJCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKwkJCXJldHVybiBhcmd1bWVudHNbJy0tLS0nXQorCisJX2FyZ21hcF9tYWtlID0geworCQknbmV3JyA6ICdrb2NsJywKKwkJJ2F0JyA6ICdpbnNoJywKKwkJJ3dpdGhfZGF0YScgOiAnZGF0YScsCisJCSd3aXRoX3Byb3BlcnRpZXMnIDogJ3ByZHQnLAorCX0KKworCWRlZiBtYWtlKHNlbGYsICphcmd1bWVudHMpOgorCQkiIiJtYWtlOiBNYWtlIGEgbmV3IGVsZW1lbnQKKwkJS2V5d29yZCBhcmd1bWVudCBuZXc6IHRoZSBjbGFzcyBvZiB0aGUgbmV3IGVsZW1lbnQuIEtleXdvcmQgJ25ldycgaXMgb3B0aW9uYWwgaW4gQXBwbGVTY3JpcHQKKwkJS2V5d29yZCBhcmd1bWVudCBhdDogdGhlIGxvY2F0aW9uIGF0IHdoaWNoIHRvIGluc2VydCB0aGUgZWxlbWVudAorCQlLZXl3b3JkIGFyZ3VtZW50IHdpdGhfZGF0YTogdGhlIGluaXRpYWwgZGF0YSBmb3IgdGhlIGVsZW1lbnQKKwkJS2V5d29yZCBhcmd1bWVudCB3aXRoX3Byb3BlcnRpZXM6IHRoZSBpbml0aWFsIHZhbHVlcyBmb3IgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGVsZW1lbnQKKwkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorCQlSZXR1cm5zOiB0byB0aGUgbmV3IG9iamVjdChzKQorCQkiIiIKKwkJX2NvZGUgPSAnY29yZScKKwkJX3N1YmNvZGUgPSAnY3JlbCcKKworCQlpZiBsZW4oYXJndW1lbnRzKSA+IDE6CisJCQlyYWlzZSBUeXBlRXJyb3IsICdUb28gbWFueSBhcmd1bWVudHMnCisJCWlmIGFyZ3VtZW50czoKKwkJCWFyZ3VtZW50cyA9IGFyZ3VtZW50c1swXQorCQkJaWYgdHlwZShhcmd1bWVudHMpIDw+IHR5cGUoe30pOgorCQkJCXJhaXNlIFR5cGVFcnJvciwgJ011c3QgYmUgYSBtYXBwaW5nJworCQllbHNlOgorCQkJYXJndW1lbnRzID0ge30KKworCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnX2F0dHJpYnV0ZXMnKToKKwkJCWF0dHJpYnV0ZXMgPSBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJCWRlbCBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJZWxzZToKKwkJCWF0dHJpYnV0ZXMgPSB7fQorCisJCWFldG9vbHMua2V5c3Vic3QoYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfbWFrZSkKKworCQlyZXBseSwgYXJndW1lbnRzLCBhdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKwkJCQlhcmd1bWVudHMsIGF0dHJpYnV0ZXMpCisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisJCQlyYWlzZSBNYWNPUy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmd1bWVudHMpCisJCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKwkJCXJldHVybiBhcmd1bWVudHNbJy0tLS0nXQorCisJX2FyZ21hcF9tb3ZlID0geworCQkndG8nIDogJ2luc2gnLAorCX0KKworCWRlZiBtb3ZlKHNlbGYsIG9iamVjdCwgKmFyZ3VtZW50cyk6CisJCSIiIm1vdmU6IE1vdmUgb2JqZWN0KHMpIHRvIGEgbmV3IGxvY2F0aW9uCisJCVJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgb2JqZWN0KHMpIHRvIG1vdmUKKwkJS2V5d29yZCBhcmd1bWVudCB0bzogdGhlIG5ldyBsb2NhdGlvbiBmb3IgdGhlIG9iamVjdChzKQorCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisJCVJldHVybnM6IHRvIHRoZSBvYmplY3QocykgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gbW92ZWQKKwkJIiIiCisJCV9jb2RlID0gJ2NvcmUnCisJCV9zdWJjb2RlID0gJ21vdmUnCisKKwkJaWYgbGVuKGFyZ3VtZW50cykgPiAxOgorCQkJcmFpc2UgVHlwZUVycm9yLCAnVG9vIG1hbnkgYXJndW1lbnRzJworCQlpZiBhcmd1bWVudHM6CisJCQlhcmd1bWVudHMgPSBhcmd1bWVudHNbMF0KKwkJCWlmIHR5cGUoYXJndW1lbnRzKSA8PiB0eXBlKHt9KToKKwkJCQlyYWlzZSBUeXBlRXJyb3IsICdNdXN0IGJlIGEgbWFwcGluZycKKwkJZWxzZToKKwkJCWFyZ3VtZW50cyA9IHt9CisJCWFyZ3VtZW50c1snLS0tLSddID0gb2JqZWN0CisKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ19hdHRyaWJ1dGVzJyk6CisJCQlhdHRyaWJ1dGVzID0gYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCQlkZWwgYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCWVsc2U6CisJCQlhdHRyaWJ1dGVzID0ge30KKworCQlhZXRvb2xzLmtleXN1YnN0KGFyZ3VtZW50cywgc2VsZi5fYXJnbWFwX21vdmUpCisKKwkJcmVwbHksIGFyZ3VtZW50cywgYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisJCQkJYXJndW1lbnRzLCBhdHRyaWJ1dGVzKQorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorCQkJcmFpc2UgTWFjT1MuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJndW1lbnRzKQorCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisJCQlyZXR1cm4gYXJndW1lbnRzWyctLS0tJ10KKworCWRlZiBvcGVuKHNlbGYsIG9iamVjdCwgKmFyZ3VtZW50cyk6CisJCSIiIm9wZW46IE9wZW4gdGhlIHNwZWNpZmllZCBvYmplY3QocykKKwkJUmVxdWlyZWQgYXJndW1lbnQ6IGxpc3Qgb2Ygb2JqZWN0cyB0byBvcGVuCisJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKwkJIiIiCisJCV9jb2RlID0gJ2FldnQnCisJCV9zdWJjb2RlID0gJ29kb2MnCisKKwkJaWYgbGVuKGFyZ3VtZW50cykgPiAxOgorCQkJcmFpc2UgVHlwZUVycm9yLCAnVG9vIG1hbnkgYXJndW1lbnRzJworCQlpZiBhcmd1bWVudHM6CisJCQlhcmd1bWVudHMgPSBhcmd1bWVudHNbMF0KKwkJCWlmIHR5cGUoYXJndW1lbnRzKSA8PiB0eXBlKHt9KToKKwkJCQlyYWlzZSBUeXBlRXJyb3IsICdNdXN0IGJlIGEgbWFwcGluZycKKwkJZWxzZToKKwkJCWFyZ3VtZW50cyA9IHt9CisJCWFyZ3VtZW50c1snLS0tLSddID0gb2JqZWN0CisKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ19hdHRyaWJ1dGVzJyk6CisJCQlhdHRyaWJ1dGVzID0gYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCQlkZWwgYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCWVsc2U6CisJCQlhdHRyaWJ1dGVzID0ge30KKworCisJCXJlcGx5LCBhcmd1bWVudHMsIGF0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorCQkJCWFyZ3VtZW50cywgYXR0cmlidXRlcykKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKwkJCXJhaXNlIE1hY09TLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorCQkJcmV0dXJuIGFyZ3VtZW50c1snLS0tLSddCisKKwlkZWYgX3ByaW50KHNlbGYsIG9iamVjdCwgKmFyZ3VtZW50cyk6CisJCSIiInByaW50OiBQcmludCB0aGUgc3BlY2lmaWVkIG9iamVjdChzKQorCQlSZXF1aXJlZCBhcmd1bWVudDogbGlzdCBvZiBvYmplY3RzIHRvIHByaW50CisJCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKwkJIiIiCisJCV9jb2RlID0gJ2FldnQnCisJCV9zdWJjb2RlID0gJ3Bkb2MnCisKKwkJaWYgbGVuKGFyZ3VtZW50cykgPiAxOgorCQkJcmFpc2UgVHlwZUVycm9yLCAnVG9vIG1hbnkgYXJndW1lbnRzJworCQlpZiBhcmd1bWVudHM6CisJCQlhcmd1bWVudHMgPSBhcmd1bWVudHNbMF0KKwkJCWlmIHR5cGUoYXJndW1lbnRzKSA8PiB0eXBlKHt9KToKKwkJCQlyYWlzZSBUeXBlRXJyb3IsICdNdXN0IGJlIGEgbWFwcGluZycKKwkJZWxzZToKKwkJCWFyZ3VtZW50cyA9IHt9CisJCWFyZ3VtZW50c1snLS0tLSddID0gb2JqZWN0CisKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ19hdHRyaWJ1dGVzJyk6CisJCQlhdHRyaWJ1dGVzID0gYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCQlkZWwgYXJndW1lbnRzWydfYXR0cmlidXRlcyddCisJCWVsc2U6CisJCQlhdHRyaWJ1dGVzID0ge30KKworCisJCXJlcGx5LCBhcmd1bWVudHMsIGF0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorCQkJCWFyZ3VtZW50cywgYXR0cmlidXRlcykKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKwkJCXJhaXNlIE1hY09TLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorCQkJcmV0dXJuIGFyZ3VtZW50c1snLS0tLSddCisKKwlfYXJnbWFwX3F1aXQgPSB7CisJCSdzYXZpbmcnIDogJ3Nhdm8nLAorCX0KKworCWRlZiBxdWl0KHNlbGYsICphcmd1bWVudHMpOgorCQkiIiJxdWl0OiBRdWl0IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0KKwkJS2V5d29yZCBhcmd1bWVudCBzYXZpbmc6IFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBzYXZlIGN1cnJlbnRseSBvcGVuIGRvY3VtZW50cworCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisJCSIiIgorCQlfY29kZSA9ICdhZXZ0JworCQlfc3ViY29kZSA9ICdxdWl0JworCisJCWlmIGxlbihhcmd1bWVudHMpID4gMToKKwkJCXJhaXNlIFR5cGVFcnJvciwgJ1RvbyBtYW55IGFyZ3VtZW50cycKKwkJaWYgYXJndW1lbnRzOgorCQkJYXJndW1lbnRzID0gYXJndW1lbnRzWzBdCisJCQlpZiB0eXBlKGFyZ3VtZW50cykgPD4gdHlwZSh7fSk6CisJCQkJcmFpc2UgVHlwZUVycm9yLCAnTXVzdCBiZSBhIG1hcHBpbmcnCisJCWVsc2U6CisJCQlhcmd1bWVudHMgPSB7fQorCisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCdfYXR0cmlidXRlcycpOgorCQkJYXR0cmlidXRlcyA9IGFyZ3VtZW50c1snX2F0dHJpYnV0ZXMnXQorCQkJZGVsIGFyZ3VtZW50c1snX2F0dHJpYnV0ZXMnXQorCQllbHNlOgorCQkJYXR0cmlidXRlcyA9IHt9CisKKwkJYWV0b29scy5rZXlzdWJzdChhcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9xdWl0KQorCQlhZXRvb2xzLmVudW1zdWJzdChhcmd1bWVudHMsICdzYXZvJywgX0VudW1fc2F2bykKKworCQlyZXBseSwgYXJndW1lbnRzLCBhdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKwkJCQlhcmd1bWVudHMsIGF0dHJpYnV0ZXMpCisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisJCQlyYWlzZSBNYWNPUy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmd1bWVudHMpCisJCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKwkJCXJldHVybiBhcmd1bWVudHNbJy0tLS0nXQorCisJX2FyZ21hcF9zYXZlID0geworCQknX2luJyA6ICdrZmlsJywKKwkJJ2FzJyA6ICdmbHRwJywKKwl9CisKKwlkZWYgc2F2ZShzZWxmLCBvYmplY3QsICphcmd1bWVudHMpOgorCQkiIiJzYXZlOiBTYXZlIGFuIG9iamVjdAorCQlSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdCB0byBzYXZlCisJCUtleXdvcmQgYXJndW1lbnQgX2luOiB0aGUgZmlsZSBpbiB3aGljaCB0byBzYXZlIHRoZSBvYmplY3QKKwkJS2V5d29yZCBhcmd1bWVudCBhczogdGhlIGZpbGUgdHlwZSBvZiB0aGUgZG9jdW1lbnQgaW4gd2hpY2ggdG8gc2F2ZSB0aGUgZGF0YQorCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisJCSIiIgorCQlfY29kZSA9ICdjb3JlJworCQlfc3ViY29kZSA9ICdzYXZlJworCisJCWlmIGxlbihhcmd1bWVudHMpID4gMToKKwkJCXJhaXNlIFR5cGVFcnJvciwgJ1RvbyBtYW55IGFyZ3VtZW50cycKKwkJaWYgYXJndW1lbnRzOgorCQkJYXJndW1lbnRzID0gYXJndW1lbnRzWzBdCisJCQlpZiB0eXBlKGFyZ3VtZW50cykgPD4gdHlwZSh7fSk6CisJCQkJcmFpc2UgVHlwZUVycm9yLCAnTXVzdCBiZSBhIG1hcHBpbmcnCisJCWVsc2U6CisJCQlhcmd1bWVudHMgPSB7fQorCQlhcmd1bWVudHNbJy0tLS0nXSA9IG9iamVjdAorCisJCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCdfYXR0cmlidXRlcycpOgorCQkJYXR0cmlidXRlcyA9IGFyZ3VtZW50c1snX2F0dHJpYnV0ZXMnXQorCQkJZGVsIGFyZ3VtZW50c1snX2F0dHJpYnV0ZXMnXQorCQllbHNlOgorCQkJYXR0cmlidXRlcyA9IHt9CisKKwkJYWV0b29scy5rZXlzdWJzdChhcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9zYXZlKQorCisJCXJlcGx5LCBhcmd1bWVudHMsIGF0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorCQkJCWFyZ3VtZW50cywgYXR0cmlidXRlcykKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKwkJCXJhaXNlIE1hY09TLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorCQkJcmV0dXJuIGFyZ3VtZW50c1snLS0tLSddCisKKwlfYXJnbWFwX3NldCA9IHsKKwkJJ3RvJyA6ICdkYXRhJywKKwl9CisKKwlkZWYgc2V0KHNlbGYsIG9iamVjdCwgKmFyZ3VtZW50cyk6CisJCSIiInNldDogU2V0IGFuIG9iamVjdCdzIGRhdGEKKwkJUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBvYmplY3QgdG8gY2hhbmdlCisJCUtleXdvcmQgYXJndW1lbnQgdG86IHRoZSBuZXcgdmFsdWUKKwkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorCQkiIiIKKwkJX2NvZGUgPSAnY29yZScKKwkJX3N1YmNvZGUgPSAnc2V0ZCcKKworCQlpZiBsZW4oYXJndW1lbnRzKSA+IDE6CisJCQlyYWlzZSBUeXBlRXJyb3IsICdUb28gbWFueSBhcmd1bWVudHMnCisJCWlmIGFyZ3VtZW50czoKKwkJCWFyZ3VtZW50cyA9IGFyZ3VtZW50c1swXQorCQkJaWYgdHlwZShhcmd1bWVudHMpIDw+IHR5cGUoe30pOgorCQkJCXJhaXNlIFR5cGVFcnJvciwgJ011c3QgYmUgYSBtYXBwaW5nJworCQllbHNlOgorCQkJYXJndW1lbnRzID0ge30KKwkJYXJndW1lbnRzWyctLS0tJ10gPSBvYmplY3QKKworCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnX2F0dHJpYnV0ZXMnKToKKwkJCWF0dHJpYnV0ZXMgPSBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJCWRlbCBhcmd1bWVudHNbJ19hdHRyaWJ1dGVzJ10KKwkJZWxzZToKKwkJCWF0dHJpYnV0ZXMgPSB7fQorCisJCWFldG9vbHMua2V5c3Vic3QoYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfc2V0KQorCisJCXJlcGx5LCBhcmd1bWVudHMsIGF0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorCQkJCWFyZ3VtZW50cywgYXR0cmlidXRlcykKKwkJaWYgYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKwkJCXJhaXNlIE1hY09TLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3VtZW50cykKKwkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorCQlpZiBhcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorCQkJcmV0dXJuIGFyZ3VtZW50c1snLS0tLSddCisKKworIyAgICBDbGFzcyAnYXBwbGljYXRpb24nICgnY2FwcCcpIC0tICdBbiBhcHBsaWNhdGlvbiBwcm9ncmFtJworIyAgICAgICAgcHJvcGVydHkgJ2NsaXBib2FyZCcgKCdwY2xpJykgJyoqKionIC0tICdjb250ZW50cyBvZiB0aGUgY2xpcGJvYXJkJyBbbXV0YWJsZSBsaXN0XQorIyAgICAgICAgcHJvcGVydHkgJ2Zyb250bW9zdCcgKCdwaXNmJykgJ2Jvb2wnIC0tICdJcyB0aGlzIHRoZSBmcm9udG1vc3QgYXBwbGljYXRpb24/JyBbXQorIyAgICAgICAgcHJvcGVydHkgJ25hbWUnICgncG5hbScpICdpdHh0JyAtLSAndGhlIG5hbWUnIFtdCisjICAgICAgICBwcm9wZXJ0eSAnc2VsZWN0aW9uJyAoJ3NlbGUnKSAnY3NlbCcgLS0gJ3RoZSBzZWxlY3Rpb24gdmlzaWJsZSB0byB0aGUgdXNlcicgW211dGFibGVdCisjICAgICAgICBwcm9wZXJ0eSAndmVyc2lvbicgKCd2ZXJzJykgJ3ZlcnMnIC0tICd0aGUgdmVyc2lvbiBvZiB0aGUgYXBwbGljYXRpb24nIFtdCisjICAgICAgICBwcm9wZXJ0eSAndGV4dCBpdGVtIGRlbGltaXRlcnMnICgndHhkbCcpICdsaXN0JyAtLSAnYSBsaXN0IG9mIGFsbCB0aGUgdGV4dCBpdGVtIGRlbGltaXRlcnMnIFttdXRhYmxlXQorIyAgICAgICAgZWxlbWVudCAnZG9jdScgYXMgWydpbmR4JywgJ25hbWUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2N3aW4nIGFzIFsnaW5keCcsICduYW1lJywgJ3JhbmcnLCAndGVzdCddCisKKyMgICAgQ2xhc3MgJ2FwcGxpY2F0aW9ucycgKCdjYXBwJykgLS0gJ0V2ZXJ5IGFwcGxpY2F0aW9uJworIyAgICAgICAgcHJvcGVydHkgJ2NsYXNzIGF0dHJpYnV0ZXMnICgnY0AjIScpICd0eXBlJyAtLSAnc3BlY2lhbCBjbGFzcyBhdHRyaWJ1dGVzJyBbMF0KKworIyAgICBDbGFzcyAnZG9jdW1lbnQnICgnZG9jdScpIC0tICdBIGRvY3VtZW50JworIyAgICAgICAgcHJvcGVydHkgJ2JvdW5kcycgKCdwYm5kJykgJ3FkcnQnIC0tICd0aGUgYm91bmRhcnkgcmVjdGFuZ2xlIGZvciB0aGUgZG9jdW1lbnQnIFttdXRhYmxlXQorIyAgICAgICAgcHJvcGVydHkgJ2Nsb3NlYWJsZScgKCdoY2xiJykgJ2Jvb2wnIC0tICdEb2VzIHRoZSBkb2N1bWVudCBoYXZlIGEgY2xvc2UgYm94PycgW10KKyMgICAgICAgIHByb3BlcnR5ICd0aXRsZWQnICgncHRpdCcpICdib29sJyAtLSAnRG9lcyB0aGUgZG9jdW1lbnQgaGF2ZSBhIHRpdGxlIGJhcj8nIFtdCisjICAgICAgICBwcm9wZXJ0eSAnaW5kZXgnICgncGlkeCcpICdsb25nJyAtLSAndGhlIG51bWJlciBvZiB0aGUgZG9jdW1lbnQnIFttdXRhYmxlXQorIyAgICAgICAgcHJvcGVydHkgJ2Zsb2F0aW5nJyAoJ2lzZmwnKSAnYm9vbCcgLS0gJ0RvZXMgdGhlIGRvY3VtZW50IGZsb2F0PycgW10KKyMgICAgICAgIHByb3BlcnR5ICdtb2RhbCcgKCdwbW9kJykgJ2Jvb2wnIC0tICdJcyB0aGUgZG9jdW1lbnQgbW9kYWw/JyBbXQorIyAgICAgICAgcHJvcGVydHkgJ3Jlc2l6YWJsZScgKCdwcnN6JykgJ2Jvb2wnIC0tICdJcyB0aGUgZG9jdW1lbnQgcmVzaXphYmxlPycgW10KKyMgICAgICAgIHByb3BlcnR5ICd6b29tYWJsZScgKCdpc3ptJykgJ2Jvb2wnIC0tICdJcyB0aGUgZG9jdW1lbnQgem9vbWFibGU/JyBbXQorIyAgICAgICAgcHJvcGVydHkgJ3pvb21lZCcgKCdwenVtJykgJ2Jvb2wnIC0tICdJcyB0aGUgZG9jdW1lbnQgem9vbWVkPycgW211dGFibGVdCisjICAgICAgICBwcm9wZXJ0eSAnbmFtZScgKCdwbmFtJykgJ2l0eHQnIC0tICd0aGUgdGl0bGUgb2YgdGhlIGRvY3VtZW50JyBbbXV0YWJsZV0KKyMgICAgICAgIHByb3BlcnR5ICdzZWxlY3Rpb24nICgnc2VsZScpICdjc2VsJyAtLSAndGhlIHNlbGVjdGlvbiB2aXNpYmxlIHRvIHRoZSB1c2VyJyBbbXV0YWJsZV0KKyMgICAgICAgIHByb3BlcnR5ICd2aXNpYmxlJyAoJ3B2aXMnKSAnYm9vbCcgLS0gJ0lzIHRoZSBkb2N1bWVudCB2aXNpYmxlPycgW10KKyMgICAgICAgIHByb3BlcnR5ICdtb2RpZmllZCcgKCdpbW9kJykgJ2Jvb2wnIC0tICdIYXMgdGhlIGRvY3VtZW50IGJlZW4gbW9kaWZpZWQgc2luY2UgdGhlIGxhc3Qgc2F2ZT8nIFtdCisjICAgICAgICBwcm9wZXJ0eSAncG9zaXRpb24nICgncHBvcycpICdRRHB0JyAtLSAndXBwZXIgbGVmdCBjb29yZGluYXRlcyBvZiB0aGUgZG9jdW1lbnQnIFtdCisjICAgICAgICBlbGVtZW50ICdjaGEgJyBhcyBbJ2luZHgnLCAncmVsZScsICdyYW5nJywgJ3Rlc3QnXQorIyAgICAgICAgZWxlbWVudCAnY2lucycgYXMgWydyZWxlJ10KKyMgICAgICAgIGVsZW1lbnQgJ2NwYXInIGFzIFsnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjdHh0JyBhcyBbJ3JhbmcnXQorIyAgICAgICAgZWxlbWVudCAnY2l0bScgYXMgWydpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2N3b3InIGFzIFsnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisKKyMgICAgQ2xhc3MgJ2RvY3VtZW50cycgKCdkb2N1JykgLS0gJ0V2ZXJ5IGRvY3VtZW50JworIyAgICAgICAgcHJvcGVydHkgJ2NsYXNzIGF0dHJpYnV0ZXMnICgnY0AjIScpICd0eXBlJyAtLSAnc3BlY2lhbCBjbGFzcyBhdHRyaWJ1dGVzJyBbMF0KKworIyAgICBDbGFzcyAnZmlsZScgKCdmaWxlJykgLS0gJ0EgZmlsZScKKworIyAgICBDbGFzcyAnZmlsZXMnICgnZmlsZScpIC0tICdFdmVyeSBmaWxlJworIyAgICAgICAgcHJvcGVydHkgJ2NsYXNzIGF0dHJpYnV0ZXMnICgnY0AjIScpICd0eXBlJyAtLSAnc3BlY2lhbCBjbGFzcyBhdHRyaWJ1dGVzJyBbMF0KKworIyAgICBDbGFzcyAnaW5zZXJ0aW9uIHBvaW50JyAoJ2NpbnMnKSAtLSAnQW4gaW5zZXJ0aW9uIGxvY2F0aW9uIGJldHdlZW4gdHdvIG9iamVjdHMnCisjICAgICAgICBwcm9wZXJ0eSAnbGVuZ3RoJyAoJ2xlbmcnKSAnbG9uZycgLS0gJ2xlbmd0aCBvZiB0ZXh0IG9iamVjdCAoaW4gY2hhcmFjdGVycyknIFtdCisjICAgICAgICBwcm9wZXJ0eSAnb2Zmc2V0JyAoJ29mc2UnKSAnbG9uZycgLS0gJ29mZnNldCBvZiBhIHRleHQgb2JqZWN0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZG9jdW1lbnQgKGZpcnN0IGNoYXIgaGFzIG9mZnNldCAxKScgW10KKyMgICAgICAgIHByb3BlcnR5ICdmb250JyAoJ2ZvbnQnKSAnY3R4dCcgLS0gJ3RoZSBuYW1lIG9mIHRoZSBmb250JyBbbXV0YWJsZV0KKyMgICAgICAgIHByb3BlcnR5ICdzaXplJyAoJ3B0c3onKSAnbG9uZycgLS0gJ3RoZSBzaXplIGluIHBvaW50cycgW211dGFibGVdCisjICAgICAgICBwcm9wZXJ0eSAnc3R5bGUnICgndHhzdCcpICd0c3R5JyAtLSAndGhlIHRleHQgc3R5bGUnIFttdXRhYmxlXQorIyAgICAgICAgcHJvcGVydHkgJ3VuaWZvcm0gc3R5bGVzJyAoJ3VzdGwnKSAndHN0eScgLS0gJ3RoZSB0ZXh0IHN0eWxlJyBbXQorIyAgICAgICAgcHJvcGVydHkgJ3dyaXRpbmcgY29kZScgKCdwc2N0JykgJ2ludGwnIC0tICd0aGUgc2NyaXB0IHN5c3RlbSBhbmQgbGFuZ3VhZ2UnIFttdXRhYmxlXQorCisjICAgIENsYXNzICdpbnNlcnRpb24gcG9pbnRzJyAoJ2NpbnMnKSAtLSAnRXZlcnkgaW5zZXJ0aW9uIGxvY2F0aW9uJworIyAgICAgICAgcHJvcGVydHkgJ2NsYXNzIGF0dHJpYnV0ZXMnICgnY0AjIScpICd0eXBlJyAtLSAnc3BlY2lhbCBjbGFzcyBhdHRyaWJ1dGVzJyBbMF0KKworIyAgICBDbGFzcyAnc2VsZWN0aW9uLW9iamVjdCcgKCdjc2VsJykgLS0gJ3RoZSBzZWxlY3Rpb24gdmlzaWJsZSB0byB0aGUgdXNlcicKKyMgICAgICAgIHByb3BlcnR5ICdjb250ZW50cycgKCdwY250JykgJ3R5cGUnIC0tICd0aGUgY29udGVudHMgb2YgdGhlIHNlbGVjdGlvbicgW211dGFibGVdCisjICAgICAgICBwcm9wZXJ0eSAnbGVuZ3RoJyAoJ2xlbmcnKSAnbG9uZycgLS0gJ2xlbmd0aCBvZiB0ZXh0IG9iamVjdCAoaW4gY2hhcmFjdGVycyknIFtdCisjICAgICAgICBwcm9wZXJ0eSAnb2Zmc2V0JyAoJ29mc2UnKSAnbG9uZycgLS0gJ29mZnNldCBvZiBhIHRleHQgb2JqZWN0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZG9jdW1lbnQgKGZpcnN0IGNoYXIgaGFzIG9mZnNldCAxKScgW10KKyMgICAgICAgIHByb3BlcnR5ICdmb250JyAoJ2ZvbnQnKSAnY3R4dCcgLS0gJ3RoZSBuYW1lIG9mIHRoZSBmb250JyBbbXV0YWJsZV0KKyMgICAgICAgIHByb3BlcnR5ICdzaXplJyAoJ3B0c3onKSAnbG9uZycgLS0gJ3RoZSBzaXplIGluIHBvaW50cycgW211dGFibGVdCisjICAgICAgICBwcm9wZXJ0eSAnc3R5bGUnICgndHhzdCcpICd0c3R5JyAtLSAndGhlIHRleHQgc3R5bGUnIFttdXRhYmxlXQorIyAgICAgICAgcHJvcGVydHkgJ3VuaWZvcm0gc3R5bGVzJyAoJ3VzdGwnKSAndHN0eScgLS0gJ3RoZSB0ZXh0IHN0eWxlJyBbXQorIyAgICAgICAgcHJvcGVydHkgJ3dyaXRpbmcgY29kZScgKCdwc2N0JykgJ2ludGwnIC0tICd0aGUgc2NyaXB0IHN5c3RlbSBhbmQgbGFuZ3VhZ2UnIFttdXRhYmxlXQorIyAgICAgICAgZWxlbWVudCAnY2hhICcgYXMgWydpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2NwYXInIGFzIFsnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjdHh0JyBhcyBbJ3JhbmcnXQorIyAgICAgICAgZWxlbWVudCAnY2l0bScgYXMgWydpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2N3b3InIGFzIFsnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisKKyMgICAgQ2xhc3MgJ3dpbmRvdycgKCdjd2luJykgLS0gJ0Egd2luZG93JworIyAgICAgICAgcHJvcGVydHkgJ2JvdW5kcycgKCdwYm5kJykgJ3FkcnQnIC0tICd0aGUgYm91bmRhcnkgcmVjdGFuZ2xlIGZvciB0aGUgd2luZG93JyBbbXV0YWJsZV0KKyMgICAgICAgIHByb3BlcnR5ICdjbG9zZWFibGUnICgnaGNsYicpICdib29sJyAtLSAnRG9lcyB0aGUgd2luZG93IGhhdmUgYSBjbG9zZSBib3g/JyBbXQorIyAgICAgICAgcHJvcGVydHkgJ3RpdGxlZCcgKCdwdGl0JykgJ2Jvb2wnIC0tICdEb2VzIHRoZSB3aW5kb3cgaGF2ZSBhIHRpdGxlIGJhcj8nIFtdCisjICAgICAgICBwcm9wZXJ0eSAnaW5kZXgnICgncGlkeCcpICdsb25nJyAtLSAndGhlIG51bWJlciBvZiB0aGUgd2luZG93JyBbbXV0YWJsZV0KKyMgICAgICAgIHByb3BlcnR5ICdmbG9hdGluZycgKCdpc2ZsJykgJ2Jvb2wnIC0tICdEb2VzIHRoZSB3aW5kb3cgZmxvYXQ/JyBbXQorIyAgICAgICAgcHJvcGVydHkgJ21vZGFsJyAoJ3Btb2QnKSAnYm9vbCcgLS0gJ0lzIHRoZSB3aW5kb3cgbW9kYWw/JyBbXQorIyAgICAgICAgcHJvcGVydHkgJ3Jlc2l6YWJsZScgKCdwcnN6JykgJ2Jvb2wnIC0tICdJcyB0aGUgd2luZG93IHJlc2l6YWJsZT8nIFtdCisjICAgICAgICBwcm9wZXJ0eSAnem9vbWFibGUnICgnaXN6bScpICdib29sJyAtLSAnSXMgdGhlIHdpbmRvdyB6b29tYWJsZT8nIFtdCisjICAgICAgICBwcm9wZXJ0eSAnem9vbWVkJyAoJ3B6dW0nKSAnYm9vbCcgLS0gJ0lzIHRoZSB3aW5kb3cgem9vbWVkPycgW211dGFibGVdCisjICAgICAgICBwcm9wZXJ0eSAnbmFtZScgKCdwbmFtJykgJ2l0eHQnIC0tICd0aGUgdGl0bGUgb2YgdGhlIHdpbmRvdycgW211dGFibGVdCisjICAgICAgICBwcm9wZXJ0eSAnc2VsZWN0aW9uJyAoJ3NlbGUnKSAnY3NlbCcgLS0gJ3RoZSBzZWxlY3Rpb24gdmlzaWJsZSB0byB0aGUgdXNlcicgW211dGFibGVdCisjICAgICAgICBwcm9wZXJ0eSAndmlzaWJsZScgKCdwdmlzJykgJ2Jvb2wnIC0tICdpcyB0aGUgd2luZG93IHZpc2libGU/JyBbXQorIyAgICAgICAgcHJvcGVydHkgJ21vZGlmaWVkJyAoJ2ltb2QnKSAnYm9vbCcgLS0gJ2hhcyB0aGUgd2luZG93IGJlZW4gbW9kaWZpZWQgc2luY2UgdGhlIGxhc3Qgc2F2ZT8nIFtdCisjICAgICAgICBwcm9wZXJ0eSAncG9zaXRpb24nICgncHBvcycpICdRRHB0JyAtLSAndXBwZXIgbGVmdCBjb29yZGluYXRlcyBvZiB3aW5kb3cnIFtdCisjICAgICAgICBlbGVtZW50ICdjaGEgJyBhcyBbJ2luZHgnLCAncmVsZScsICdyYW5nJywgJ3Rlc3QnXQorIyAgICAgICAgZWxlbWVudCAnY2lucycgYXMgWydyZWxlJ10KKyMgICAgICAgIGVsZW1lbnQgJ2NwYXInIGFzIFsnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjdHh0JyBhcyBbJ3JhbmcnXQorIyAgICAgICAgZWxlbWVudCAnY2l0bScgYXMgWydpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2N3b3InIGFzIFsnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisKKyMgICAgQ2xhc3MgJ3dpbmRvd3MnICgnY3dpbicpIC0tICdFdmVyeSB3aW5kb3cnCisjICAgICAgICBwcm9wZXJ0eSAnY2xhc3MgYXR0cmlidXRlcycgKCdjQCMhJykgJ3R5cGUnIC0tICdzcGVjaWFsIGNsYXNzIGF0dHJpYnV0ZXMnIFswXQo=