ZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlidGFyZmlsZS50ZXggYi9Eb2MvbGliL2xpYnRhcmZpbGUudGV4CmluZGV4IDk2ZjgzNWYuLjczYzM1ZWQgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlidGFyZmlsZS50ZXgKKysrIGIvRG9jL2xpYi9saWJ0YXJmaWxlLnRleApAQCAtMTIsMjEgKzEyLDI0IEBACiAKIFxiZWdpbntpdGVtaXplfQogXGl0ZW0gcmVhZHMgYW5kIHdyaXRlcyBcbW9kdWxle2d6aXB9IGFuZCBcbW9kdWxle2J6aXAyfSBjb21wcmVzc2VkIGFyY2hpdmVzLgotXGl0ZW0gY3JlYXRlcyBcUE9TSVh7fSAxMDAzLjEtMTk5MCBjb21wbGlhbnQgb3IgR05VIHRhciBjb21wYXRpYmxlIGFyY2hpdmVzLgotXGl0ZW0gcmVhZHMgR05VIHRhciBleHRlbnNpb25zIFxlbXBoe2xvbmduYW1lfSwgXGVtcGh7bG9uZ2xpbmt9IGFuZAotICAgICAgXGVtcGh7c3BhcnNlfS4KLVxpdGVtIHN0b3JlcyBwYXRobmFtZXMgb2YgdW5saW1pdGVkIGxlbmd0aCB1c2luZyBHTlUgdGFyIGV4dGVuc2lvbnMuCitcaXRlbSByZWFkL3dyaXRlIHN1cHBvcnQgZm9yIHRoZSBcUE9TSVh7fS4xLTE5ODggKHVzdGFyKSBmb3JtYXQuCitcaXRlbSByZWFkL3dyaXRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgdGFyIGZvcm1hdCBpbmNsdWRpbmcgXGVtcGh7bG9uZ25hbWV9IGFuZAorICAgICAgXGVtcGh7bG9uZ2xpbmt9IGV4dGVuc2lvbnMsIHJlYWQtb25seSBzdXBwb3J0IGZvciB0aGUgXGVtcGh7c3BhcnNlfQorICAgICAgZXh0ZW5zaW9uLgorXGl0ZW0gcmVhZC93cml0ZSBzdXBwb3J0IGZvciB0aGUgXFBPU0lYe30uMS0yMDAxIChwYXgpIGZvcm1hdC4KKyAgICAgIFx2ZXJzaW9uYWRkZWR7Mi42fQogXGl0ZW0gaGFuZGxlcyBkaXJlY3RvcmllcywgcmVndWxhciBmaWxlcywgaGFyZGxpbmtzLCBzeW1ib2xpYyBsaW5rcywgZmlmb3MsCiAgICAgICBjaGFyYWN0ZXIgZGV2aWNlcyBhbmQgYmxvY2sgZGV2aWNlcyBhbmQgaXMgYWJsZSB0byBhY3F1aXJlIGFuZAogICAgICAgcmVzdG9yZSBmaWxlIGluZm9ybWF0aW9uIGxpa2UgdGltZXN0YW1wLCBhY2Nlc3MgcGVybWlzc2lvbnMgYW5kIG93bmVyLgogXGl0ZW0gY2FuIGhhbmRsZSB0YXBlIGRldmljZXMuCiBcZW5ke2l0ZW1pemV9CiAKLVxiZWdpbntmdW5jZGVzY317b3Blbn17XG9wdGlvbmFse25hbWVcb3B0aW9uYWx7LCBtb2RlCi0gICAgICAgICAgICAgICAgICAgICAgIFxvcHRpb25hbHssIGZpbGVvYmpcb3B0aW9uYWx7LCBidWZzaXplfX19fX0KK1xiZWdpbntmdW5jZGVzY317b3Blbn17bmFtZVxvcHRpb25hbHssIG1vZGVcb3B0aW9uYWx7LAorICAgICAgICBmaWxlb2JqXG9wdGlvbmFseywgYnVmc2l6ZX19fSwgKiprd2FyZ3N9CiAgICAgUmV0dXJuIGEgXGNsYXNze1RhckZpbGV9IG9iamVjdCBmb3IgdGhlIHBhdGhuYW1lIFx2YXJ7bmFtZX0uCi0gICAgRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIFxjbGFzc3tUYXJGaWxlfSBvYmplY3RzLAotICAgIHNlZSBcY2l0ZXRpdGxle1RhckZpbGUgT2JqZWN0c30gKHNlY3Rpb24gXHJlZnt0YXJmaWxlLW9iamVjdHN9KS4KKyAgICBGb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gXGNsYXNze1RhckZpbGV9IG9iamVjdHMgYW5kIHRoZSBrZXl3b3JkCisgICAgYXJndW1lbnRzIHRoYXQgYXJlIGFsbG93ZWQsIHNlZSBcY2l0ZXRpdGxle1RhckZpbGUgT2JqZWN0c30KKyAgICAoc2VjdGlvbiBccmVme3RhcmZpbGUtb2JqZWN0c30pLgogCiAgICAgXHZhcnttb2RlfSBoYXMgdG8gYmUgYSBzdHJpbmcgb2YgdGhlIGZvcm0gXGNvZGV7J2ZpbGVtb2RlWzpjb21wcmVzc2lvbl0nfSwKICAgICBpdCBkZWZhdWx0cyB0byBcY29kZXsncid9LiBIZXJlIGlzIGEgZnVsbCBsaXN0IG9mIG1vZGUgY29tYmluYXRpb25zOgpAQCAtMTMwLDYgKzEzMywzMSBAQAogICAgIFx2ZXJzaW9uYWRkZWR7Mi42fQogXGVuZHtleGNkZXNjfQogCitcYmVnaW57ZGF0YWRlc2N9e1VTVEFSX0ZPUk1BVH0KKyAgICBcUE9TSVh7fS4xLTE5ODggKHVzdGFyKSBmb3JtYXQuIEl0IHN1cHBvcnRzIGZpbGVuYW1lcyB1cCB0byBhIGxlbmd0aCBvZgorICAgIGF0IGJlc3QgMjU2IGNoYXJhY3RlcnMgYW5kIGxpbmtuYW1lcyB1cCB0byAxMDAgY2hhcmFjdGVycy4gVGhlIG1heGltdW0KKyAgICBmaWxlIHNpemUgaXMgOCBnaWdhYnl0ZXMuIFRoaXMgaXMgYW4gb2xkIGFuZCBsaW1pdGVkIGJ1dCB3aWRlbHkKKyAgICBzdXBwb3J0ZWQgZm9ybWF0LgorXGVuZHtkYXRhZGVzY30KKworXGJlZ2lue2RhdGFkZXNjfXtHTlVfRk9STUFUfQorICAgIEdOVSB0YXIgZm9ybWF0LiBJdCBzdXBwb3J0cyBhcmJpdHJhcmlseSBsb25nIGZpbGVuYW1lcyBhbmQgbGlua25hbWVzIGFuZAorICAgIGZpbGVzIGJpZ2dlciB0aGFuIDggZ2lnYWJ5dGVzLiBJdCBpcyB0aGUgZGVmYWN0byBzdGFuZGFyZCBvbiBHTlUvTGludXgKKyAgICBzeXN0ZW1zLgorXGVuZHtkYXRhZGVzY30KKworXGJlZ2lue2RhdGFkZXNjfXtQQVhfRk9STUFUfQorICAgIFxQT1NJWHt9LjEtMjAwMSAocGF4KSBmb3JtYXQuIEl0IGlzIHRoZSBtb3N0IGZsZXhpYmxlIGZvcm1hdCB3aXRoCisgICAgdmlydHVhbGx5IG5vIGxpbWl0cy4gSXQgc3VwcG9ydHMgbG9uZyBmaWxlbmFtZXMgYW5kIGxpbmtuYW1lcywgbGFyZ2UgZmlsZXMKKyAgICBhbmQgc3RvcmVzIHBhdGhuYW1lcyBpbiBhIHBvcnRhYmxlIHdheS4gIEhvd2V2ZXIsIG5vdCBhbGwgdGFyCisgICAgaW1wbGVtZW50YXRpb25zIHRvZGF5IGFyZSBhYmxlIHRvIGhhbmRsZSBwYXggYXJjaGl2ZXMgcHJvcGVybHkuCitcZW5ke2RhdGFkZXNjfQorCitcYmVnaW57ZGF0YWRlc2N9e0RFRkFVTFRfRk9STUFUfQorICAgIFRoZSBkZWZhdWx0IGZvcm1hdCBmb3IgY3JlYXRpbmcgYXJjaGl2ZXMuIFRoaXMgaXMgY3VycmVudGx5CisgICAgXGNvbnN0YW50e0dOVV9GT1JNQVR9LgorXGVuZHtkYXRhZGVzY30KKwogXGJlZ2lue3NlZWFsc299CiAgICAgXHNlZW1vZHVsZXt6aXBmaWxlfXtEb2N1bWVudGF0aW9uIG9mIHRoZSBccmVmbW9kdWxle3ppcGZpbGV9CiAgICAgc3RhbmRhcmQgbW9kdWxlLn0KQEAgLTE1MiwxMiArMTgwLDIxIEBACiBcY2xhc3N7VGFySW5mb30gb2JqZWN0LCBzZWUgXGNpdGV0aXRsZXtUYXJJbmZvIE9iamVjdHN9IChzZWN0aW9uCiBccmVme3RhcmluZm8tb2JqZWN0c30pIGZvciBkZXRhaWxzLgogCi1cYmVnaW57Y2xhc3NkZXNjfXtUYXJGaWxlfXtcb3B0aW9uYWx7bmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgXG9wdGlvbmFseywgbW9kZVxvcHRpb25hbHssIGZpbGVvYmp9fX19Ci0gICAgT3BlbiBhbiBcZW1waHsodW5jb21wcmVzc2VkKX0gdGFyIGFyY2hpdmUgXHZhcntuYW1lfS4KK1xiZWdpbntjbGFzc2Rlc2N9e1RhckZpbGV9e25hbWU9Tm9uZSwgbW9kZT0ncicsIGZpbGVvYmo9Tm9uZSwKKyAgICAgICAgZm9ybWF0PURFRkFVTFRfRk9STUFULCB0YXJpbmZvPVRhckluZm8sIGRlcmVmZXJlbmNlPUZhbHNlLAorICAgICAgICBpZ25vcmVfemVyb3M9RmFsc2UsIGVuY29kaW5nPU5vbmUsIHBheF9oZWFkZXJzPU5vbmUsIGRlYnVnPTAsCisgICAgICAgIGVycm9ybGV2ZWw9MH0KKworICAgIEFsbCBmb2xsb3dpbmcgYXJndW1lbnRzIGFyZSBvcHRpb25hbCBhbmQgY2FuIGJlIGFjY2Vzc2VkIGFzIGluc3RhbmNlCisgICAgYXR0cmlidXRlcyBhcyB3ZWxsLgorCisgICAgXHZhcntuYW1lfSBpcyB0aGUgcGF0aG5hbWUgb2YgdGhlIGFyY2hpdmUuIEl0IGNhbiBiZSBvbWl0dGVkIGlmCisgICAgXHZhcntmaWxlb2JqfSBpcyBnaXZlbi4gSW4gdGhpcyBjYXNlLCB0aGUgZmlsZSBvYmplY3QncyBcbWVtYmVye25hbWV9CisgICAgYXR0cmlidXRlIGlzIHVzZWQgaWYgaXQgZXhpc3RzLgorCiAgICAgXHZhcnttb2RlfSBpcyBlaXRoZXIgXGNvZGV7J3InfSB0byByZWFkIGZyb20gYW4gZXhpc3RpbmcgYXJjaGl2ZSwKICAgICBcY29kZXsnYSd9IHRvIGFwcGVuZCBkYXRhIHRvIGFuIGV4aXN0aW5nIGZpbGUgb3IgXGNvZGV7J3cnfSB0byBjcmVhdGUgYSBuZXcKLSAgICBmaWxlIG92ZXJ3cml0aW5nIGFuIGV4aXN0aW5nIG9uZS4gXHZhcnttb2RlfSBkZWZhdWx0cyB0byBcY29kZXsncid9LgorICAgIGZpbGUgb3ZlcndyaXRpbmcgYW4gZXhpc3Rpbmcgb25lLgogCiAgICAgSWYgXHZhcntmaWxlb2JqfSBpcyBnaXZlbiwgaXQgaXMgdXNlZCBmb3IgcmVhZGluZyBvciB3cml0aW5nIGRhdGEuCiAgICAgSWYgaXQgY2FuIGJlIGRldGVybWluZWQsIFx2YXJ7bW9kZX0gaXMgb3ZlcnJpZGRlbiBieSBcdmFye2ZpbGVvYmp9J3MgbW9kZS4KQEAgLTE2NSw2ICsyMDIsNDggQEAKICAgICBcYmVnaW57bm90aWNlfQogICAgICAgICBcdmFye2ZpbGVvYmp9IGlzIG5vdCBjbG9zZWQsIHdoZW4gXGNsYXNze1RhckZpbGV9IGlzIGNsb3NlZC4KICAgICBcZW5ke25vdGljZX0KKworICAgIFx2YXJ7Zm9ybWF0fSBjb250cm9scyB0aGUgYXJjaGl2ZSBmb3JtYXQuIEl0IG11c3QgYmUgb25lIG9mIHRoZSBjb25zdGFudHMKKyAgICBcY29uc3RhbnR7VVNUQVJfRk9STUFUfSwgXGNvbnN0YW50e0dOVV9GT1JNQVR9IG9yIFxjb25zdGFudHtQQVhfRk9STUFUfQorICAgIHRoYXQgYXJlIGRlZmluZWQgYXQgbW9kdWxlIGxldmVsLgorICAgIFx2ZXJzaW9uYWRkZWR7Mi42fQorCisgICAgVGhlIFx2YXJ7dGFyaW5mb30gYXJndW1lbnQgY2FuIGJlIHVzZWQgdG8gcmVwbGFjZSB0aGUgZGVmYXVsdAorICAgIFxjbGFzc3tUYXJJbmZvfSBjbGFzcyB3aXRoIGEgZGlmZmVyZW50IG9uZS4KKyAgICBcdmVyc2lvbmFkZGVkezIuNn0KKworICAgIElmIFx2YXJ7ZGVyZWZlcmVuY2V9IGlzIFxjb2Rle0ZhbHNlfSwgYWRkIHN5bWJvbGljIGFuZCBoYXJkIGxpbmtzIHRvIHRoZQorICAgIGFyY2hpdmUuIElmIGl0IGlzIFxjb2Rle1RydWV9LCBhZGQgdGhlIGNvbnRlbnQgb2YgdGhlIHRhcmdldCBmaWxlcyB0byB0aGUKKyAgICBhcmNoaXZlLiBUaGlzIGhhcyBubyBlZmZlY3Qgb24gc3lzdGVtcyB0aGF0IGRvIG5vdCBzdXBwb3J0IHN5bWJvbGljIGxpbmtzLgorCisgICAgSWYgXHZhcntpZ25vcmVfemVyb3N9IGlzIFxjb2Rle0ZhbHNlfSwgdHJlYXQgYW4gZW1wdHkgYmxvY2sgYXMgdGhlIGVuZCBvZgorICAgIHRoZSBhcmNoaXZlLiBJZiBpdCBpcyBcdmFye1RydWV9LCBza2lwIGVtcHR5IChhbmQgaW52YWxpZCkgYmxvY2tzIGFuZCB0cnkKKyAgICB0byBnZXQgYXMgbWFueSBtZW1iZXJzIGFzIHBvc3NpYmxlLiBUaGlzIGlzIG9ubHkgdXNlZnVsIGZvciByZWFkaW5nCisgICAgY29uY2F0ZW5hdGVkIG9yIGRhbWFnZWQgYXJjaGl2ZXMuCisKKyAgICBcdmFye2RlYnVnfSBjYW4gYmUgc2V0IGZyb20gXGNvZGV7MH0gKG5vIGRlYnVnIG1lc3NhZ2VzKSB1cCB0byBcY29kZXszfQorICAgIChhbGwgZGVidWcgbWVzc2FnZXMpLiBUaGUgbWVzc2FnZXMgYXJlIHdyaXR0ZW4gdG8gXGNvZGV7c3lzLnN0ZGVycn0uCisKKyAgICBJZiBcdmFye2Vycm9ybGV2ZWx9IGlzIFxjb2RlezB9LCBhbGwgZXJyb3JzIGFyZSBpZ25vcmVkIHdoZW4gdXNpbmcKKyAgICBcbWV0aG9ke2V4dHJhY3QoKX0uICBOZXZlcnRoZWxlc3MsIHRoZXkgYXBwZWFyIGFzIGVycm9yIG1lc3NhZ2VzIGluIHRoZQorICAgIGRlYnVnIG91dHB1dCwgd2hlbiBkZWJ1Z2dpbmcgaXMgZW5hYmxlZC4gIElmIFxjb2RlezF9LCBhbGwgXGVtcGh7ZmF0YWx9CisgICAgZXJyb3JzIGFyZSByYWlzZWQgYXMgXGV4Y2VwdGlvbntPU0Vycm9yfSBvciBcZXhjZXB0aW9ue0lPRXJyb3J9IGV4Y2VwdGlvbnMuCisgICAgSWYgXGNvZGV7Mn0sIGFsbCBcZW1waHtub24tZmF0YWx9IGVycm9ycyBhcmUgcmFpc2VkIGFzIFxleGNlcHRpb257VGFyRXJyb3J9CisgICAgZXhjZXB0aW9ucyBhcyB3ZWxsLgorCisgICAgVGhlIFx2YXJ7ZW5jb2Rpbmd9IGFyZ3VtZW50IGRlZmluZXMgdGhlIGxvY2FsIGNoYXJhY3RlciBlbmNvZGluZy4gSXQKKyAgICBkZWZhdWx0cyB0byB0aGUgdmFsdWUgZnJvbSBcZnVuY3Rpb257c3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpfSBvciBpZgorICAgIHRoYXQgaXMgXGNvZGV7Tm9uZX0gdG8gXGNvZGV7ImFzY2lpIn0uIFx2YXJ7ZW5jb2Rpbmd9IGlzIHVzZWQgb25seSBpbgorICAgIGNvbm5lY3Rpb24gd2l0aCB0aGUgcGF4IGZvcm1hdCB3aGljaCBzdG9yZXMgdGV4dCBkYXRhIGluIFxlbXBoe1VURi04fS4gSWYKKyAgICBpdCBpcyBub3Qgc2V0IGNvcnJlY3RseSwgY2hhcmFjdGVyIGNvbnZlcnNpb24gd2lsbCBmYWlsIHdpdGggYQorICAgIFxleGNlcHRpb257VW5pY29kZUVycm9yfS4KKyAgICBcdmVyc2lvbmFkZGVkezIuNn0KKworICAgIFRoZSBcdmFye3BheF9oZWFkZXJzfSBhcmd1bWVudCBtdXN0IGJlIGEgZGljdGlvbmFyeSB3aG9zZSBlbGVtZW50cyBhcmUKKyAgICBlaXRoZXIgdW5pY29kZSBvYmplY3RzLCBudW1iZXJzIG9yIHN0cmluZ3MgdGhhdCBjYW4gYmUgZGVjb2RlZCB0byB1bmljb2RlCisgICAgdXNpbmcgXHZhcntlbmNvZGluZ30uIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBiZSBhZGRlZCB0byB0aGUgYXJjaGl2ZSBhcyBhCisgICAgcGF4IGdsb2JhbCBoZWFkZXIuCisgICAgXHZlcnNpb25hZGRlZHsyLjZ9CiBcZW5ke2NsYXNzZGVzY30KIAogXGJlZ2lue21ldGhvZGRlc2N9e29wZW59ey4uLn0KQEAgLTI3OSw0MyArMzU4LDExIEBACiBcZW5ke21ldGhvZGRlc2N9CiAKIFxiZWdpbnttZW1iZXJkZXNjfXtwb3NpeH0KLSAgICBJZiB0cnVlLCBjcmVhdGUgYSBcUE9TSVh7fSAxMDAzLjEtMTk5MCBjb21wbGlhbnQgYXJjaGl2ZS4gR05VCi0gICAgZXh0ZW5zaW9ucyBhcmUgbm90IHVzZWQsIGJlY2F1c2UgdGhleSBhcmUgbm90IHBhcnQgb2YgdGhlIFxQT1NJWHt9Ci0gICAgc3RhbmRhcmQuICBUaGlzIGxpbWl0cyB0aGUgbGVuZ3RoIG9mIGZpbGVuYW1lcyB0byBhdCBtb3N0IDI1NiwKLSAgICBsaW5rIG5hbWVzIHRvIDEwMCBjaGFyYWN0ZXJzIGFuZCB0aGUgbWF4aW11bSBmaWxlIHNpemUgdG8gOAotICAgIGdpZ2FieXRlcy4gQSBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IGlzIHJhaXNlZCBpZiBhIGZpbGUgZXhjZWVkcwotICAgIHRoaXMgbGltaXQuICBJZiBmYWxzZSwgY3JlYXRlIGEgR05VIHRhciBjb21wYXRpYmxlIGFyY2hpdmUuICBJdAotICAgIHdpbGwgbm90IGJlIFxQT1NJWHt9IGNvbXBsaWFudCwgYnV0IGNhbiBzdG9yZSBmaWxlcyB3aXRob3V0IGFueQotICAgIG9mIHRoZSBhYm92ZSByZXN0cmljdGlvbnMuIAorICAgIFNldHRpbmcgdGhpcyB0byBcY29uc3RhbnR7VHJ1ZX0gaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nIHRoZQorICAgIFxtZW1iZXJ7Zm9ybWF0fSBhdHRyaWJ1dGUgdG8gXGNvbnN0YW50e1VTVEFSX0ZPUk1BVH0sCisgICAgXGNvbnN0YW50e0ZhbHNlfSBpcyBlcXVpdmFsZW50IHRvIFxjb25zdGFudHtHTlVfRk9STUFUfS4KICAgICBcdmVyc2lvbmNoYW5nZWRbXHZhcntwb3NpeH0gZGVmYXVsdHMgdG8gXGNvbnN0YW50e0ZhbHNlfV17Mi40fQotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317ZGVyZWZlcmVuY2V9Ci0gICAgSWYgZmFsc2UsIGFkZCBzeW1ib2xpYyBhbmQgaGFyZCBsaW5rcyB0byBhcmNoaXZlLiBJZiB0cnVlLCBhZGQgdGhlCi0gICAgY29udGVudCBvZiB0aGUgdGFyZ2V0IGZpbGVzIHRvIHRoZSBhcmNoaXZlLiAgVGhpcyBoYXMgbm8gZWZmZWN0IG9uCi0gICAgc3lzdGVtcyB0aGF0IGRvIG5vdCBzdXBwb3J0IHN5bWJvbGljIGxpbmtzLgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317aWdub3JlX3plcm9zfQotICAgIElmIGZhbHNlLCB0cmVhdCBhbiBlbXB0eSBibG9jayBhcyB0aGUgZW5kIG9mIHRoZSBhcmNoaXZlLiBJZiB0cnVlLAotICAgIHNraXAgZW1wdHkgKGFuZCBpbnZhbGlkKSBibG9ja3MgYW5kIHRyeSB0byBnZXQgYXMgbWFueSBtZW1iZXJzIGFzCi0gICAgcG9zc2libGUuIFRoaXMgaXMgb25seSB1c2VmdWwgZm9yIGNvbmNhdGVuYXRlZCBvciBkYW1hZ2VkCi0gICAgYXJjaGl2ZXMuCi1cZW5ke21lbWJlcmRlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXtkZWJ1Zz0wfQotICAgIFRvIGJlIHNldCBmcm9tIFxjb2RlezB9IChubyBkZWJ1ZyBtZXNzYWdlczsgdGhlIGRlZmF1bHQpIHVwIHRvCi0gICAgXGNvZGV7M30gKGFsbCBkZWJ1ZyBtZXNzYWdlcykuIFRoZSBtZXNzYWdlcyBhcmUgd3JpdHRlbiB0bwotICAgIFxjb2Rle3N5cy5zdGRlcnJ9LgotXGVuZHttZW1iZXJkZXNjfQotCi1cYmVnaW57bWVtYmVyZGVzY317ZXJyb3JsZXZlbH0KLSAgICBJZiBcY29kZXswfSAodGhlIGRlZmF1bHQpLCBhbGwgZXJyb3JzIGFyZSBpZ25vcmVkIHdoZW4gdXNpbmcKLSAgICBcbWV0aG9ke2V4dHJhY3QoKX0uICBOZXZlcnRoZWxlc3MsIHRoZXkgYXBwZWFyIGFzIGVycm9yIG1lc3NhZ2VzCi0gICAgaW4gdGhlIGRlYnVnIG91dHB1dCwgd2hlbiBkZWJ1Z2dpbmcgaXMgZW5hYmxlZC4gIElmIFxjb2RlezF9LCBhbGwKLSAgICBcZW1waHtmYXRhbH0gZXJyb3JzIGFyZSByYWlzZWQgYXMgXGV4Y2VwdGlvbntPU0Vycm9yfSBvcgotICAgIFxleGNlcHRpb257SU9FcnJvcn0gZXhjZXB0aW9ucy4gIElmIFxjb2RlezJ9LCBhbGwgXGVtcGh7bm9uLWZhdGFsfQotICAgIGVycm9ycyBhcmUgcmFpc2VkIGFzIFxleGNlcHRpb257VGFyRXJyb3J9IGV4Y2VwdGlvbnMgYXMgd2VsbC4KKyAgICBcZGVwcmVjYXRlZHsyLjZ9e1VzZSB0aGUgXG1lbWJlcntmb3JtYXR9IGF0dHJpYnV0ZSBpbnN0ZWFkLn0KIFxlbmR7bWVtYmVyZGVzY30KIAogJS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zNDMsMTIgKzM5MCwxNiBAQAogICAgIGludmFsaWQuXXsyLjZ9CiBcZW5ke21ldGhvZGRlc2N9CiAKLVxiZWdpbnttZXRob2RkZXNjfXt0b2J1Zn17cG9zaXh9Ci0gICAgQ3JlYXRlIGEgc3RyaW5nIGJ1ZmZlciBmcm9tIGEgXGNsYXNze1RhckluZm99IG9iamVjdC4KLSAgICBTZWUgXGNsYXNze1RhckZpbGV9J3MgXG1lbWJlcntwb3NpeH0gYXR0cmlidXRlIGZvciBpbmZvcm1hdGlvbgotICAgIG9uIHRoZSBcdmFye3Bvc2l4fSBhcmd1bWVudC4gSXQgZGVmYXVsdHMgdG8gXGNvbnN0YW50e0ZhbHNlfS4KK1xiZWdpbnttZXRob2RkZXNjfXtmcm9tdGFyZmlsZX17dGFyZmlsZX0KKyAgICBSZWFkIHRoZSBuZXh0IG1lbWJlciBmcm9tIHRoZSBcY2xhc3N7VGFyRmlsZX0gb2JqZWN0IFx2YXJ7dGFyZmlsZX0gYW5kCisgICAgcmV0dXJuIGl0IGFzIGEgXGNsYXNze1RhckluZm99IG9iamVjdC4KKyAgICBcdmVyc2lvbmFkZGVkezIuNn0KK1xlbmR7bWV0aG9kZGVzY30KIAotICAgIFx2ZXJzaW9uYWRkZWRbVGhlIFx2YXJ7cG9zaXh9IHBhcmFtZXRlcl17Mi41fQorXGJlZ2lue21ldGhvZGRlc2N9e3RvYnVmfXtcb3B0aW9uYWx7Zm9ybWF0fX0KKyAgICBDcmVhdGUgYSBzdHJpbmcgYnVmZmVyIGZyb20gYSBcY2xhc3N7VGFySW5mb30gb2JqZWN0LiAgU2VlCisgICAgXGNsYXNze1RhckZpbGV9J3MgXG1lbWJlcntmb3JtYXR9IGFyZ3VtZW50IGZvciBpbmZvcm1hdGlvbi4KKyAgICBcdmVyc2lvbmNoYW5nZWRbVGhlIFx2YXJ7Zm9ybWF0fSBwYXJhbWV0ZXJdezIuNn0KIFxlbmR7bWV0aG9kZGVzY30KIAogQSBcY29kZXtUYXJJbmZvfSBvYmplY3QgaGFzIHRoZSBmb2xsb3dpbmcgcHVibGljIGRhdGEgYXR0cmlidXRlczoKZGlmZiAtLWdpdCBhL0xpYi90YXJmaWxlLnB5IGIvTGliL3RhcmZpbGUucHkKaW5kZXggNTRiYjFiOC4uYjZkYzNlZSAxMDA2NDQKLS0tIGEvTGliL3RhcmZpbGUucHkKKysrIGIvTGliL3RhcmZpbGUucHkKQEAgLTMzLDcgKzMzLDcgQEAKIF9fdmVyc2lvbl9fID0gIiRSZXZpc2lvbiQiCiAjICRTb3VyY2UkCiAKLXZlcnNpb24gICAgID0gIjAuOC4wIgordmVyc2lvbiAgICAgPSAiMC45LjAiCiBfX2F1dGhvcl9fICA9ICJMYXJzIEd1c3TkYmVsIChsYXJzQGd1c3RhZWJlbC5kZSkiCiBfX2RhdGVfXyAgICA9ICIkRGF0ZSQiCiBfX2N2c2lkX18gICA9ICIkSWQkIgpAQCAtNTAsNiArNTAsNyBAQAogaW1wb3J0IHRpbWUKIGltcG9ydCBzdHJ1Y3QKIGltcG9ydCBjb3B5CitpbXBvcnQgcmUKIAogaWYgc3lzLnBsYXRmb3JtID09ICdtYWMnOgogICAgICMgVGhpcyBtb2R1bGUgbmVlZHMgd29yayBmb3IgTWFjT1M5LCBlc3BlY2lhbGx5IGluIHRoZSBhcmVhIG9mIHBhdGhuYW1lCkBAIC02OSw0MiArNzAsNjAgQEAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgdGFyIGNvbnN0YW50cwogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTlVMICAgICAgICA9ICJcMCIgICAgICAgICAgICAgICAjIHRoZSBudWxsIGNoYXJhY3RlcgotQkxPQ0tTSVpFICA9IDUxMiAgICAgICAgICAgICAgICAjIGxlbmd0aCBvZiBwcm9jZXNzaW5nIGJsb2NrcworTlVMID0gIlwwIiAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBudWxsIGNoYXJhY3RlcgorQkxPQ0tTSVpFID0gNTEyICAgICAgICAgICAgICAgICAjIGxlbmd0aCBvZiBwcm9jZXNzaW5nIGJsb2NrcwogUkVDT1JEU0laRSA9IEJMT0NLU0laRSAqIDIwICAgICAjIGxlbmd0aCBvZiByZWNvcmRzCi1NQUdJQyAgICAgID0gInVzdGFyIiAgICAgICAgICAgICMgbWFnaWMgdGFyIHN0cmluZwotVkVSU0lPTiAgICA9ICIwMCIgICAgICAgICAgICAgICAjIHZlcnNpb24gbnVtYmVyCitHTlVfTUFHSUMgPSAidXN0YXIgIFwwIiAgICAgICAgICMgbWFnaWMgZ251IHRhciBzdHJpbmcKK1BPU0lYX01BR0lDID0gInVzdGFyXHgwMDAwIiAgICAgIyBtYWdpYyBwb3NpeCB0YXIgc3RyaW5nCiAKLUxFTkdUSF9OQU1FICAgID0gMTAwICAgICAgICAgICAgIyBtYXhpbXVtIGxlbmd0aCBvZiBhIGZpbGVuYW1lCi1MRU5HVEhfTElOSyAgICA9IDEwMCAgICAgICAgICAgICMgbWF4aW11bSBsZW5ndGggb2YgYSBsaW5rbmFtZQotTEVOR1RIX1BSRUZJWCAgPSAxNTUgICAgICAgICAgICAjIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBwcmVmaXggZmllbGQKLU1BWFNJWkVfTUVNQkVSID0gMDc3Nzc3Nzc3Nzc3TCAgIyBtYXhpbXVtIHNpemUgb2YgYSBmaWxlICgxMSBvY3RhbCBkaWdpdHMpCitMRU5HVEhfTkFNRSA9IDEwMCAgICAgICAgICAgICAgICMgbWF4aW11bSBsZW5ndGggb2YgYSBmaWxlbmFtZQorTEVOR1RIX0xJTksgPSAxMDAgICAgICAgICAgICAgICAjIG1heGltdW0gbGVuZ3RoIG9mIGEgbGlua25hbWUKK0xFTkdUSF9QUkVGSVggPSAxNTUgICAgICAgICAgICAgIyBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgcHJlZml4IGZpZWxkCiAKLVJFR1RZUEUgID0gIjAiICAgICAgICAgICAgICAgICAgIyByZWd1bGFyIGZpbGUKK1JFR1RZUEUgPSAiMCIgICAgICAgICAgICAgICAgICAgIyByZWd1bGFyIGZpbGUKIEFSRUdUWVBFID0gIlwwIiAgICAgICAgICAgICAgICAgIyByZWd1bGFyIGZpbGUKLUxOS1RZUEUgID0gIjEiICAgICAgICAgICAgICAgICAgIyBsaW5rIChpbnNpZGUgdGFyZmlsZSkKLVNZTVRZUEUgID0gIjIiICAgICAgICAgICAgICAgICAgIyBzeW1ib2xpYyBsaW5rCi1DSFJUWVBFICA9ICIzIiAgICAgICAgICAgICAgICAgICMgY2hhcmFjdGVyIHNwZWNpYWwgZGV2aWNlCi1CTEtUWVBFICA9ICI0IiAgICAgICAgICAgICAgICAgICMgYmxvY2sgc3BlY2lhbCBkZXZpY2UKLURJUlRZUEUgID0gIjUiICAgICAgICAgICAgICAgICAgIyBkaXJlY3RvcnkKK0xOS1RZUEUgPSAiMSIgICAgICAgICAgICAgICAgICAgIyBsaW5rIChpbnNpZGUgdGFyZmlsZSkKK1NZTVRZUEUgPSAiMiIgICAgICAgICAgICAgICAgICAgIyBzeW1ib2xpYyBsaW5rCitDSFJUWVBFID0gIjMiICAgICAgICAgICAgICAgICAgICMgY2hhcmFjdGVyIHNwZWNpYWwgZGV2aWNlCitCTEtUWVBFID0gIjQiICAgICAgICAgICAgICAgICAgICMgYmxvY2sgc3BlY2lhbCBkZXZpY2UKK0RJUlRZUEUgPSAiNSIgICAgICAgICAgICAgICAgICAgIyBkaXJlY3RvcnkKIEZJRk9UWVBFID0gIjYiICAgICAgICAgICAgICAgICAgIyBmaWZvIHNwZWNpYWwgZGV2aWNlCiBDT05UVFlQRSA9ICI3IiAgICAgICAgICAgICAgICAgICMgY29udGlndW91cyBmaWxlCiAKLUdOVVRZUEVfTE9OR05BTUUgPSAiTCIgICAgICAgICAgIyBHTlUgdGFyIGV4dGVuc2lvbiBmb3IgbG9uZ25hbWVzCi1HTlVUWVBFX0xPTkdMSU5LID0gIksiICAgICAgICAgICMgR05VIHRhciBleHRlbnNpb24gZm9yIGxvbmdsaW5rCi1HTlVUWVBFX1NQQVJTRSAgID0gIlMiICAgICAgICAgICMgR05VIHRhciBleHRlbnNpb24gZm9yIHNwYXJzZSBmaWxlCitHTlVUWVBFX0xPTkdOQU1FID0gIkwiICAgICAgICAgICMgR05VIHRhciBsb25nbmFtZQorR05VVFlQRV9MT05HTElOSyA9ICJLIiAgICAgICAgICAjIEdOVSB0YXIgbG9uZ2xpbmsKK0dOVVRZUEVfU1BBUlNFID0gIlMiICAgICAgICAgICAgIyBHTlUgdGFyIHNwYXJzZSBmaWxlCisKK1hIRFRZUEUgPSAieCIgICAgICAgICAgICAgICAgICAgIyBQT1NJWC4xLTIwMDEgZXh0ZW5kZWQgaGVhZGVyCitYR0xUWVBFID0gImciICAgICAgICAgICAgICAgICAgICMgUE9TSVguMS0yMDAxIGdsb2JhbCBoZWFkZXIKK1NPTEFSSVNfWEhEVFlQRSA9ICJYIiAgICAgICAgICAgIyBTb2xhcmlzIGV4dGVuZGVkIGhlYWRlcgorCitVU1RBUl9GT1JNQVQgPSAwICAgICAgICAgICAgICAgICMgUE9TSVguMS0xOTg4ICh1c3RhcikgZm9ybWF0CitHTlVfRk9STUFUID0gMSAgICAgICAgICAgICAgICAgICMgR05VIHRhciBmb3JtYXQKK1BBWF9GT1JNQVQgPSAyICAgICAgICAgICAgICAgICAgIyBQT1NJWC4xLTIwMDEgKHBheCkgZm9ybWF0CitERUZBVUxUX0ZPUk1BVCA9IEdOVV9GT1JNQVQKIAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyB0YXJmaWxlIGNvbnN0YW50cwogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU1VQUE9SVEVEX1RZUEVTID0gKFJFR1RZUEUsIEFSRUdUWVBFLCBMTktUWVBFLCAgIyBmaWxlIHR5cGVzIHRoYXQgdGFyZmlsZQotICAgICAgICAgICAgICAgICAgIFNZTVRZUEUsIERJUlRZUEUsIEZJRk9UWVBFLCAgIyBjYW4gY29wZSB3aXRoLgorIyBGaWxlIHR5cGVzIHRoYXQgdGFyZmlsZSBzdXBwb3J0czoKK1NVUFBPUlRFRF9UWVBFUyA9IChSRUdUWVBFLCBBUkVHVFlQRSwgTE5LVFlQRSwKKyAgICAgICAgICAgICAgICAgICBTWU1UWVBFLCBESVJUWVBFLCBGSUZPVFlQRSwKICAgICAgICAgICAgICAgICAgICBDT05UVFlQRSwgQ0hSVFlQRSwgQkxLVFlQRSwKICAgICAgICAgICAgICAgICAgICBHTlVUWVBFX0xPTkdOQU1FLCBHTlVUWVBFX0xPTkdMSU5LLAogICAgICAgICAgICAgICAgICAgIEdOVVRZUEVfU1BBUlNFKQogCi1SRUdVTEFSX1RZUEVTID0gKFJFR1RZUEUsIEFSRUdUWVBFLCAgICAgICAgICAgICAjIGZpbGUgdHlwZXMgdGhhdCBzb21laG93Ci0gICAgICAgICAgICAgICAgIENPTlRUWVBFLCBHTlVUWVBFX1NQQVJTRSkgICAgICAjIHJlcHJlc2VudCByZWd1bGFyIGZpbGVzCisjIEZpbGUgdHlwZXMgdGhhdCB3aWxsIGJlIHRyZWF0ZWQgYXMgYSByZWd1bGFyIGZpbGUuCitSRUdVTEFSX1RZUEVTID0gKFJFR1RZUEUsIEFSRUdUWVBFLAorICAgICAgICAgICAgICAgICBDT05UVFlQRSwgR05VVFlQRV9TUEFSU0UpCisKKyMgRmlsZSB0eXBlcyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBHTlUgdGFyIGZvcm1hdC4KK0dOVV9UWVBFUyA9IChHTlVUWVBFX0xPTkdOQU1FLCBHTlVUWVBFX0xPTkdMSU5LLAorICAgICAgICAgICAgIEdOVVRZUEVfU1BBUlNFKQorCisjIEZpZWxkcyBmcm9tIGEgcGF4IGhlYWRlciB0aGF0IG92ZXJyaWRlIGEgVGFySW5mbyBhdHRyaWJ1dGUuCitQQVhfRklFTERTID0gKCJwYXRoIiwgImxpbmtwYXRoIiwgInNpemUiLCAibXRpbWUiLAorICAgICAgICAgICAgICAidWlkIiwgImdpZCIsICJ1bmFtZSIsICJnbmFtZSIpCiAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgQml0cyB1c2VkIGluIHRoZSBtb2RlIGZpZWxkLCB2YWx1ZXMgaW4gb2N0YWwuCkBAIC0xMzEsNiArMTUwLDEzIEBACiBUT0VYRUMgID0gMDAwMSAgICAgICAgICAgIyBleGVjdXRlL3NlYXJjaCBieSBvdGhlcgogCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGluaXRpYWxpemF0aW9uCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFTkNPRElORyA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKQoraWYgRU5DT0RJTkcgaXMgTm9uZToKKyAgICBFTkNPRElORyA9ICJhc2NpaSIKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBTb21lIHVzZWZ1bCBmdW5jdGlvbnMKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMTM5LDYgKzE2NSwxNSBAQAogICAgICIiIgogICAgIHJldHVybiBzWzpsZW5ndGhdICsgKGxlbmd0aCAtIGxlbihzKSkgKiBOVUwKIAorZGVmIG50cyhzKToKKyAgICAiIiJDb252ZXJ0IGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBmaWVsZCB0byBhIHB5dGhvbiBzdHJpbmcuCisgICAgIiIiCisgICAgIyBVc2UgdGhlIHN0cmluZyB1cCB0byB0aGUgZmlyc3QgbnVsbCBjaGFyLgorICAgIHAgPSBzLmZpbmQoIlwwIikKKyAgICBpZiBwID09IC0xOgorICAgICAgICByZXR1cm4gcworICAgIHJldHVybiBzWzpwXQorCiBkZWYgbnRpKHMpOgogICAgICIiIkNvbnZlcnQgYSBudW1iZXIgZmllbGQgdG8gYSBweXRob24gbnVtYmVyLgogICAgICIiIgpAQCAtMTQ2LDcgKzE4MSw3IEBACiAgICAgIyBpdG4oKSBiZWxvdy4KICAgICBpZiBzWzBdICE9IGNocigwMjAwKToKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgbiA9IGludChzLnJzdHJpcChOVUwgKyAiICIpIG9yICIwIiwgOCkKKyAgICAgICAgICAgIG4gPSBpbnQobnRzKHMpIG9yICIwIiwgOCkKICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICByYWlzZSBIZWFkZXJFcnJvcigiaW52YWxpZCBoZWFkZXIiKQogICAgIGVsc2U6CkBAIC0xNTYsNyArMTkxLDcgQEAKICAgICAgICAgICAgIG4gKz0gb3JkKHNbaSArIDFdKQogICAgIHJldHVybiBuCiAKLWRlZiBpdG4obiwgZGlnaXRzPTgsIHBvc2l4PUZhbHNlKToKK2RlZiBpdG4obiwgZGlnaXRzPTgsIGZvcm1hdD1ERUZBVUxUX0ZPUk1BVCk6CiAgICAgIiIiQ29udmVydCBhIHB5dGhvbiBudW1iZXIgdG8gYSBudW1iZXIgZmllbGQuCiAgICAgIiIiCiAgICAgIyBQT1NJWCAxMDAzLjEtMTk4OCByZXF1aXJlcyBudW1iZXJzIHRvIGJlIGVuY29kZWQgYXMgYSBzdHJpbmcgb2YKQEAgLTE2OCw3ICsyMDMsNyBAQAogICAgIGlmIDAgPD0gbiA8IDggKiogKGRpZ2l0cyAtIDEpOgogICAgICAgICBzID0gIiUwKm8iICUgKGRpZ2l0cyAtIDEsIG4pICsgTlVMCiAgICAgZWxzZToKLSAgICAgICAgaWYgcG9zaXg6CisgICAgICAgIGlmIGZvcm1hdCAhPSBHTlVfRk9STUFUIG9yIG4gPj0gMjU2ICoqIChkaWdpdHMgLSAxKToKICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm92ZXJmbG93IGluIG51bWJlciBmaWVsZCIpCiAKICAgICAgICAgaWYgbiA8IDA6CkBAIC01MTQsNyArNTQ5LDEwIEBACiAgICAgICAgICAgICBidWYgPSBzZWxmLl9fcmVhZChzZWxmLmJ1ZnNpemUpCiAgICAgICAgICAgICBpZiBub3QgYnVmOgogICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBidWYgPSBzZWxmLmNtcC5kZWNvbXByZXNzKGJ1ZikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBidWYgPSBzZWxmLmNtcC5kZWNvbXByZXNzKGJ1ZikKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcigiaW52YWxpZCBjb21wcmVzc2VkIGRhdGEiKQogICAgICAgICAgICAgdC5hcHBlbmQoYnVmKQogICAgICAgICAgICAgYyArPSBsZW4oYnVmKQogICAgICAgICB0ID0gIiIuam9pbih0KQpAQCAtNTc1LDYgKzYxMyw3IEBACiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVvYmosIG1vZGUpOgogICAgICAgICBzZWxmLmZpbGVvYmogPSBmaWxlb2JqCiAgICAgICAgIHNlbGYubW9kZSA9IG1vZGUKKyAgICAgICAgc2VsZi5uYW1lID0gZ2V0YXR0cihzZWxmLmZpbGVvYmosICJuYW1lIiwgTm9uZSkKICAgICAgICAgc2VsZi5pbml0KCkKIAogICAgIGRlZiBpbml0KHNlbGYpOgpAQCAtODQ3LDggKzg4Niw4IEBACiAgICAgICAgICIiIkNvbnN0cnVjdCBhIFRhckluZm8gb2JqZWN0LiBuYW1lIGlzIHRoZSBvcHRpb25hbCBuYW1lCiAgICAgICAgICAgIG9mIHRoZSBtZW1iZXIuCiAgICAgICAgICIiIgotICAgICAgICBzZWxmLm5hbWUgPSBuYW1lICAgICAgICAjIG1lbWJlciBuYW1lIChkaXJuYW1lcyBtdXN0IGVuZCB3aXRoICcvJykKLSAgICAgICAgc2VsZi5tb2RlID0gMDY2NiAgICAgICAgIyBmaWxlIHBlcm1pc3Npb25zCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUgICAgICAgICMgbWVtYmVyIG5hbWUKKyAgICAgICAgc2VsZi5tb2RlID0gMDY0NCAgICAgICAgIyBmaWxlIHBlcm1pc3Npb25zCiAgICAgICAgIHNlbGYudWlkID0gMCAgICAgICAgICAgICMgdXNlciBpZAogICAgICAgICBzZWxmLmdpZCA9IDAgICAgICAgICAgICAjIGdyb3VwIGlkCiAgICAgICAgIHNlbGYuc2l6ZSA9IDAgICAgICAgICAgICMgZmlsZSBzaXplCkBAIC04NTYsMTcgKzg5NSwyNzQgQEAKICAgICAgICAgc2VsZi5jaGtzdW0gPSAwICAgICAgICAgIyBoZWFkZXIgY2hlY2tzdW0KICAgICAgICAgc2VsZi50eXBlID0gUkVHVFlQRSAgICAgIyBtZW1iZXIgdHlwZQogICAgICAgICBzZWxmLmxpbmtuYW1lID0gIiIgICAgICAjIGxpbmsgbmFtZQotICAgICAgICBzZWxmLnVuYW1lID0gInVzZXIiICAgICAjIHVzZXIgbmFtZQotICAgICAgICBzZWxmLmduYW1lID0gImdyb3VwIiAgICAjIGdyb3VwIG5hbWUKKyAgICAgICAgc2VsZi51bmFtZSA9ICJyb290IiAgICAgIyB1c2VyIG5hbWUKKyAgICAgICAgc2VsZi5nbmFtZSA9ICJyb290IiAgICAgIyBncm91cCBuYW1lCiAgICAgICAgIHNlbGYuZGV2bWFqb3IgPSAwICAgICAgICMgZGV2aWNlIG1ham9yIG51bWJlcgogICAgICAgICBzZWxmLmRldm1pbm9yID0gMCAgICAgICAjIGRldmljZSBtaW5vciBudW1iZXIKIAogICAgICAgICBzZWxmLm9mZnNldCA9IDAgICAgICAgICAjIHRoZSB0YXIgaGVhZGVyIHN0YXJ0cyBoZXJlCiAgICAgICAgIHNlbGYub2Zmc2V0X2RhdGEgPSAwICAgICMgdGhlIGZpbGUncyBkYXRhIHN0YXJ0cyBoZXJlCiAKKyAgICAgICAgc2VsZi5wYXhfaGVhZGVycyA9IHt9ICAgIyBwYXggaGVhZGVyIGluZm9ybWF0aW9uCisKKyAgICAjIEluIHBheCBoZWFkZXJzIHRoZSAibmFtZSIgYW5kICJsaW5rbmFtZSIgZmllbGQgYXJlIGNhbGxlZAorICAgICMgInBhdGgiIGFuZCAibGlua3BhdGgiLgorICAgIGRlZiBfZ2V0cGF0aChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubmFtZQorICAgIGRlZiBfc2V0cGF0aChzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgIHBhdGggPSBwcm9wZXJ0eShfZ2V0cGF0aCwgX3NldHBhdGgpCisKKyAgICBkZWYgX2dldGxpbmtwYXRoKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5saW5rbmFtZQorICAgIGRlZiBfc2V0bGlua3BhdGgoc2VsZiwgbGlua25hbWUpOgorICAgICAgICBzZWxmLmxpbmtuYW1lID0gbGlua25hbWUKKyAgICBsaW5rcGF0aCA9IHByb3BlcnR5KF9nZXRsaW5rcGF0aCwgX3NldGxpbmtwYXRoKQorCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gIjwlcyAlciBhdCAlI3g+IiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyxzZWxmLm5hbWUsaWQoc2VsZikpCiAKKyAgICBkZWYgZ2V0X2luZm8oc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgVGFySW5mbydzIGF0dHJpYnV0ZXMgYXMgYSBkaWN0aW9uYXJ5LgorICAgICAgICAiIiIKKyAgICAgICAgaW5mbyA9IHsKKyAgICAgICAgICAgICJuYW1lIjogICAgIG5vcm1wYXRoKHNlbGYubmFtZSksCisgICAgICAgICAgICAibW9kZSI6ICAgICBzZWxmLm1vZGUgJiAwNzc3NywKKyAgICAgICAgICAgICJ1aWQiOiAgICAgIHNlbGYudWlkLAorICAgICAgICAgICAgImdpZCI6ICAgICAgc2VsZi5naWQsCisgICAgICAgICAgICAic2l6ZSI6ICAgICBzZWxmLnNpemUsCisgICAgICAgICAgICAibXRpbWUiOiAgICBzZWxmLm10aW1lLAorICAgICAgICAgICAgImNoa3N1bSI6ICAgc2VsZi5jaGtzdW0sCisgICAgICAgICAgICAidHlwZSI6ICAgICBzZWxmLnR5cGUsCisgICAgICAgICAgICAibGlua25hbWUiOiBub3JtcGF0aChzZWxmLmxpbmtuYW1lKSBpZiBzZWxmLmxpbmtuYW1lIGVsc2UgIiIsCisgICAgICAgICAgICAidW5hbWUiOiAgICBzZWxmLnVuYW1lLAorICAgICAgICAgICAgImduYW1lIjogICAgc2VsZi5nbmFtZSwKKyAgICAgICAgICAgICJkZXZtYWpvciI6IHNlbGYuZGV2bWFqb3IsCisgICAgICAgICAgICAiZGV2bWlub3IiOiBzZWxmLmRldm1pbm9yCisgICAgICAgIH0KKworICAgICAgICBpZiBpbmZvWyJ0eXBlIl0gPT0gRElSVFlQRSBhbmQgbm90IGluZm9bIm5hbWUiXS5lbmRzd2l0aCgiLyIpOgorICAgICAgICAgICAgaW5mb1sibmFtZSJdICs9ICIvIgorCisgICAgICAgIHJldHVybiBpbmZvCisKKyAgICBkZWYgdG9idWYoc2VsZiwgZm9ybWF0PURFRkFVTFRfRk9STUFULCBlbmNvZGluZz1FTkNPRElORyk6CisgICAgICAgICIiIlJldHVybiBhIHRhciBoZWFkZXIgYXMgYSBzdHJpbmcgb2YgNTEyIGJ5dGUgYmxvY2tzLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgZm9ybWF0ID09IFVTVEFSX0ZPUk1BVDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNyZWF0ZV91c3Rhcl9oZWFkZXIoKQorICAgICAgICBlbGlmIGZvcm1hdCA9PSBHTlVfRk9STUFUOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY3JlYXRlX2dudV9oZWFkZXIoKQorICAgICAgICBlbGlmIGZvcm1hdCA9PSBQQVhfRk9STUFUOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY3JlYXRlX3BheF9oZWFkZXIoZW5jb2RpbmcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnZhbGlkIGZvcm1hdCIpCisKKyAgICBkZWYgY3JlYXRlX3VzdGFyX2hlYWRlcihzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBvYmplY3QgYXMgYSB1c3RhciBoZWFkZXIgYmxvY2suCisgICAgICAgICIiIgorICAgICAgICBpbmZvID0gc2VsZi5nZXRfaW5mbygpCisgICAgICAgIGluZm9bIm1hZ2ljIl0gPSBQT1NJWF9NQUdJQworCisgICAgICAgIGlmIGxlbihpbmZvWyJsaW5rbmFtZSJdKSA+IExFTkdUSF9MSU5LOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibGlua25hbWUgaXMgdG9vIGxvbmciKQorCisgICAgICAgIGlmIGxlbihpbmZvWyJuYW1lIl0pID4gTEVOR1RIX05BTUU6CisgICAgICAgICAgICBpbmZvWyJwcmVmaXgiXSwgaW5mb1sibmFtZSJdID0gc2VsZi5fcG9zaXhfc3BsaXRfbmFtZShpbmZvWyJuYW1lIl0pCisKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NyZWF0ZV9oZWFkZXIoaW5mbywgVVNUQVJfRk9STUFUKQorCisgICAgZGVmIGNyZWF0ZV9nbnVfaGVhZGVyKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG9iamVjdCBhcyBhIEdOVSBoZWFkZXIgYmxvY2sgc2VxdWVuY2UuCisgICAgICAgICIiIgorICAgICAgICBpbmZvID0gc2VsZi5nZXRfaW5mbygpCisgICAgICAgIGluZm9bIm1hZ2ljIl0gPSBHTlVfTUFHSUMKKworICAgICAgICBidWYgPSAiIgorICAgICAgICBpZiBsZW4oaW5mb1sibGlua25hbWUiXSkgPiBMRU5HVEhfTElOSzoKKyAgICAgICAgICAgIGJ1ZiArPSBzZWxmLl9jcmVhdGVfZ251X2xvbmdfaGVhZGVyKGluZm9bImxpbmtuYW1lIl0sIEdOVVRZUEVfTE9OR0xJTkspCisKKyAgICAgICAgaWYgbGVuKGluZm9bIm5hbWUiXSkgPiBMRU5HVEhfTkFNRToKKyAgICAgICAgICAgIGJ1ZiArPSBzZWxmLl9jcmVhdGVfZ251X2xvbmdfaGVhZGVyKGluZm9bIm5hbWUiXSwgR05VVFlQRV9MT05HTkFNRSkKKworICAgICAgICByZXR1cm4gYnVmICsgc2VsZi5fY3JlYXRlX2hlYWRlcihpbmZvLCBHTlVfRk9STUFUKQorCisgICAgZGVmIGNyZWF0ZV9wYXhfaGVhZGVyKHNlbGYsIGVuY29kaW5nKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBvYmplY3QgYXMgYSB1c3RhciBoZWFkZXIgYmxvY2suIElmIGl0IGNhbm5vdCBiZQorICAgICAgICAgICByZXByZXNlbnRlZCB0aGlzIHdheSwgcHJlcGVuZCBhIHBheCBleHRlbmRlZCBoZWFkZXIgc2VxdWVuY2UKKyAgICAgICAgICAgd2l0aCBzdXBwbGVtZW50IGluZm9ybWF0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgaW5mbyA9IHNlbGYuZ2V0X2luZm8oKQorICAgICAgICBpbmZvWyJtYWdpYyJdID0gUE9TSVhfTUFHSUMKKyAgICAgICAgcGF4X2hlYWRlcnMgPSBzZWxmLnBheF9oZWFkZXJzLmNvcHkoKQorCisgICAgICAgICMgVGVzdCBzdHJpbmcgZmllbGRzIGZvciB2YWx1ZXMgdGhhdCBleGNlZWQgdGhlIGZpZWxkIGxlbmd0aCBvciBjYW5ub3QKKyAgICAgICAgIyBiZSByZXByZXNlbnRlZCBpbiBBU0NJSSBlbmNvZGluZy4KKyAgICAgICAgZm9yIG5hbWUsIGhuYW1lLCBsZW5ndGggaW4gKAorICAgICAgICAgICAgICAgICgibmFtZSIsICJwYXRoIiwgTEVOR1RIX05BTUUpLCAoImxpbmtuYW1lIiwgImxpbmtwYXRoIiwgTEVOR1RIX0xJTkspLAorICAgICAgICAgICAgICAgICgidW5hbWUiLCAidW5hbWUiLCAzMiksICgiZ25hbWUiLCAiZ25hbWUiLCAzMikpOgorCisgICAgICAgICAgICB2YWwgPSBpbmZvW25hbWVdLmRlY29kZShlbmNvZGluZykKKworICAgICAgICAgICAgIyBUcnkgdG8gZW5jb2RlIHRoZSBzdHJpbmcgYXMgQVNDSUkuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdmFsLmVuY29kZSgiYXNjaWkiKQorICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXhfaGVhZGVyc1tobmFtZV0gPSB2YWwKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBsZW4odmFsKSA+IGxlbmd0aDoKKyAgICAgICAgICAgICAgICBpZiBuYW1lID09ICJuYW1lIjoKKyAgICAgICAgICAgICAgICAgICAgIyBUcnkgdG8gc3F1ZWV6ZSBhIGxvbmduYW1lIGluIHRoZSBwcmVmaXggYW5kIG5hbWUgZmllbGRzIGFzIGluCisgICAgICAgICAgICAgICAgICAgICMgdXN0YXIgZm9ybWF0LgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvWyJwcmVmaXgiXSwgaW5mb1sibmFtZSJdID0gc2VsZi5fcG9zaXhfc3BsaXRfbmFtZShpbmZvWyJuYW1lIl0pCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgcGF4X2hlYWRlcnNbaG5hbWVdID0gdmFsCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHBheF9oZWFkZXJzW2huYW1lXSA9IHZhbAorCisgICAgICAgICMgVGVzdCBudW1iZXIgZmllbGRzIGZvciB2YWx1ZXMgdGhhdCBleGNlZWQgdGhlIGZpZWxkIGxpbWl0IG9yIHZhbHVlcworICAgICAgICAjIHRoYXQgbGlrZSB0byBiZSBzdG9yZWQgYXMgZmxvYXQuCisgICAgICAgIGZvciBuYW1lLCBkaWdpdHMgaW4gKCgidWlkIiwgOCksICgiZ2lkIiwgOCksICgic2l6ZSIsIDEyKSwgKCJtdGltZSIsIDEyKSk6CisgICAgICAgICAgICB2YWwgPSBpbmZvW25hbWVdCisgICAgICAgICAgICBpZiBub3QgMCA8PSB2YWwgPCA4ICoqIChkaWdpdHMgLSAxKSBvciBpc2luc3RhbmNlKHZhbCwgZmxvYXQpOgorICAgICAgICAgICAgICAgIHBheF9oZWFkZXJzW25hbWVdID0gdW5pY29kZSh2YWwpCisgICAgICAgICAgICAgICAgaW5mb1tuYW1lXSA9IDAKKworICAgICAgICBpZiBwYXhfaGVhZGVyczoKKyAgICAgICAgICAgIGJ1ZiA9IHNlbGYuX2NyZWF0ZV9wYXhfZ2VuZXJpY19oZWFkZXIocGF4X2hlYWRlcnMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBidWYgPSAiIgorCisgICAgICAgIHJldHVybiBidWYgKyBzZWxmLl9jcmVhdGVfaGVhZGVyKGluZm8sIFVTVEFSX0ZPUk1BVCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBjcmVhdGVfcGF4X2dsb2JhbF9oZWFkZXIoY2xzLCBwYXhfaGVhZGVycywgZW5jb2RpbmcpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG9iamVjdCBhcyBhIHBheCBnbG9iYWwgaGVhZGVyIGJsb2NrIHNlcXVlbmNlLgorICAgICAgICAiIiIKKyAgICAgICAgbmV3X2hlYWRlcnMgPSB7fQorICAgICAgICBmb3Iga2V5LCB2YWwgaW4gcGF4X2hlYWRlcnMuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBrZXkgPSBjbHMuX3RvX3VuaWNvZGUoa2V5LCBlbmNvZGluZykKKyAgICAgICAgICAgIHZhbCA9IGNscy5fdG9fdW5pY29kZSh2YWwsIGVuY29kaW5nKQorICAgICAgICAgICAgbmV3X2hlYWRlcnNba2V5XSA9IHZhbAorICAgICAgICByZXR1cm4gY2xzLl9jcmVhdGVfcGF4X2dlbmVyaWNfaGVhZGVyKG5ld19oZWFkZXJzLCB0eXBlPVhHTFRZUEUpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF90b191bmljb2RlKHZhbHVlLCBlbmNvZGluZyk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHVuaWNvZGUpOgorICAgICAgICAgICAgcmV0dXJuIHZhbHVlCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgKGludCwgbG9uZywgZmxvYXQpKToKKyAgICAgICAgICAgIHJldHVybiB1bmljb2RlKHZhbHVlKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIHN0cik6CisgICAgICAgICAgICByZXR1cm4gdW5pY29kZSh2YWx1ZSwgZW5jb2RpbmcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmFibGUgdG8gY29udmVydCB0byB1bmljb2RlOiAlciIgJSB2YWx1ZSkKKworICAgIGRlZiBfcG9zaXhfc3BsaXRfbmFtZShzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiU3BsaXQgYSBuYW1lIGxvbmdlciB0aGFuIDEwMCBjaGFycyBpbnRvIGEgcHJlZml4CisgICAgICAgICAgIGFuZCBhIG5hbWUgcGFydC4KKyAgICAgICAgIiIiCisgICAgICAgIHByZWZpeCA9IG5hbWVbOkxFTkdUSF9QUkVGSVggKyAxXQorICAgICAgICB3aGlsZSBwcmVmaXggYW5kIHByZWZpeFstMV0gIT0gIi8iOgorICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4WzotMV0KKworICAgICAgICBuYW1lID0gbmFtZVtsZW4ocHJlZml4KTpdCisgICAgICAgIHByZWZpeCA9IHByZWZpeFs6LTFdCisKKyAgICAgICAgaWYgbm90IHByZWZpeCBvciBsZW4obmFtZSkgPiBMRU5HVEhfTkFNRToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5hbWUgaXMgdG9vIGxvbmciKQorICAgICAgICByZXR1cm4gcHJlZml4LCBuYW1lCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9jcmVhdGVfaGVhZGVyKGluZm8sIGZvcm1hdCk6CisgICAgICAgICIiIlJldHVybiBhIGhlYWRlciBibG9jay4gaW5mbyBpcyBhIGRpY3Rpb25hcnkgd2l0aCBmaWxlCisgICAgICAgICAgIGluZm9ybWF0aW9uLCBmb3JtYXQgbXVzdCBiZSBvbmUgb2YgdGhlICpfRk9STUFUIGNvbnN0YW50cy4KKyAgICAgICAgIiIiCisgICAgICAgIHBhcnRzID0gWworICAgICAgICAgICAgc3RuKGluZm8uZ2V0KCJuYW1lIiwgIiIpLCAxMDApLAorICAgICAgICAgICAgaXRuKGluZm8uZ2V0KCJtb2RlIiwgMCkgJiAwNzc3NywgOCwgZm9ybWF0KSwKKyAgICAgICAgICAgIGl0bihpbmZvLmdldCgidWlkIiwgMCksIDgsIGZvcm1hdCksCisgICAgICAgICAgICBpdG4oaW5mby5nZXQoImdpZCIsIDApLCA4LCBmb3JtYXQpLAorICAgICAgICAgICAgaXRuKGluZm8uZ2V0KCJzaXplIiwgMCksIDEyLCBmb3JtYXQpLAorICAgICAgICAgICAgaXRuKGluZm8uZ2V0KCJtdGltZSIsIDApLCAxMiwgZm9ybWF0KSwKKyAgICAgICAgICAgICIgICAgICAgICIsICMgY2hlY2tzdW0gZmllbGQKKyAgICAgICAgICAgIGluZm8uZ2V0KCJ0eXBlIiwgUkVHVFlQRSksCisgICAgICAgICAgICBzdG4oaW5mby5nZXQoImxpbmtuYW1lIiwgIiIpLCAxMDApLAorICAgICAgICAgICAgc3RuKGluZm8uZ2V0KCJtYWdpYyIsICIiKSwgOCksCisgICAgICAgICAgICBzdG4oaW5mby5nZXQoInVuYW1lIiwgIiIpLCAzMiksCisgICAgICAgICAgICBzdG4oaW5mby5nZXQoImduYW1lIiwgIiIpLCAzMiksCisgICAgICAgICAgICBpdG4oaW5mby5nZXQoImRldm1ham9yIiwgMCksIDgsIGZvcm1hdCksCisgICAgICAgICAgICBpdG4oaW5mby5nZXQoImRldm1pbm9yIiwgMCksIDgsIGZvcm1hdCksCisgICAgICAgICAgICBzdG4oaW5mby5nZXQoInByZWZpeCIsICIiKSwgMTU1KQorICAgICAgICBdCisKKyAgICAgICAgYnVmID0gc3RydWN0LnBhY2soIiVkcyIgJSBCTE9DS1NJWkUsICIiLmpvaW4ocGFydHMpKQorICAgICAgICBjaGtzdW0gPSBjYWxjX2Noa3N1bXMoYnVmWy1CTE9DS1NJWkU6XSlbMF0KKyAgICAgICAgYnVmID0gYnVmWzotMzY0XSArICIlMDZvXDAiICUgY2hrc3VtICsgYnVmWy0zNTc6XQorICAgICAgICByZXR1cm4gYnVmCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9jcmVhdGVfcGF5bG9hZChwYXlsb2FkKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBzdHJpbmcgcGF5bG9hZCBmaWxsZWQgd2l0aCB6ZXJvIGJ5dGVzCisgICAgICAgICAgIHVwIHRvIHRoZSBuZXh0IDUxMiBieXRlIGJvcmRlci4KKyAgICAgICAgIiIiCisgICAgICAgIGJsb2NrcywgcmVtYWluZGVyID0gZGl2bW9kKGxlbihwYXlsb2FkKSwgQkxPQ0tTSVpFKQorICAgICAgICBpZiByZW1haW5kZXIgPiAwOgorICAgICAgICAgICAgcGF5bG9hZCArPSAoQkxPQ0tTSVpFIC0gcmVtYWluZGVyKSAqIE5VTAorICAgICAgICByZXR1cm4gcGF5bG9hZAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9jcmVhdGVfZ251X2xvbmdfaGVhZGVyKGNscywgbmFtZSwgdHlwZSk6CisgICAgICAgICIiIlJldHVybiBhIEdOVVRZUEVfTE9OR05BTUUgb3IgR05VVFlQRV9MT05HTElOSyBzZXF1ZW5jZQorICAgICAgICAgICBmb3IgbmFtZS4KKyAgICAgICAgIiIiCisgICAgICAgIG5hbWUgKz0gTlVMCisKKyAgICAgICAgaW5mbyA9IHt9CisgICAgICAgIGluZm9bIm5hbWUiXSA9ICIuLy4vQExvbmdMaW5rIgorICAgICAgICBpbmZvWyJ0eXBlIl0gPSB0eXBlCisgICAgICAgIGluZm9bInNpemUiXSA9IGxlbihuYW1lKQorICAgICAgICBpbmZvWyJtYWdpYyJdID0gR05VX01BR0lDCisKKyAgICAgICAgIyBjcmVhdGUgZXh0ZW5kZWQgaGVhZGVyICsgbmFtZSBibG9ja3MuCisgICAgICAgIHJldHVybiBjbHMuX2NyZWF0ZV9oZWFkZXIoaW5mbywgVVNUQVJfRk9STUFUKSArIFwKKyAgICAgICAgICAgICAgICBjbHMuX2NyZWF0ZV9wYXlsb2FkKG5hbWUpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX2NyZWF0ZV9wYXhfZ2VuZXJpY19oZWFkZXIoY2xzLCBwYXhfaGVhZGVycywgdHlwZT1YSERUWVBFKToKKyAgICAgICAgIiIiUmV0dXJuIGEgUE9TSVguMS0yMDAxIGV4dGVuZGVkIG9yIGdsb2JhbCBoZWFkZXIgc2VxdWVuY2UKKyAgICAgICAgICAgdGhhdCBjb250YWlucyBhIGxpc3Qgb2Yga2V5d29yZCwgdmFsdWUgcGFpcnMuIFRoZSB2YWx1ZXMKKyAgICAgICAgICAgbXVzdCBiZSB1bmljb2RlIG9iamVjdHMuCisgICAgICAgICIiIgorICAgICAgICByZWNvcmRzID0gW10KKyAgICAgICAgZm9yIGtleXdvcmQsIHZhbHVlIGluIHBheF9oZWFkZXJzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAga2V5d29yZCA9IGtleXdvcmQuZW5jb2RlKCJ1dGY4IikKKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuZW5jb2RlKCJ1dGY4IikKKyAgICAgICAgICAgIGwgPSBsZW4oa2V5d29yZCkgKyBsZW4odmFsdWUpICsgMyAgICMgJyAnICsgJz0nICsgJ1xuJworICAgICAgICAgICAgbiA9IHAgPSAwCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIG4gPSBsICsgbGVuKHN0cihwKSkKKyAgICAgICAgICAgICAgICBpZiBuID09IHA6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgcCA9IG4KKyAgICAgICAgICAgIHJlY29yZHMuYXBwZW5kKCIlZCAlcz0lc1xuIiAlIChwLCBrZXl3b3JkLCB2YWx1ZSkpCisgICAgICAgIHJlY29yZHMgPSAiIi5qb2luKHJlY29yZHMpCisKKyAgICAgICAgIyBXZSB1c2UgYSBoYXJkY29kZWQgIi4vLi9AUGF4SGVhZGVyIiBuYW1lIGxpa2Ugc3RhciBkb2VzCisgICAgICAgICMgaW5zdGVhZCBvZiB0aGUgb25lIHRoYXQgUE9TSVggcmVjb21tZW5kcy4KKyAgICAgICAgaW5mbyA9IHt9CisgICAgICAgIGluZm9bIm5hbWUiXSA9ICIuLy4vQFBheEhlYWRlciIKKyAgICAgICAgaW5mb1sidHlwZSJdID0gdHlwZQorICAgICAgICBpbmZvWyJzaXplIl0gPSBsZW4ocmVjb3JkcykKKyAgICAgICAgaW5mb1sibWFnaWMiXSA9IFBPU0lYX01BR0lDCisKKyAgICAgICAgIyBDcmVhdGUgcGF4IGhlYWRlciArIHJlY29yZCBibG9ja3MuCisgICAgICAgIHJldHVybiBjbHMuX2NyZWF0ZV9oZWFkZXIoaW5mbywgVVNUQVJfRk9STUFUKSArIFwKKyAgICAgICAgICAgICAgICBjbHMuX2NyZWF0ZV9wYXlsb2FkKHJlY29yZHMpCisKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgZnJvbWJ1ZihjbHMsIGJ1Zik6CiAgICAgICAgICIiIkNvbnN0cnVjdCBhIFRhckluZm8gb2JqZWN0IGZyb20gYSA1MTIgYnl0ZSBzdHJpbmcgYnVmZmVyLgpAQCAtODgwLDEyNSArMTE3NiwyNTEgQEAKICAgICAgICAgaWYgY2hrc3VtIG5vdCBpbiBjYWxjX2Noa3N1bXMoYnVmKToKICAgICAgICAgICAgIHJhaXNlIEhlYWRlckVycm9yKCJiYWQgY2hlY2tzdW0iKQogCi0gICAgICAgIHRhcmluZm8gPSBjbHMoKQotICAgICAgICB0YXJpbmZvLmJ1ZiA9IGJ1ZgotICAgICAgICB0YXJpbmZvLm5hbWUgPSBidWZbMDoxMDBdLnJzdHJpcChOVUwpCi0gICAgICAgIHRhcmluZm8ubW9kZSA9IG50aShidWZbMTAwOjEwOF0pCi0gICAgICAgIHRhcmluZm8udWlkID0gbnRpKGJ1ZlsxMDg6MTE2XSkKLSAgICAgICAgdGFyaW5mby5naWQgPSBudGkoYnVmWzExNjoxMjRdKQotICAgICAgICB0YXJpbmZvLnNpemUgPSBudGkoYnVmWzEyNDoxMzZdKQotICAgICAgICB0YXJpbmZvLm10aW1lID0gbnRpKGJ1ZlsxMzY6MTQ4XSkKLSAgICAgICAgdGFyaW5mby5jaGtzdW0gPSBjaGtzdW0KLSAgICAgICAgdGFyaW5mby50eXBlID0gYnVmWzE1NjoxNTddCi0gICAgICAgIHRhcmluZm8ubGlua25hbWUgPSBidWZbMTU3OjI1N10ucnN0cmlwKE5VTCkKLSAgICAgICAgdGFyaW5mby51bmFtZSA9IGJ1ZlsyNjU6Mjk3XS5yc3RyaXAoTlVMKQotICAgICAgICB0YXJpbmZvLmduYW1lID0gYnVmWzI5NzozMjldLnJzdHJpcChOVUwpCi0gICAgICAgIHRhcmluZm8uZGV2bWFqb3IgPSBudGkoYnVmWzMyOTozMzddKQotICAgICAgICB0YXJpbmZvLmRldm1pbm9yID0gbnRpKGJ1ZlszMzc6MzQ1XSkKLSAgICAgICAgcHJlZml4ID0gYnVmWzM0NTo1MDBdLnJzdHJpcChOVUwpCisgICAgICAgIG9iaiA9IGNscygpCisgICAgICAgIG9iai5idWYgPSBidWYKKyAgICAgICAgb2JqLm5hbWUgPSBudHMoYnVmWzA6MTAwXSkKKyAgICAgICAgb2JqLm1vZGUgPSBudGkoYnVmWzEwMDoxMDhdKQorICAgICAgICBvYmoudWlkID0gbnRpKGJ1ZlsxMDg6MTE2XSkKKyAgICAgICAgb2JqLmdpZCA9IG50aShidWZbMTE2OjEyNF0pCisgICAgICAgIG9iai5zaXplID0gbnRpKGJ1ZlsxMjQ6MTM2XSkKKyAgICAgICAgb2JqLm10aW1lID0gbnRpKGJ1ZlsxMzY6MTQ4XSkKKyAgICAgICAgb2JqLmNoa3N1bSA9IGNoa3N1bQorICAgICAgICBvYmoudHlwZSA9IGJ1ZlsxNTY6MTU3XQorICAgICAgICBvYmoubGlua25hbWUgPSBudHMoYnVmWzE1NzoyNTddKQorICAgICAgICBvYmoudW5hbWUgPSBudHMoYnVmWzI2NToyOTddKQorICAgICAgICBvYmouZ25hbWUgPSBudHMoYnVmWzI5NzozMjldKQorICAgICAgICBvYmouZGV2bWFqb3IgPSBudGkoYnVmWzMyOTozMzddKQorICAgICAgICBvYmouZGV2bWlub3IgPSBudGkoYnVmWzMzNzozNDVdKQorICAgICAgICBwcmVmaXggPSBudHMoYnVmWzM0NTo1MDBdKQogCi0gICAgICAgIGlmIHByZWZpeCBhbmQgbm90IHRhcmluZm8uaXNzcGFyc2UoKToKLSAgICAgICAgICAgIHRhcmluZm8ubmFtZSA9IHByZWZpeCArICIvIiArIHRhcmluZm8ubmFtZQorICAgICAgICAjIE9sZCBWNyB0YXIgZm9ybWF0IHJlcHJlc2VudHMgYSBkaXJlY3RvcnkgYXMgYSByZWd1bGFyCisgICAgICAgICMgZmlsZSB3aXRoIGEgdHJhaWxpbmcgc2xhc2guCisgICAgICAgIGlmIG9iai50eXBlID09IEFSRUdUWVBFIGFuZCBvYmoubmFtZS5lbmRzd2l0aCgiLyIpOgorICAgICAgICAgICAgb2JqLnR5cGUgPSBESVJUWVBFCiAKLSAgICAgICAgcmV0dXJuIHRhcmluZm8KKyAgICAgICAgIyBSZW1vdmUgcmVkdW5kYW50IHNsYXNoZXMgZnJvbSBkaXJlY3Rvcmllcy4KKyAgICAgICAgaWYgb2JqLmlzZGlyKCk6CisgICAgICAgICAgICBvYmoubmFtZSA9IG9iai5uYW1lLnJzdHJpcCgiLyIpCiAKLSAgICBkZWYgdG9idWYoc2VsZiwgcG9zaXg9RmFsc2UpOgotICAgICAgICAiIiJSZXR1cm4gYSB0YXIgaGVhZGVyIGFzIGEgc3RyaW5nIG9mIDUxMiBieXRlIGJsb2Nrcy4KKyAgICAgICAgIyBSZWNvbnN0cnVjdCBhIHVzdGFyIGxvbmduYW1lLgorICAgICAgICBpZiBwcmVmaXggYW5kIG9iai50eXBlIG5vdCBpbiBHTlVfVFlQRVM6CisgICAgICAgICAgICBvYmoubmFtZSA9IHByZWZpeCArICIvIiArIG9iai5uYW1lCisgICAgICAgIHJldHVybiBvYmoKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmcm9tdGFyZmlsZShjbHMsIHRhcmZpbGUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG5leHQgVGFySW5mbyBvYmplY3QgZnJvbSBUYXJGaWxlIG9iamVjdAorICAgICAgICAgICB0YXJmaWxlLgogICAgICAgICAiIiIKLSAgICAgICAgYnVmID0gIiIKLSAgICAgICAgdHlwZSA9IHNlbGYudHlwZQotICAgICAgICBwcmVmaXggPSAiIgorICAgICAgICBidWYgPSB0YXJmaWxlLmZpbGVvYmoucmVhZChCTE9DS1NJWkUpCisgICAgICAgIGlmIG5vdCBidWY6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgb2JqID0gY2xzLmZyb21idWYoYnVmKQorICAgICAgICBvYmoub2Zmc2V0ID0gdGFyZmlsZS5maWxlb2JqLnRlbGwoKSAtIEJMT0NLU0laRQorICAgICAgICByZXR1cm4gb2JqLl9wcm9jX21lbWJlcih0YXJmaWxlKQogCi0gICAgICAgIGlmIHNlbGYubmFtZS5lbmRzd2l0aCgiLyIpOgotICAgICAgICAgICAgdHlwZSA9IERJUlRZUEUKLQotICAgICAgICBpZiB0eXBlIGluIChHTlVUWVBFX0xPTkdOQU1FLCBHTlVUWVBFX0xPTkdMSU5LKToKLSAgICAgICAgICAgICMgUHJldmVudCAiLi8uL0BMb25nTGluayIgZnJvbSBiZWluZyBub3JtYWxpemVkLgotICAgICAgICAgICAgbmFtZSA9IHNlbGYubmFtZQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgbmFtZSA9IG5vcm1wYXRoKHNlbGYubmFtZSkKLQotICAgICAgICBpZiB0eXBlID09IERJUlRZUEU6Ci0gICAgICAgICAgICAjIGRpcmVjdG9yaWVzIHNob3VsZCBlbmQgd2l0aCAnLycKLSAgICAgICAgICAgIG5hbWUgKz0gIi8iCi0KLSAgICAgICAgbGlua25hbWUgPSBzZWxmLmxpbmtuYW1lCi0gICAgICAgIGlmIGxpbmtuYW1lOgotICAgICAgICAgICAgIyBpZiBsaW5rbmFtZSBpcyBlbXB0eSB3ZSBlbmQgdXAgd2l0aCBhICcuJwotICAgICAgICAgICAgbGlua25hbWUgPSBub3JtcGF0aChsaW5rbmFtZSkKLQotICAgICAgICBpZiBwb3NpeDoKLSAgICAgICAgICAgIGlmIHNlbGYuc2l6ZSA+IE1BWFNJWkVfTUVNQkVSOgotICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZpbGUgaXMgdG9vIGxhcmdlICg+PSA4IEdCKSIpCi0KLSAgICAgICAgICAgIGlmIGxlbihzZWxmLmxpbmtuYW1lKSA+IExFTkdUSF9MSU5LOgotICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImxpbmtuYW1lIGlzIHRvbyBsb25nICg+JWQpIiAlIChMRU5HVEhfTElOSykpCi0KLSAgICAgICAgICAgIGlmIGxlbihuYW1lKSA+IExFTkdUSF9OQU1FOgotICAgICAgICAgICAgICAgIHByZWZpeCA9IG5hbWVbOkxFTkdUSF9QUkVGSVggKyAxXQotICAgICAgICAgICAgICAgIHdoaWxlIHByZWZpeCBhbmQgcHJlZml4Wy0xXSAhPSAiLyI6Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeFs6LTFdCi0KLSAgICAgICAgICAgICAgICBuYW1lID0gbmFtZVtsZW4ocHJlZml4KTpdCi0gICAgICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4WzotMV0KLQotICAgICAgICAgICAgICAgIGlmIG5vdCBwcmVmaXggb3IgbGVuKG5hbWUpID4gTEVOR1RIX05BTUU6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5hbWUgaXMgdG9vIGxvbmciKQotCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBpZiBsZW4oc2VsZi5saW5rbmFtZSkgPiBMRU5HVEhfTElOSzoKLSAgICAgICAgICAgICAgICBidWYgKz0gc2VsZi5fY3JlYXRlX2dudWxvbmcoc2VsZi5saW5rbmFtZSwgR05VVFlQRV9MT05HTElOSykKLQotICAgICAgICAgICAgaWYgbGVuKG5hbWUpID4gTEVOR1RIX05BTUU6Ci0gICAgICAgICAgICAgICAgYnVmICs9IHNlbGYuX2NyZWF0ZV9nbnVsb25nKG5hbWUsIEdOVVRZUEVfTE9OR05BTUUpCi0KLSAgICAgICAgcGFydHMgPSBbCi0gICAgICAgICAgICBzdG4obmFtZSwgMTAwKSwKLSAgICAgICAgICAgIGl0bihzZWxmLm1vZGUgJiAwNzc3NywgOCwgcG9zaXgpLAotICAgICAgICAgICAgaXRuKHNlbGYudWlkLCA4LCBwb3NpeCksCi0gICAgICAgICAgICBpdG4oc2VsZi5naWQsIDgsIHBvc2l4KSwKLSAgICAgICAgICAgIGl0bihzZWxmLnNpemUsIDEyLCBwb3NpeCksCi0gICAgICAgICAgICBpdG4oc2VsZi5tdGltZSwgMTIsIHBvc2l4KSwKLSAgICAgICAgICAgICIgICAgICAgICIsICMgY2hlY2tzdW0gZmllbGQKLSAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICBzdG4oc2VsZi5saW5rbmFtZSwgMTAwKSwKLSAgICAgICAgICAgIHN0bihNQUdJQywgNiksCi0gICAgICAgICAgICBzdG4oVkVSU0lPTiwgMiksCi0gICAgICAgICAgICBzdG4oc2VsZi51bmFtZSwgMzIpLAotICAgICAgICAgICAgc3RuKHNlbGYuZ25hbWUsIDMyKSwKLSAgICAgICAgICAgIGl0bihzZWxmLmRldm1ham9yLCA4LCBwb3NpeCksCi0gICAgICAgICAgICBpdG4oc2VsZi5kZXZtaW5vciwgOCwgcG9zaXgpLAotICAgICAgICAgICAgc3RuKHByZWZpeCwgMTU1KQotICAgICAgICBdCi0KLSAgICAgICAgYnVmICs9IHN0cnVjdC5wYWNrKCIlZHMiICUgQkxPQ0tTSVpFLCAiIi5qb2luKHBhcnRzKSkKLSAgICAgICAgY2hrc3VtID0gY2FsY19jaGtzdW1zKGJ1ZlstQkxPQ0tTSVpFOl0pWzBdCi0gICAgICAgIGJ1ZiA9IGJ1Zls6LTM2NF0gKyAiJTA2b1wwIiAlIGNoa3N1bSArIGJ1ZlstMzU3Ol0KLSAgICAgICAgc2VsZi5idWYgPSBidWYKLSAgICAgICAgcmV0dXJuIGJ1ZgotCi0gICAgZGVmIF9jcmVhdGVfZ251bG9uZyhzZWxmLCBuYW1lLCB0eXBlKToKLSAgICAgICAgIiIiQ3JlYXRlIGEgR05VIGxvbmduYW1lL2xvbmdsaW5rIGhlYWRlciBmcm9tIG5hbWUuCi0gICAgICAgICAgIEl0IGNvbnNpc3RzIG9mIGFuIGV4dGVuZGVkIHRhciBoZWFkZXIsIHdpdGggdGhlIGxlbmd0aAotICAgICAgICAgICBvZiB0aGUgbG9uZ25hbWUgYXMgc2l6ZSwgZm9sbG93ZWQgYnkgZGF0YSBibG9ja3MsCi0gICAgICAgICAgIHdoaWNoIGNvbnRhaW4gdGhlIGxvbmduYW1lIGFzIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZy4KKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIFRoZSBmb2xsb3dpbmcgYXJlIG1ldGhvZHMgdGhhdCBhcmUgY2FsbGVkIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBhCisgICAgIyBtZW1iZXIuIFRoZSBlbnRyeSBwb2ludCBpcyBfcHJvY19tZW1iZXIoKSB3aGljaCBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhCisgICAgIyBzdWJjbGFzcyB0byBhZGQgY3VzdG9tIF9wcm9jXyooKSBtZXRob2RzLiBBIF9wcm9jXyooKSBtZXRob2QgTVVTVAorICAgICMgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcKKyAgICAjIG9wZXJhdGlvbnM6CisgICAgIyAxLiBTZXQgc2VsZi5vZmZzZXRfZGF0YSB0byB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIGRhdGEgYmxvY2tzIGJlZ2luLAorICAgICMgICAgaWYgdGhlcmUgaXMgZGF0YSB0aGF0IGZvbGxvd3MuCisgICAgIyAyLiBTZXQgdGFyZmlsZS5vZmZzZXQgdG8gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBuZXh0IG1lbWJlcidzIGhlYWRlciB3aWxsCisgICAgIyAgICBiZWdpbi4KKyAgICAjIDMuIFJldHVybiBzZWxmIG9yIGFub3RoZXIgdmFsaWQgVGFySW5mbyBvYmplY3QuCisgICAgZGVmIF9wcm9jX21lbWJlcihzZWxmLCB0YXJmaWxlKToKKyAgICAgICAgIiIiQ2hvb3NlIHRoZSByaWdodCBwcm9jZXNzaW5nIG1ldGhvZCBkZXBlbmRpbmcgb24KKyAgICAgICAgICAgdGhlIHR5cGUgYW5kIGNhbGwgaXQuCiAgICAgICAgICIiIgotICAgICAgICBuYW1lICs9IE5VTAorICAgICAgICBpZiBzZWxmLnR5cGUgaW4gKEdOVVRZUEVfTE9OR05BTUUsIEdOVVRZUEVfTE9OR0xJTkspOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Byb2NfZ251bG9uZyh0YXJmaWxlKQorICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBHTlVUWVBFX1NQQVJTRToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9wcm9jX3NwYXJzZSh0YXJmaWxlKQorICAgICAgICBlbGlmIHNlbGYudHlwZSBpbiAoWEhEVFlQRSwgWEdMVFlQRSwgU09MQVJJU19YSERUWVBFKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9wcm9jX3BheCh0YXJmaWxlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Byb2NfYnVpbHRpbih0YXJmaWxlKQogCi0gICAgICAgIHRhcmluZm8gPSBzZWxmLl9fY2xhc3NfXygpCi0gICAgICAgIHRhcmluZm8ubmFtZSA9ICIuLy4vQExvbmdMaW5rIgotICAgICAgICB0YXJpbmZvLnR5cGUgPSB0eXBlCi0gICAgICAgIHRhcmluZm8ubW9kZSA9IDAKLSAgICAgICAgdGFyaW5mby5zaXplID0gbGVuKG5hbWUpCisgICAgZGVmIF9wcm9jX2J1aWx0aW4oc2VsZiwgdGFyZmlsZSk6CisgICAgICAgICIiIlByb2Nlc3MgYSBidWlsdGluIHR5cGUgb3IgYW4gdW5rbm93biB0eXBlIHdoaWNoCisgICAgICAgICAgIHdpbGwgYmUgdHJlYXRlZCBhcyBhIHJlZ3VsYXIgZmlsZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYub2Zmc2V0X2RhdGEgPSB0YXJmaWxlLmZpbGVvYmoudGVsbCgpCisgICAgICAgIG9mZnNldCA9IHNlbGYub2Zmc2V0X2RhdGEKKyAgICAgICAgaWYgc2VsZi5pc3JlZygpIG9yIHNlbGYudHlwZSBub3QgaW4gU1VQUE9SVEVEX1RZUEVTOgorICAgICAgICAgICAgIyBTa2lwIHRoZSBmb2xsb3dpbmcgZGF0YSBibG9ja3MuCisgICAgICAgICAgICBvZmZzZXQgKz0gc2VsZi5fYmxvY2soc2VsZi5zaXplKQorICAgICAgICB0YXJmaWxlLm9mZnNldCA9IG9mZnNldAogCi0gICAgICAgICMgY3JlYXRlIGV4dGVuZGVkIGhlYWRlcgotICAgICAgICBidWYgPSB0YXJpbmZvLnRvYnVmKCkKLSAgICAgICAgIyBjcmVhdGUgbmFtZSBibG9ja3MKLSAgICAgICAgYnVmICs9IG5hbWUKLSAgICAgICAgYmxvY2tzLCByZW1haW5kZXIgPSBkaXZtb2QobGVuKG5hbWUpLCBCTE9DS1NJWkUpCi0gICAgICAgIGlmIHJlbWFpbmRlciA+IDA6Ci0gICAgICAgICAgICBidWYgKz0gKEJMT0NLU0laRSAtIHJlbWFpbmRlcikgKiBOVUwKLSAgICAgICAgcmV0dXJuIGJ1ZgorICAgICAgICAjIFBhdGNoIHRoZSBUYXJJbmZvIG9iamVjdCB3aXRoIHNhdmVkIGV4dGVuZGVkCisgICAgICAgICMgaGVhZGVyIGluZm9ybWF0aW9uLgorICAgICAgICBmb3Iga2V5d29yZCwgdmFsdWUgaW4gdGFyZmlsZS5wYXhfaGVhZGVycy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGtleXdvcmQgaW4gUEFYX0ZJRUxEUzoKKyAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGtleXdvcmQsIHZhbHVlKQorICAgICAgICAgICAgc2VsZi5wYXhfaGVhZGVyc1trZXl3b3JkXSA9IHZhbHVlCisKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfcHJvY19nbnVsb25nKHNlbGYsIHRhcmZpbGUpOgorICAgICAgICAiIiJQcm9jZXNzIHRoZSBibG9ja3MgdGhhdCBob2xkIGEgR05VIGxvbmduYW1lCisgICAgICAgICAgIG9yIGxvbmdsaW5rIG1lbWJlci4KKyAgICAgICAgIiIiCisgICAgICAgIGJ1ZiA9IHRhcmZpbGUuZmlsZW9iai5yZWFkKHNlbGYuX2Jsb2NrKHNlbGYuc2l6ZSkpCisKKyAgICAgICAgIyBGZXRjaCB0aGUgbmV4dCBoZWFkZXIgYW5kIHByb2Nlc3MgaXQuCisgICAgICAgIGIgPSB0YXJmaWxlLmZpbGVvYmoucmVhZChCTE9DS1NJWkUpCisgICAgICAgIHQgPSBzZWxmLmZyb21idWYoYikKKyAgICAgICAgdC5vZmZzZXQgPSBzZWxmLm9mZnNldAorICAgICAgICBuZXh0ID0gdC5fcHJvY19tZW1iZXIodGFyZmlsZSkKKworICAgICAgICAjIFBhdGNoIHRoZSBUYXJJbmZvIG9iamVjdCBmcm9tIHRoZSBuZXh0IGhlYWRlciB3aXRoCisgICAgICAgICMgdGhlIGxvbmduYW1lIGluZm9ybWF0aW9uLgorICAgICAgICBuZXh0Lm9mZnNldCA9IHNlbGYub2Zmc2V0CisgICAgICAgIGlmIHNlbGYudHlwZSA9PSBHTlVUWVBFX0xPTkdOQU1FOgorICAgICAgICAgICAgbmV4dC5uYW1lID0gYnVmLnJzdHJpcChOVUwpCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IEdOVVRZUEVfTE9OR0xJTks6CisgICAgICAgICAgICBuZXh0LmxpbmtuYW1lID0gYnVmLnJzdHJpcChOVUwpCisKKyAgICAgICAgcmV0dXJuIG5leHQKKworICAgIGRlZiBfcHJvY19zcGFyc2Uoc2VsZiwgdGFyZmlsZSk6CisgICAgICAgICIiIlByb2Nlc3MgYSBHTlUgc3BhcnNlIGhlYWRlciBwbHVzIGV4dHJhIGhlYWRlcnMuCisgICAgICAgICIiIgorICAgICAgICBidWYgPSBzZWxmLmJ1ZgorICAgICAgICBzcCA9IF9yaW5nYnVmZmVyKCkKKyAgICAgICAgcG9zID0gMzg2CisgICAgICAgIGxhc3Rwb3MgPSAwTAorICAgICAgICByZWFscG9zID0gMEwKKyAgICAgICAgIyBUaGVyZSBhcmUgNCBwb3NzaWJsZSBzcGFyc2Ugc3RydWN0cyBpbiB0aGUKKyAgICAgICAgIyBmaXJzdCBoZWFkZXIuCisgICAgICAgIGZvciBpIGluIHhyYW5nZSg0KToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBudGkoYnVmW3Bvczpwb3MgKyAxMl0pCisgICAgICAgICAgICAgICAgbnVtYnl0ZXMgPSBudGkoYnVmW3BvcyArIDEyOnBvcyArIDI0XSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBvZmZzZXQgPiBsYXN0cG9zOgorICAgICAgICAgICAgICAgIHNwLmFwcGVuZChfaG9sZShsYXN0cG9zLCBvZmZzZXQgLSBsYXN0cG9zKSkKKyAgICAgICAgICAgIHNwLmFwcGVuZChfZGF0YShvZmZzZXQsIG51bWJ5dGVzLCByZWFscG9zKSkKKyAgICAgICAgICAgIHJlYWxwb3MgKz0gbnVtYnl0ZXMKKyAgICAgICAgICAgIGxhc3Rwb3MgPSBvZmZzZXQgKyBudW1ieXRlcworICAgICAgICAgICAgcG9zICs9IDI0CisKKyAgICAgICAgaXNleHRlbmRlZCA9IG9yZChidWZbNDgyXSkKKyAgICAgICAgb3JpZ3NpemUgPSBudGkoYnVmWzQ4Mzo0OTVdKQorCisgICAgICAgICMgSWYgdGhlIGlzZXh0ZW5kZWQgZmxhZyBpcyBnaXZlbiwKKyAgICAgICAgIyB0aGVyZSBhcmUgZXh0cmEgaGVhZGVycyB0byBwcm9jZXNzLgorICAgICAgICB3aGlsZSBpc2V4dGVuZGVkID09IDE6CisgICAgICAgICAgICBidWYgPSB0YXJmaWxlLmZpbGVvYmoucmVhZChCTE9DS1NJWkUpCisgICAgICAgICAgICBwb3MgPSAwCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMjEpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbnRpKGJ1Zltwb3M6cG9zICsgMTJdKQorICAgICAgICAgICAgICAgICAgICBudW1ieXRlcyA9IG50aShidWZbcG9zICsgMTI6cG9zICsgMjRdKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGlmIG9mZnNldCA+IGxhc3Rwb3M6CisgICAgICAgICAgICAgICAgICAgIHNwLmFwcGVuZChfaG9sZShsYXN0cG9zLCBvZmZzZXQgLSBsYXN0cG9zKSkKKyAgICAgICAgICAgICAgICBzcC5hcHBlbmQoX2RhdGEob2Zmc2V0LCBudW1ieXRlcywgcmVhbHBvcykpCisgICAgICAgICAgICAgICAgcmVhbHBvcyArPSBudW1ieXRlcworICAgICAgICAgICAgICAgIGxhc3Rwb3MgPSBvZmZzZXQgKyBudW1ieXRlcworICAgICAgICAgICAgICAgIHBvcyArPSAyNAorICAgICAgICAgICAgaXNleHRlbmRlZCA9IG9yZChidWZbNTA0XSkKKworICAgICAgICBpZiBsYXN0cG9zIDwgb3JpZ3NpemU6CisgICAgICAgICAgICBzcC5hcHBlbmQoX2hvbGUobGFzdHBvcywgb3JpZ3NpemUgLSBsYXN0cG9zKSkKKworICAgICAgICBzZWxmLnNwYXJzZSA9IHNwCisKKyAgICAgICAgc2VsZi5vZmZzZXRfZGF0YSA9IHRhcmZpbGUuZmlsZW9iai50ZWxsKCkKKyAgICAgICAgdGFyZmlsZS5vZmZzZXQgPSBzZWxmLm9mZnNldF9kYXRhICsgc2VsZi5fYmxvY2soc2VsZi5zaXplKQorICAgICAgICBzZWxmLnNpemUgPSBvcmlnc2l6ZQorCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX3Byb2NfcGF4KHNlbGYsIHRhcmZpbGUpOgorICAgICAgICAiIiJQcm9jZXNzIGFuIGV4dGVuZGVkIG9yIGdsb2JhbCBoZWFkZXIgYXMgZGVzY3JpYmVkIGluCisgICAgICAgICAgIFBPU0lYLjEtMjAwMS4KKyAgICAgICAgIiIiCisgICAgICAgICMgUmVhZCB0aGUgaGVhZGVyIGluZm9ybWF0aW9uLgorICAgICAgICBidWYgPSB0YXJmaWxlLmZpbGVvYmoucmVhZChzZWxmLl9ibG9jayhzZWxmLnNpemUpKQorCisgICAgICAgICMgQSBwYXggaGVhZGVyIHN0b3JlcyBzdXBwbGVtZW50YWwgaW5mb3JtYXRpb24gZm9yIGVpdGhlcgorICAgICAgICAjIHRoZSBmb2xsb3dpbmcgZmlsZSAoZXh0ZW5kZWQpIG9yIGFsbCBmb2xsb3dpbmcgZmlsZXMKKyAgICAgICAgIyAoZ2xvYmFsKS4KKyAgICAgICAgaWYgc2VsZi50eXBlID09IFhHTFRZUEU6CisgICAgICAgICAgICBwYXhfaGVhZGVycyA9IHRhcmZpbGUucGF4X2hlYWRlcnMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBheF9oZWFkZXJzID0gdGFyZmlsZS5wYXhfaGVhZGVycy5jb3B5KCkKKworICAgICAgICAjIEZpZWxkcyBpbiBQT1NJWC4xLTIwMDEgdGhhdCBhcmUgbnVtYmVycywgYWxsIG90aGVyIGZpZWxkcworICAgICAgICAjIGFyZSB0cmVhdGVkIGFzIFVURi04IHN0cmluZ3MuCisgICAgICAgIHR5cGVfbWFwcGluZyA9IHsKKyAgICAgICAgICAgICJhdGltZSI6ICAgICAgICBmbG9hdCwKKyAgICAgICAgICAgICJjdGltZSI6ICAgICAgICBmbG9hdCwKKyAgICAgICAgICAgICJtdGltZSI6ICAgICAgICBmbG9hdCwKKyAgICAgICAgICAgICJ1aWQiOiAgICAgICAgICBpbnQsCisgICAgICAgICAgICAiZ2lkIjogICAgICAgICAgaW50LAorICAgICAgICAgICAgInNpemUiOiAgICAgICAgIGludAorICAgICAgICB9CisKKyAgICAgICAgIyBQYXJzZSBwYXggaGVhZGVyIGluZm9ybWF0aW9uLiBBIHJlY29yZCBsb29rcyBsaWtlIHRoYXQ6CisgICAgICAgICMgIiVkICVzPSVzXG4iICUgKGxlbmd0aCwga2V5d29yZCwgdmFsdWUpLiBsZW5ndGggaXMgdGhlIHNpemUKKyAgICAgICAgIyBvZiB0aGUgY29tcGxldGUgcmVjb3JkIGluY2x1ZGluZyB0aGUgbGVuZ3RoIGZpZWxkIGl0c2VsZiBhbmQKKyAgICAgICAgIyB0aGUgbmV3bGluZS4KKyAgICAgICAgcmVnZXggPSByZS5jb21waWxlKHIiKFxkKykgKFtePV0rKT0iLCByZS5VKQorICAgICAgICBwb3MgPSAwCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBtYXRjaCA9IHJlZ2V4Lm1hdGNoKGJ1ZiwgcG9zKQorICAgICAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIGxlbmd0aCwga2V5d29yZCA9IG1hdGNoLmdyb3VwcygpCisgICAgICAgICAgICBsZW5ndGggPSBpbnQobGVuZ3RoKQorICAgICAgICAgICAgdmFsdWUgPSBidWZbbWF0Y2guZW5kKDIpICsgMTptYXRjaC5zdGFydCgxKSArIGxlbmd0aCAtIDFdCisKKyAgICAgICAgICAgIGtleXdvcmQgPSBrZXl3b3JkLmRlY29kZSgidXRmOCIpCisgICAgICAgICAgICBrZXl3b3JkID0ga2V5d29yZC5lbmNvZGUodGFyZmlsZS5lbmNvZGluZykKKworICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5kZWNvZGUoInV0ZjgiKQorICAgICAgICAgICAgaWYga2V5d29yZCBpbiB0eXBlX21hcHBpbmc6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHR5cGVfbWFwcGluZ1trZXl3b3JkXSh2YWx1ZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuZW5jb2RlKHRhcmZpbGUuZW5jb2RpbmcpCisKKyAgICAgICAgICAgIHBheF9oZWFkZXJzW2tleXdvcmRdID0gdmFsdWUKKyAgICAgICAgICAgIHBvcyArPSBsZW5ndGgKKworICAgICAgICAjIEZldGNoIHRoZSBuZXh0IGhlYWRlciB0aGF0IHdpbGwgYmUgcGF0Y2hlZCB3aXRoIHRoZQorICAgICAgICAjIHN1cHBsZW1lbnQgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGF4IGhlYWRlciAoZXh0ZW5kZWQKKyAgICAgICAgIyBvbmx5KS4KKyAgICAgICAgdCA9IHNlbGYuZnJvbXRhcmZpbGUodGFyZmlsZSkKKworICAgICAgICBpZiBzZWxmLnR5cGUgIT0gWEdMVFlQRSBhbmQgdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgUGF0Y2ggdGhlIFRhckluZm8gb2JqZWN0IGZyb20gdGhlIG5leHQgaGVhZGVyIHdpdGgKKyAgICAgICAgICAgICMgdGhlIHBheCBoZWFkZXIncyBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgIGZvciBrZXl3b3JkLCB2YWx1ZSBpbiBwYXhfaGVhZGVycy5pdGVtcygpOgorICAgICAgICAgICAgICAgIGlmIGtleXdvcmQgaW4gUEFYX0ZJRUxEUzoKKyAgICAgICAgICAgICAgICAgICAgc2V0YXR0cih0LCBrZXl3b3JkLCB2YWx1ZSkKKyAgICAgICAgICAgICAgICBwYXhfaGVhZGVyc1trZXl3b3JkXSA9IHZhbHVlCisgICAgICAgICAgICB0LnBheF9oZWFkZXJzID0gcGF4X2hlYWRlcnMuY29weSgpCisKKyAgICAgICAgcmV0dXJuIHQKKworICAgIGRlZiBfYmxvY2soc2VsZiwgY291bnQpOgorICAgICAgICAiIiJSb3VuZCB1cCBhIGJ5dGUgY291bnQgYnkgQkxPQ0tTSVpFIGFuZCByZXR1cm4gaXQsCisgICAgICAgICAgIGUuZy4gX2Jsb2NrKDgzNCkgPT4gMTAyNC4KKyAgICAgICAgIiIiCisgICAgICAgIGJsb2NrcywgcmVtYWluZGVyID0gZGl2bW9kKGNvdW50LCBCTE9DS1NJWkUpCisgICAgICAgIGlmIHJlbWFpbmRlcjoKKyAgICAgICAgICAgIGJsb2NrcyArPSAxCisgICAgICAgIHJldHVybiBibG9ja3MgKiBCTE9DS1NJWkUKIAogICAgIGRlZiBpc3JlZyhzZWxmKToKICAgICAgICAgcmV0dXJuIHNlbGYudHlwZSBpbiBSRUdVTEFSX1RZUEVTCkBAIC0xMDM4LDEyICsxNDYwLDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbWVzc2FnZXMgKGlmIGRlYnVnID49IDApLiBJZiA+IDAsIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFyZSBwYXNzZWQgdG8gdGhlIGNhbGxlciBhcyBleGNlcHRpb25zLgogCi0gICAgcG9zaXggPSBGYWxzZSAgICAgICAgICAgICAgICMgSWYgVHJ1ZSwgZ2VuZXJhdGVzIFBPU0lYLjEtMTk5MC1jb21wbGlhbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmNoaXZlcyAobm8gR05VIGV4dGVuc2lvbnMhKQorICAgIGZvcm1hdCA9IERFRkFVTFRfRk9STUFUICAgICAjIFRoZSBmb3JtYXQgdG8gdXNlIHdoZW4gY3JlYXRpbmcgYW4gYXJjaGl2ZS4KIAotICAgIGZpbGVvYmplY3QgPSBFeEZpbGVPYmplY3QKKyAgICBlbmNvZGluZyA9IEVOQ09ESU5HICAgICAgICAgIyBUcmFuc2ZlciBVVEYtOCBzdHJpbmdzIGZyb20gUE9TSVguMS0yMDAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaGVhZGVycyB0byB0aGlzIGVuY29kaW5nLgogCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWU9Tm9uZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSk6CisgICAgdGFyaW5mbyA9IFRhckluZm8gICAgICAgICAgICMgVGhlIGRlZmF1bHQgVGFySW5mbyBjbGFzcyB0byB1c2UuCisKKyAgICBmaWxlb2JqZWN0ID0gRXhGaWxlT2JqZWN0ICAgIyBUaGUgZGVmYXVsdCBFeEZpbGVPYmplY3QgY2xhc3MgdG8gdXNlLgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWU9Tm9uZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSwgZm9ybWF0PU5vbmUsCisgICAgICAgICAgICB0YXJpbmZvPU5vbmUsIGRlcmVmZXJlbmNlPU5vbmUsIGlnbm9yZV96ZXJvcz1Ob25lLCBlbmNvZGluZz1Ob25lLAorICAgICAgICAgICAgcGF4X2hlYWRlcnM9Tm9uZSwgZGVidWc9Tm9uZSwgZXJyb3JsZXZlbD1Ob25lKToKICAgICAgICAgIiIiT3BlbiBhbiAodW5jb21wcmVzc2VkKSB0YXIgYXJjaGl2ZSBgbmFtZScuIGBtb2RlJyBpcyBlaXRoZXIgJ3InIHRvCiAgICAgICAgICAgIHJlYWQgZnJvbSBhbiBleGlzdGluZyBhcmNoaXZlLCAnYScgdG8gYXBwZW5kIGRhdGEgdG8gYW4gZXhpc3RpbmcKICAgICAgICAgICAgZmlsZSBvciAndycgdG8gY3JlYXRlIGEgbmV3IGZpbGUgb3ZlcndyaXRpbmcgYW4gZXhpc3Rpbmcgb25lLiBgbW9kZScKQEAgLTEwNTIsNTggKzE0ODAsODYgQEAKICAgICAgICAgICAgY2FuIGJlIGRldGVybWluZWQsIGBtb2RlJyBpcyBvdmVycmlkZGVuIGJ5IGBmaWxlb2JqJ3MgbW9kZS4KICAgICAgICAgICAgYGZpbGVvYmonIGlzIG5vdCBjbG9zZWQsIHdoZW4gVGFyRmlsZSBpcyBjbG9zZWQuCiAgICAgICAgICIiIgotICAgICAgICBzZWxmLm5hbWUgPSBvcy5wYXRoLmFic3BhdGgobmFtZSkKLQogICAgICAgICBpZiBsZW4obW9kZSkgPiAxIG9yIG1vZGUgbm90IGluICJyYXciOgogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kZSBtdXN0IGJlICdyJywgJ2EnIG9yICd3JyIpCi0gICAgICAgIHNlbGYuX21vZGUgPSBtb2RlCi0gICAgICAgIHNlbGYubW9kZSA9IHsiciI6ICJyYiIsICJhIjogInIrYiIsICJ3IjogIndiIn1bbW9kZV0KKyAgICAgICAgc2VsZi5tb2RlID0gbW9kZQorICAgICAgICBzZWxmLl9tb2RlID0geyJyIjogInJiIiwgImEiOiAicitiIiwgInciOiAid2IifVttb2RlXQogCiAgICAgICAgIGlmIG5vdCBmaWxlb2JqOgotICAgICAgICAgICAgaWYgc2VsZi5fbW9kZSA9PSAiYSIgYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLm5hbWUpOgorICAgICAgICAgICAgaWYgc2VsZi5tb2RlID09ICJhIiBhbmQgbm90IG9zLnBhdGguZXhpc3RzKG5hbWUpOgogICAgICAgICAgICAgICAgICMgQ3JlYXRlIG5vbmV4aXN0ZW50IGZpbGVzIGluIGFwcGVuZCBtb2RlLgotICAgICAgICAgICAgICAgIHNlbGYuX21vZGUgPSAidyIKLSAgICAgICAgICAgICAgICBzZWxmLm1vZGUgPSAid2IiCi0gICAgICAgICAgICBmaWxlb2JqID0gZmlsZShzZWxmLm5hbWUsIHNlbGYubW9kZSkKKyAgICAgICAgICAgICAgICBzZWxmLm1vZGUgPSAidyIKKyAgICAgICAgICAgICAgICBzZWxmLl9tb2RlID0gIndiIgorICAgICAgICAgICAgZmlsZW9iaiA9IGZpbGUobmFtZSwgc2VsZi5fbW9kZSkKICAgICAgICAgICAgIHNlbGYuX2V4dGZpbGVvYmogPSBGYWxzZQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgaWYgc2VsZi5uYW1lIGlzIE5vbmUgYW5kIGhhc2F0dHIoZmlsZW9iaiwgIm5hbWUiKToKLSAgICAgICAgICAgICAgICBzZWxmLm5hbWUgPSBvcy5wYXRoLmFic3BhdGgoZmlsZW9iai5uYW1lKQorICAgICAgICAgICAgaWYgbmFtZSBpcyBOb25lIGFuZCBoYXNhdHRyKGZpbGVvYmosICJuYW1lIik6CisgICAgICAgICAgICAgICAgbmFtZSA9IGZpbGVvYmoubmFtZQogICAgICAgICAgICAgaWYgaGFzYXR0cihmaWxlb2JqLCAibW9kZSIpOgotICAgICAgICAgICAgICAgIHNlbGYubW9kZSA9IGZpbGVvYmoubW9kZQorICAgICAgICAgICAgICAgIHNlbGYuX21vZGUgPSBmaWxlb2JqLm1vZGUKICAgICAgICAgICAgIHNlbGYuX2V4dGZpbGVvYmogPSBUcnVlCisgICAgICAgIHNlbGYubmFtZSA9IG9zLnBhdGguYWJzcGF0aChuYW1lKQogICAgICAgICBzZWxmLmZpbGVvYmogPSBmaWxlb2JqCiAKLSAgICAgICAgIyBJbml0IGRhdGFzdHJ1Y3R1cmVzCisgICAgICAgICMgSW5pdCBhdHRyaWJ1dGVzLgorICAgICAgICBpZiBmb3JtYXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmZvcm1hdCA9IGZvcm1hdAorICAgICAgICBpZiB0YXJpbmZvIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi50YXJpbmZvID0gdGFyaW5mbworICAgICAgICBpZiBkZXJlZmVyZW5jZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZGVyZWZlcmVuY2UgPSBkZXJlZmVyZW5jZQorICAgICAgICBpZiBpZ25vcmVfemVyb3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmlnbm9yZV96ZXJvcyA9IGlnbm9yZV96ZXJvcworICAgICAgICBpZiBlbmNvZGluZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZW5jb2RpbmcgPSBlbmNvZGluZworICAgICAgICBpZiBkZWJ1ZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZGVidWcgPSBkZWJ1ZworICAgICAgICBpZiBlcnJvcmxldmVsIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5lcnJvcmxldmVsID0gZXJyb3JsZXZlbAorCisgICAgICAgICMgSW5pdCBkYXRhc3RydWN0dXJlcy4KICAgICAgICAgc2VsZi5jbG9zZWQgPSBGYWxzZQogICAgICAgICBzZWxmLm1lbWJlcnMgPSBbXSAgICAgICAjIGxpc3Qgb2YgbWVtYmVycyBhcyBUYXJJbmZvIG9iamVjdHMKICAgICAgICAgc2VsZi5fbG9hZGVkID0gRmFsc2UgICAgIyBmbGFnIGlmIGFsbCBtZW1iZXJzIGhhdmUgYmVlbiByZWFkCiAgICAgICAgIHNlbGYub2Zmc2V0ID0gMEwgICAgICAgICMgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgYXJjaGl2ZSBmaWxlCiAgICAgICAgIHNlbGYuaW5vZGVzID0ge30gICAgICAgICMgZGljdGlvbmFyeSBjYWNoaW5nIHRoZSBpbm9kZXMgb2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmNoaXZlIG1lbWJlcnMgYWxyZWFkeSBhZGRlZAorICAgICAgICBzZWxmLnBheF9oZWFkZXJzID0ge30gICAjIHNhdmUgY29udGVudHMgb2YgZ2xvYmFsIHBheCBoZWFkZXJzCiAKLSAgICAgICAgaWYgc2VsZi5fbW9kZSA9PSAiciI6CisgICAgICAgIGlmIHNlbGYubW9kZSA9PSAiciI6CiAgICAgICAgICAgICBzZWxmLmZpcnN0bWVtYmVyID0gTm9uZQogICAgICAgICAgICAgc2VsZi5maXJzdG1lbWJlciA9IHNlbGYubmV4dCgpCiAKLSAgICAgICAgaWYgc2VsZi5fbW9kZSA9PSAiYSI6CisgICAgICAgIGlmIHNlbGYubW9kZSA9PSAiYSI6CiAgICAgICAgICAgICAjIE1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgYXJjaGl2ZSwKICAgICAgICAgICAgICMgYmVmb3JlIHRoZSBmaXJzdCBlbXB0eSBibG9jay4KICAgICAgICAgICAgIHNlbGYuZmlyc3RtZW1iZXIgPSBOb25lCiAgICAgICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYubmV4dCgpCi0gICAgICAgICAgICAgICAgZXhjZXB0IFJlYWRFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLnNlZWsoMCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICBpZiB0YXJpbmZvIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5uZXh0KCkgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5vZmZzZXQgPiAwOgogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLnNlZWsoLSBCTE9DS1NJWkUsIDEpCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAKLSAgICAgICAgaWYgc2VsZi5fbW9kZSBpbiAiYXciOgorICAgICAgICBpZiBzZWxmLm1vZGUgaW4gImF3IjoKICAgICAgICAgICAgIHNlbGYuX2xvYWRlZCA9IFRydWUKIAorICAgICAgICAgICAgaWYgcGF4X2hlYWRlcnM6CisgICAgICAgICAgICAgICAgYnVmID0gc2VsZi50YXJpbmZvLmNyZWF0ZV9wYXhfZ2xvYmFsX2hlYWRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIHBheF9oZWFkZXJzLmNvcHkoKSwgc2VsZi5lbmNvZGluZykKKyAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoYnVmKQorICAgICAgICAgICAgICAgIHNlbGYub2Zmc2V0ICs9IGxlbihidWYpCisKKyAgICBkZWYgX2dldHBvc2l4KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5mb3JtYXQgPT0gVVNUQVJfRk9STUFUCisgICAgZGVmIF9zZXRwb3NpeChzZWxmLCB2YWx1ZSk6CisgICAgICAgIGltcG9ydCB3YXJuaW5ncworICAgICAgICB3YXJuaW5ncy53YXJuKCJ1c2UgdGhlIGZvcm1hdCBhdHRyaWJ1dGUgaW5zdGVhZCIsIERlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgaWYgdmFsdWU6CisgICAgICAgICAgICBzZWxmLmZvcm1hdCA9IFVTVEFSX0ZPUk1BVAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mb3JtYXQgPSBHTlVfRk9STUFUCisgICAgcG9zaXggPSBwcm9wZXJ0eShfZ2V0cG9zaXgsIF9zZXRwb3NpeCkKKwogICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICMgQmVsb3cgYXJlIHRoZSBjbGFzc21ldGhvZHMgd2hpY2ggYWN0IGFzIGFsdGVybmF0ZSBjb25zdHJ1Y3RvcnMgdG8gdGhlCiAgICAgIyBUYXJGaWxlIGNsYXNzLiBUaGUgb3BlbigpIG1ldGhvZCBpcyB0aGUgb25seSBvbmUgdGhhdCBpcyBuZWVkZWQgZm9yCkBAIC0xMTE2LDcgKzE1NzIsNyBAQAogICAgICMgYnkgYWRkaW5nIGl0IHRvIHRoZSBtYXBwaW5nIGluIE9QRU5fTUVUSC4KIAogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBvcGVuKGNscywgbmFtZT1Ob25lLCBtb2RlPSJyIiwgZmlsZW9iaj1Ob25lLCBidWZzaXplPTIwKjUxMik6CisgICAgZGVmIG9wZW4oY2xzLCBuYW1lPU5vbmUsIG1vZGU9InIiLCBmaWxlb2JqPU5vbmUsIGJ1ZnNpemU9UkVDT1JEU0laRSwgKiprd2FyZ3MpOgogICAgICAgICAiIiJPcGVuIGEgdGFyIGFyY2hpdmUgZm9yIHJlYWRpbmcsIHdyaXRpbmcgb3IgYXBwZW5kaW5nLiBSZXR1cm4KICAgICAgICAgICAgYW4gYXBwcm9wcmlhdGUgVGFyRmlsZSBjbGFzcy4KIApAQCAtMTE0OSw4ICsxNjA1LDggQEAKICAgICAgICAgICAgICAgICBpZiBmaWxlb2JqIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICBzYXZlZF9wb3MgPSBmaWxlb2JqLnRlbGwoKQogICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMobmFtZSwgInIiLCBmaWxlb2JqKQotICAgICAgICAgICAgICAgIGV4Y2VwdCAoUmVhZEVycm9yLCBDb21wcmVzc2lvbkVycm9yKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMobmFtZSwgInIiLCBmaWxlb2JqLCAqKmt3YXJncykKKyAgICAgICAgICAgICAgICBleGNlcHQgKFJlYWRFcnJvciwgQ29tcHJlc3Npb25FcnJvciksIGU6CiAgICAgICAgICAgICAgICAgICAgIGlmIGZpbGVvYmogaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlb2JqLnNlZWsoc2F2ZWRfcG9zKQogICAgICAgICAgICAgICAgICAgICBjb250aW51ZQpAQCAtMTE2Nyw3ICsxNjIzLDcgQEAKICAgICAgICAgICAgICAgICBmdW5jID0gZ2V0YXR0cihjbHMsIGNscy5PUEVOX01FVEhbY29tcHR5cGVdKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yKCJ1bmtub3duIGNvbXByZXNzaW9uIHR5cGUgJXIiICUgY29tcHR5cGUpCi0gICAgICAgICAgICByZXR1cm4gZnVuYyhuYW1lLCBmaWxlbW9kZSwgZmlsZW9iaikKKyAgICAgICAgICAgIHJldHVybiBmdW5jKG5hbWUsIGZpbGVtb2RlLCBmaWxlb2JqLCAqKmt3YXJncykKIAogICAgICAgICBlbGlmICJ8IiBpbiBtb2RlOgogICAgICAgICAgICAgZmlsZW1vZGUsIGNvbXB0eXBlID0gbW9kZS5zcGxpdCgifCIsIDEpCkBAIC0xMTc4LDI1ICsxNjM0LDI2IEBACiAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kZSBtdXN0IGJlICdyJyBvciAndyciKQogCiAgICAgICAgICAgICB0ID0gY2xzKG5hbWUsIGZpbGVtb2RlLAotICAgICAgICAgICAgICAgICAgICBfU3RyZWFtKG5hbWUsIGZpbGVtb2RlLCBjb21wdHlwZSwgZmlsZW9iaiwgYnVmc2l6ZSkpCisgICAgICAgICAgICAgICAgICAgIF9TdHJlYW0obmFtZSwgZmlsZW1vZGUsIGNvbXB0eXBlLCBmaWxlb2JqLCBidWZzaXplKSwKKyAgICAgICAgICAgICAgICAgICAgKiprd2FyZ3MpCiAgICAgICAgICAgICB0Ll9leHRmaWxlb2JqID0gRmFsc2UKICAgICAgICAgICAgIHJldHVybiB0CiAKICAgICAgICAgZWxpZiBtb2RlIGluICJhdyI6Ci0gICAgICAgICAgICByZXR1cm4gY2xzLnRhcm9wZW4obmFtZSwgbW9kZSwgZmlsZW9iaikKKyAgICAgICAgICAgIHJldHVybiBjbHMudGFyb3BlbihuYW1lLCBtb2RlLCBmaWxlb2JqLCAqKmt3YXJncykKIAogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmRpc2Nlcm5pYmxlIG1vZGUiKQogCiAgICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIHRhcm9wZW4oY2xzLCBuYW1lLCBtb2RlPSJyIiwgZmlsZW9iaj1Ob25lKToKKyAgICBkZWYgdGFyb3BlbihjbHMsIG5hbWUsIG1vZGU9InIiLCBmaWxlb2JqPU5vbmUsICoqa3dhcmdzKToKICAgICAgICAgIiIiT3BlbiB1bmNvbXByZXNzZWQgdGFyIGFyY2hpdmUgbmFtZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLgogICAgICAgICAiIiIKICAgICAgICAgaWYgbGVuKG1vZGUpID4gMSBvciBtb2RlIG5vdCBpbiAicmF3IjoKICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1vZGUgbXVzdCBiZSAncicsICdhJyBvciAndyciKQotICAgICAgICByZXR1cm4gY2xzKG5hbWUsIG1vZGUsIGZpbGVvYmopCisgICAgICAgIHJldHVybiBjbHMobmFtZSwgbW9kZSwgZmlsZW9iaiwgKiprd2FyZ3MpCiAKICAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZ3pvcGVuKGNscywgbmFtZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSwgY29tcHJlc3NsZXZlbD05KToKKyAgICBkZWYgZ3pvcGVuKGNscywgbmFtZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSwgY29tcHJlc3NsZXZlbD05LCAqKmt3YXJncyk6CiAgICAgICAgICIiIk9wZW4gZ3ppcCBjb21wcmVzc2VkIHRhciBhcmNoaXZlIG5hbWUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4KICAgICAgICAgICAgQXBwZW5kaW5nIGlzIG5vdCBhbGxvd2VkLgogICAgICAgICAiIiIKQEAgLTEyMTQsMTQgKzE2NzEsMTUgQEAKIAogICAgICAgICB0cnk6CiAgICAgICAgICAgICB0ID0gY2xzLnRhcm9wZW4obmFtZSwgbW9kZSwKLSAgICAgICAgICAgICAgICBnemlwLkd6aXBGaWxlKG5hbWUsIG1vZGUsIGNvbXByZXNzbGV2ZWwsIGZpbGVvYmopKQorICAgICAgICAgICAgICAgIGd6aXAuR3ppcEZpbGUobmFtZSwgbW9kZSwgY29tcHJlc3NsZXZlbCwgZmlsZW9iaiksCisgICAgICAgICAgICAgICAgKiprd2FyZ3MpCiAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJub3QgYSBnemlwIGZpbGUiKQogICAgICAgICB0Ll9leHRmaWxlb2JqID0gRmFsc2UKICAgICAgICAgcmV0dXJuIHQKIAogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBiejJvcGVuKGNscywgbmFtZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSwgY29tcHJlc3NsZXZlbD05KToKKyAgICBkZWYgYnoyb3BlbihjbHMsIG5hbWUsIG1vZGU9InIiLCBmaWxlb2JqPU5vbmUsIGNvbXByZXNzbGV2ZWw9OSwgKiprd2FyZ3MpOgogICAgICAgICAiIiJPcGVuIGJ6aXAyIGNvbXByZXNzZWQgdGFyIGFyY2hpdmUgbmFtZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLgogICAgICAgICAgICBBcHBlbmRpbmcgaXMgbm90IGFsbG93ZWQuCiAgICAgICAgICIiIgpAQCAtMTIzOSw3ICsxNjk3LDcgQEAKICAgICAgICAgICAgIGZpbGVvYmogPSBiejIuQloyRmlsZShuYW1lLCBtb2RlLCBjb21wcmVzc2xldmVsPWNvbXByZXNzbGV2ZWwpCiAKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgdCA9IGNscy50YXJvcGVuKG5hbWUsIG1vZGUsIGZpbGVvYmopCisgICAgICAgICAgICB0ID0gY2xzLnRhcm9wZW4obmFtZSwgbW9kZSwgZmlsZW9iaiwgKiprd2FyZ3MpCiAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJub3QgYSBiemlwMiBmaWxlIikKICAgICAgICAgdC5fZXh0ZmlsZW9iaiA9IEZhbHNlCkBAIC0xMjYyLDcgKzE3MjAsNyBAQAogICAgICAgICBpZiBzZWxmLmNsb3NlZDoKICAgICAgICAgICAgIHJldHVybgogCi0gICAgICAgIGlmIHNlbGYuX21vZGUgaW4gImF3IjoKKyAgICAgICAgaWYgc2VsZi5tb2RlIGluICJhdyI6CiAgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoTlVMICogKEJMT0NLU0laRSAqIDIpKQogICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gKEJMT0NLU0laRSAqIDIpCiAgICAgICAgICAgICAjIGZpbGwgdXAgdGhlIGVuZCB3aXRoIHplcm8tYmxvY2tzCkBAIC0xMzI4LDcgKzE3ODYsOCBAQAogCiAgICAgICAgICMgTm93LCBmaWxsIHRoZSBUYXJJbmZvIG9iamVjdCB3aXRoCiAgICAgICAgICMgaW5mb3JtYXRpb24gc3BlY2lmaWMgZm9yIHRoZSBmaWxlLgotICAgICAgICB0YXJpbmZvID0gVGFySW5mbygpCisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhcmluZm8oKQorICAgICAgICB0YXJpbmZvLnRhcmZpbGUgPSBzZWxmCiAKICAgICAgICAgIyBVc2Ugb3Muc3RhdCBvciBvcy5sc3RhdCwgZGVwZW5kaW5nIG9uIHBsYXRmb3JtCiAgICAgICAgICMgYW5kIGlmIHN5bWxpbmtzIHNoYWxsIGJlIHJlc29sdmVkLgpAQCAtMTM0NCw4ICsxODAzLDggQEAKICAgICAgICAgc3RtZCA9IHN0YXRyZXMuc3RfbW9kZQogICAgICAgICBpZiBzdGF0LlNfSVNSRUcoc3RtZCk6CiAgICAgICAgICAgICBpbm9kZSA9IChzdGF0cmVzLnN0X2lubywgc3RhdHJlcy5zdF9kZXYpCi0gICAgICAgICAgICBpZiBub3Qgc2VsZi5kZXJlZmVyZW5jZSBhbmQgXAotICAgICAgICAgICAgICAgICAgICBzdGF0cmVzLnN0X25saW5rID4gMSBhbmQgaW5vZGUgaW4gc2VsZi5pbm9kZXM6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5kZXJlZmVyZW5jZSBhbmQgc3RhdHJlcy5zdF9ubGluayA+IDEgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgaW5vZGUgaW4gc2VsZi5pbm9kZXMgYW5kIGFyY25hbWUgIT0gc2VsZi5pbm9kZXNbaW5vZGVdOgogICAgICAgICAgICAgICAgICMgSXMgaXQgYSBoYXJkbGluayB0byBhbiBhbHJlYWR5CiAgICAgICAgICAgICAgICAgIyBhcmNoaXZlZCBmaWxlPwogICAgICAgICAgICAgICAgIHR5cGUgPSBMTktUWVBFCkBAIC0xNDIyLDcgKzE4ODEsNyBAQAogICAgICAgICAgICAgICAgIHByaW50ICIlZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQiIFwKICAgICAgICAgICAgICAgICAgICAgICAlIHRpbWUubG9jYWx0aW1lKHRhcmluZm8ubXRpbWUpWzo2XSwKIAotICAgICAgICAgICAgcHJpbnQgdGFyaW5mby5uYW1lLAorICAgICAgICAgICAgcHJpbnQgdGFyaW5mby5uYW1lICsgKCIvIiBpZiB0YXJpbmZvLmlzZGlyKCkgZWxzZSAiIiksCiAKICAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAgICAgaWYgdGFyaW5mby5pc3N5bSgpOgpAQCAtMTQ1NCw3ICsxOTEzLDcgQEAKICAgICAgICAgICAgIGlmIHJlY3Vyc2l2ZToKICAgICAgICAgICAgICAgICBpZiBhcmNuYW1lID09ICIuIjoKICAgICAgICAgICAgICAgICAgICAgYXJjbmFtZSA9ICIiCi0gICAgICAgICAgICAgICAgZm9yIGYgaW4gb3MubGlzdGRpcigiLiIpOgorICAgICAgICAgICAgICAgIGZvciBmIGluIG9zLmxpc3RkaXIobmFtZSk6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkKGYsIG9zLnBhdGguam9pbihhcmNuYW1lLCBmKSkKICAgICAgICAgICAgIHJldHVybgogCkBAIC0xNDkzLDcgKzE5NTIsNyBAQAogCiAgICAgICAgIHRhcmluZm8gPSBjb3B5LmNvcHkodGFyaW5mbykKIAotICAgICAgICBidWYgPSB0YXJpbmZvLnRvYnVmKHNlbGYucG9zaXgpCisgICAgICAgIGJ1ZiA9IHRhcmluZm8udG9idWYoc2VsZi5mb3JtYXQsIHNlbGYuZW5jb2RpbmcpCiAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShidWYpCiAgICAgICAgIHNlbGYub2Zmc2V0ICs9IGxlbihidWYpCiAKQEAgLTE1MjUsNyArMTk4NCw3IEBACiAgICAgICAgICAgICAgICAgIyBFeHRyYWN0IGRpcmVjdG9yeSB3aXRoIGEgc2FmZSBtb2RlLCBzbyB0aGF0CiAgICAgICAgICAgICAgICAgIyBhbGwgZmlsZXMgYmVsb3cgY2FuIGJlIGV4dHJhY3RlZCBhcyB3ZWxsLgogICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgb3MubWFrZWRpcnMob3MucGF0aC5qb2luKHBhdGgsIHRhcmluZm8ubmFtZSksIDA3NzcpCisgICAgICAgICAgICAgICAgICAgIG9zLm1ha2VkaXJzKG9zLnBhdGguam9pbihwYXRoLCB0YXJpbmZvLm5hbWUpLCAwNzAwKQogICAgICAgICAgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yOgogICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICAgZGlyZWN0b3JpZXMuYXBwZW5kKHRhcmluZm8pCkBAIC0xNTU3LDEwICsyMDE2LDEwIEBACiAgICAgICAgICIiIgogICAgICAgICBzZWxmLl9jaGVjaygiciIpCiAKLSAgICAgICAgaWYgaXNpbnN0YW5jZShtZW1iZXIsIFRhckluZm8pOgotICAgICAgICAgICAgdGFyaW5mbyA9IG1lbWJlcgotICAgICAgICBlbHNlOgorICAgICAgICBpZiBpc2luc3RhbmNlKG1lbWJlciwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi5nZXRtZW1iZXIobWVtYmVyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGFyaW5mbyA9IG1lbWJlcgogCiAgICAgICAgICMgUHJlcGFyZSB0aGUgbGluayB0YXJnZXQgZm9yIG1ha2VsaW5rKCkuCiAgICAgICAgIGlmIHRhcmluZm8uaXNsbmsoKToKQEAgLTE1OTMsMTAgKzIwNTIsMTAgQEAKICAgICAgICAgIiIiCiAgICAgICAgIHNlbGYuX2NoZWNrKCJyIikKIAotICAgICAgICBpZiBpc2luc3RhbmNlKG1lbWJlciwgVGFySW5mbyk6Ci0gICAgICAgICAgICB0YXJpbmZvID0gbWVtYmVyCi0gICAgICAgIGVsc2U6CisgICAgICAgIGlmIGlzaW5zdGFuY2UobWVtYmVyLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLmdldG1lbWJlcihtZW1iZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0YXJpbmZvID0gbWVtYmVyCiAKICAgICAgICAgaWYgdGFyaW5mby5pc3JlZygpOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW9iamVjdChzZWxmLCB0YXJpbmZvKQpAQCAtMTgwOSwyMCArMjI2OCwxMSBAQAogICAgICAgICAjIFJlYWQgdGhlIG5leHQgYmxvY2suCiAgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKHNlbGYub2Zmc2V0KQogICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgYnVmID0gc2VsZi5maWxlb2JqLnJlYWQoQkxPQ0tTSVpFKQotICAgICAgICAgICAgaWYgbm90IGJ1ZjoKLSAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQotCiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgdGFyaW5mbyA9IFRhckluZm8uZnJvbWJ1ZihidWYpCi0KLSAgICAgICAgICAgICAgICAjIFNldCB0aGUgVGFySW5mbyBvYmplY3QncyBvZmZzZXQgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlCi0gICAgICAgICAgICAgICAgIyBUYXJGaWxlIGFuZCBzZXQgc2VsZi5vZmZzZXQgdG8gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBkYXRhIGJsb2NrcwotICAgICAgICAgICAgICAgICMgc2hvdWxkIGJlZ2luLgotICAgICAgICAgICAgICAgIHRhcmluZm8ub2Zmc2V0ID0gc2VsZi5vZmZzZXQKLSAgICAgICAgICAgICAgICBzZWxmLm9mZnNldCArPSBCTE9DS1NJWkUKLQotICAgICAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnByb2NfbWVtYmVyKHRhcmluZm8pCisgICAgICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyaW5mby5mcm9tdGFyZmlsZShzZWxmKQorICAgICAgICAgICAgICAgIGlmIHRhcmluZm8gaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgc2VsZi5tZW1iZXJzLmFwcGVuZCh0YXJpbmZvKQogCiAgICAgICAgICAgICBleGNlcHQgSGVhZGVyRXJyb3IsIGU6CiAgICAgICAgICAgICAgICAgaWYgc2VsZi5pZ25vcmVfemVyb3M6CkBAIC0xODM1LDE0OSArMjI4NSwxMSBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICAgYnJlYWsKIAotICAgICAgICAjIFNvbWUgb2xkIHRhciBwcm9ncmFtcyByZXByZXNlbnQgYSBkaXJlY3RvcnkgYXMgYSByZWd1bGFyCi0gICAgICAgICMgZmlsZSB3aXRoIGEgdHJhaWxpbmcgc2xhc2guCi0gICAgICAgIGlmIHRhcmluZm8uaXNyZWcoKSBhbmQgdGFyaW5mby5uYW1lLmVuZHN3aXRoKCIvIik6Ci0gICAgICAgICAgICB0YXJpbmZvLnR5cGUgPSBESVJUWVBFCi0KLSAgICAgICAgIyBEaXJlY3RvcnkgbmFtZXMgc2hvdWxkIGhhdmUgYSAnLycgYXQgdGhlIGVuZC4KLSAgICAgICAgaWYgdGFyaW5mby5pc2RpcigpOgotICAgICAgICAgICAgdGFyaW5mby5uYW1lICs9ICIvIgotCi0gICAgICAgIHNlbGYubWVtYmVycy5hcHBlbmQodGFyaW5mbykKLSAgICAgICAgcmV0dXJuIHRhcmluZm8KLQotICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICMgVGhlIGZvbGxvd2luZyBhcmUgbWV0aG9kcyB0aGF0IGFyZSBjYWxsZWQgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIGEKLSAgICAjIG1lbWJlci4gVGhlIGVudHJ5IHBvaW50IGlzIHByb2NfbWVtYmVyKCkgd2hpY2ggaXMgY2FsbGVkIHdpdGggYSBUYXJJbmZvCi0gICAgIyBvYmplY3QgY3JlYXRlZCBmcm9tIHRoZSBoZWFkZXIgYmxvY2sgZnJvbSB0aGUgY3VycmVudCBvZmZzZXQuIFRoZQotICAgICMgcHJvY19tZW1iZXIoKSBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gaW4gYSBzdWJjbGFzcyB0byBhZGQgY3VzdG9tCi0gICAgIyBwcm9jXyooKSBtZXRob2RzLiBBIHByb2NfKigpIG1ldGhvZCBNVVNUIGltcGxlbWVudCB0aGUgZm9sbG93aW5nCi0gICAgIyBvcGVyYXRpb25zOgotICAgICMgMS4gU2V0IHRhcmluZm8ub2Zmc2V0X2RhdGEgdG8gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBkYXRhIGJsb2NrcyBiZWdpbiwKLSAgICAjICAgIGlmIHRoZXJlIGlzIGRhdGEgdGhhdCBmb2xsb3dzLgotICAgICMgMi4gU2V0IHNlbGYub2Zmc2V0IHRvIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgbmV4dCBtZW1iZXIncyBoZWFkZXIgd2lsbAotICAgICMgICAgYmVnaW4uCi0gICAgIyAzLiBSZXR1cm4gdGFyaW5mbyBvciBhbm90aGVyIHZhbGlkIFRhckluZm8gb2JqZWN0LgotICAgIGRlZiBwcm9jX21lbWJlcihzZWxmLCB0YXJpbmZvKToKLSAgICAgICAgIiIiQ2hvb3NlIHRoZSByaWdodCBwcm9jZXNzaW5nIG1ldGhvZCBmb3IgdGFyaW5mbyBkZXBlbmRpbmcKLSAgICAgICAgICAgb24gaXRzIHR5cGUgYW5kIGNhbGwgaXQuCi0gICAgICAgICIiIgotICAgICAgICBpZiB0YXJpbmZvLnR5cGUgaW4gKEdOVVRZUEVfTE9OR05BTUUsIEdOVVRZUEVfTE9OR0xJTkspOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYucHJvY19nbnVsb25nKHRhcmluZm8pCi0gICAgICAgIGVsaWYgdGFyaW5mby50eXBlID09IEdOVVRZUEVfU1BBUlNFOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYucHJvY19zcGFyc2UodGFyaW5mbykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBzZWxmLnByb2NfYnVpbHRpbih0YXJpbmZvKQotCi0gICAgZGVmIHByb2NfYnVpbHRpbihzZWxmLCB0YXJpbmZvKToKLSAgICAgICAgIiIiUHJvY2VzcyBhIGJ1aWx0aW4gdHlwZSBtZW1iZXIgb3IgYW4gdW5rbm93biBtZW1iZXIKLSAgICAgICAgICAgd2hpY2ggd2lsbCBiZSB0cmVhdGVkIGFzIGEgcmVndWxhciBmaWxlLgotICAgICAgICAiIiIKLSAgICAgICAgdGFyaW5mby5vZmZzZXRfZGF0YSA9IHNlbGYub2Zmc2V0Ci0gICAgICAgIGlmIHRhcmluZm8uaXNyZWcoKSBvciB0YXJpbmZvLnR5cGUgbm90IGluIFNVUFBPUlRFRF9UWVBFUzoKLSAgICAgICAgICAgICMgU2tpcCB0aGUgZm9sbG93aW5nIGRhdGEgYmxvY2tzLgotICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gc2VsZi5fYmxvY2sodGFyaW5mby5zaXplKQotICAgICAgICByZXR1cm4gdGFyaW5mbwotCi0gICAgZGVmIHByb2NfZ251bG9uZyhzZWxmLCB0YXJpbmZvKToKLSAgICAgICAgIiIiUHJvY2VzcyB0aGUgYmxvY2tzIHRoYXQgaG9sZCBhIEdOVSBsb25nbmFtZQotICAgICAgICAgICBvciBsb25nbGluayBtZW1iZXIuCi0gICAgICAgICIiIgotICAgICAgICBidWYgPSAiIgotICAgICAgICBjb3VudCA9IHRhcmluZm8uc2l6ZQotICAgICAgICB3aGlsZSBjb3VudCA+IDA6Ci0gICAgICAgICAgICBibG9jayA9IHNlbGYuZmlsZW9iai5yZWFkKEJMT0NLU0laRSkKLSAgICAgICAgICAgIGJ1ZiArPSBibG9jawotICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gQkxPQ0tTSVpFCi0gICAgICAgICAgICBjb3VudCAtPSBCTE9DS1NJWkUKLQotICAgICAgICAjIEZldGNoIHRoZSBuZXh0IGhlYWRlciBhbmQgcHJvY2VzcyBpdC4KLSAgICAgICAgYiA9IHNlbGYuZmlsZW9iai5yZWFkKEJMT0NLU0laRSkKLSAgICAgICAgdCA9IFRhckluZm8uZnJvbWJ1ZihiKQotICAgICAgICB0Lm9mZnNldCA9IHNlbGYub2Zmc2V0Ci0gICAgICAgIHNlbGYub2Zmc2V0ICs9IEJMT0NLU0laRQotICAgICAgICBuZXh0ID0gc2VsZi5wcm9jX21lbWJlcih0KQotCi0gICAgICAgICMgUGF0Y2ggdGhlIFRhckluZm8gb2JqZWN0IGZyb20gdGhlIG5leHQgaGVhZGVyIHdpdGgKLSAgICAgICAgIyB0aGUgbG9uZ25hbWUgaW5mb3JtYXRpb24uCi0gICAgICAgIG5leHQub2Zmc2V0ID0gdGFyaW5mby5vZmZzZXQKLSAgICAgICAgaWYgdGFyaW5mby50eXBlID09IEdOVVRZUEVfTE9OR05BTUU6Ci0gICAgICAgICAgICBuZXh0Lm5hbWUgPSBidWYucnN0cmlwKE5VTCkKLSAgICAgICAgZWxpZiB0YXJpbmZvLnR5cGUgPT0gR05VVFlQRV9MT05HTElOSzoKLSAgICAgICAgICAgIG5leHQubGlua25hbWUgPSBidWYucnN0cmlwKE5VTCkKLQotICAgICAgICByZXR1cm4gbmV4dAotCi0gICAgZGVmIHByb2Nfc3BhcnNlKHNlbGYsIHRhcmluZm8pOgotICAgICAgICAiIiJQcm9jZXNzIGEgR05VIHNwYXJzZSBoZWFkZXIgcGx1cyBleHRyYSBoZWFkZXJzLgotICAgICAgICAiIiIKLSAgICAgICAgYnVmID0gdGFyaW5mby5idWYKLSAgICAgICAgc3AgPSBfcmluZ2J1ZmZlcigpCi0gICAgICAgIHBvcyA9IDM4NgotICAgICAgICBsYXN0cG9zID0gMEwKLSAgICAgICAgcmVhbHBvcyA9IDBMCi0gICAgICAgICMgVGhlcmUgYXJlIDQgcG9zc2libGUgc3BhcnNlIHN0cnVjdHMgaW4gdGhlCi0gICAgICAgICMgZmlyc3QgaGVhZGVyLgotICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoNCk6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ID0gbnRpKGJ1Zltwb3M6cG9zICsgMTJdKQotICAgICAgICAgICAgICAgIG51bWJ5dGVzID0gbnRpKGJ1Zltwb3MgKyAxMjpwb3MgKyAyNF0pCi0gICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgaWYgb2Zmc2V0ID4gbGFzdHBvczoKLSAgICAgICAgICAgICAgICBzcC5hcHBlbmQoX2hvbGUobGFzdHBvcywgb2Zmc2V0IC0gbGFzdHBvcykpCi0gICAgICAgICAgICBzcC5hcHBlbmQoX2RhdGEob2Zmc2V0LCBudW1ieXRlcywgcmVhbHBvcykpCi0gICAgICAgICAgICByZWFscG9zICs9IG51bWJ5dGVzCi0gICAgICAgICAgICBsYXN0cG9zID0gb2Zmc2V0ICsgbnVtYnl0ZXMKLSAgICAgICAgICAgIHBvcyArPSAyNAotCi0gICAgICAgIGlzZXh0ZW5kZWQgPSBvcmQoYnVmWzQ4Ml0pCi0gICAgICAgIG9yaWdzaXplID0gbnRpKGJ1Zls0ODM6NDk1XSkKLQotICAgICAgICAjIElmIHRoZSBpc2V4dGVuZGVkIGZsYWcgaXMgZ2l2ZW4sCi0gICAgICAgICMgdGhlcmUgYXJlIGV4dHJhIGhlYWRlcnMgdG8gcHJvY2Vzcy4KLSAgICAgICAgd2hpbGUgaXNleHRlbmRlZCA9PSAxOgotICAgICAgICAgICAgYnVmID0gc2VsZi5maWxlb2JqLnJlYWQoQkxPQ0tTSVpFKQotICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gQkxPQ0tTSVpFCi0gICAgICAgICAgICBwb3MgPSAwCi0gICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMjEpOgotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbnRpKGJ1Zltwb3M6cG9zICsgMTJdKQotICAgICAgICAgICAgICAgICAgICBudW1ieXRlcyA9IG50aShidWZbcG9zICsgMTI6cG9zICsgMjRdKQotICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgIGlmIG9mZnNldCA+IGxhc3Rwb3M6Ci0gICAgICAgICAgICAgICAgICAgIHNwLmFwcGVuZChfaG9sZShsYXN0cG9zLCBvZmZzZXQgLSBsYXN0cG9zKSkKLSAgICAgICAgICAgICAgICBzcC5hcHBlbmQoX2RhdGEob2Zmc2V0LCBudW1ieXRlcywgcmVhbHBvcykpCi0gICAgICAgICAgICAgICAgcmVhbHBvcyArPSBudW1ieXRlcwotICAgICAgICAgICAgICAgIGxhc3Rwb3MgPSBvZmZzZXQgKyBudW1ieXRlcwotICAgICAgICAgICAgICAgIHBvcyArPSAyNAotICAgICAgICAgICAgaXNleHRlbmRlZCA9IG9yZChidWZbNTA0XSkKLQotICAgICAgICBpZiBsYXN0cG9zIDwgb3JpZ3NpemU6Ci0gICAgICAgICAgICBzcC5hcHBlbmQoX2hvbGUobGFzdHBvcywgb3JpZ3NpemUgLSBsYXN0cG9zKSkKLQotICAgICAgICB0YXJpbmZvLnNwYXJzZSA9IHNwCi0KLSAgICAgICAgdGFyaW5mby5vZmZzZXRfZGF0YSA9IHNlbGYub2Zmc2V0Ci0gICAgICAgIHNlbGYub2Zmc2V0ICs9IHNlbGYuX2Jsb2NrKHRhcmluZm8uc2l6ZSkKLSAgICAgICAgdGFyaW5mby5zaXplID0gb3JpZ3NpemUKLQogICAgICAgICByZXR1cm4gdGFyaW5mbwogCiAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIyBMaXR0bGUgaGVscGVyIG1ldGhvZHM6CiAKLSAgICBkZWYgX2Jsb2NrKHNlbGYsIGNvdW50KToKLSAgICAgICAgIiIiUm91bmQgdXAgYSBieXRlIGNvdW50IGJ5IEJMT0NLU0laRSBhbmQgcmV0dXJuIGl0LAotICAgICAgICAgICBlLmcuIF9ibG9jayg4MzQpID0+IDEwMjQuCi0gICAgICAgICIiIgotICAgICAgICBibG9ja3MsIHJlbWFpbmRlciA9IGRpdm1vZChjb3VudCwgQkxPQ0tTSVpFKQotICAgICAgICBpZiByZW1haW5kZXI6Ci0gICAgICAgICAgICBibG9ja3MgKz0gMQotICAgICAgICByZXR1cm4gYmxvY2tzICogQkxPQ0tTSVpFCi0KICAgICBkZWYgX2dldG1lbWJlcihzZWxmLCBuYW1lLCB0YXJpbmZvPU5vbmUpOgogICAgICAgICAiIiJGaW5kIGFuIGFyY2hpdmUgbWVtYmVyIGJ5IG5hbWUgZnJvbSBib3R0b20gdG8gdG9wLgogICAgICAgICAgICBJZiB0YXJpbmZvIGlzIGdpdmVuLCBpdCBpcyB1c2VkIGFzIHRoZSBzdGFydGluZyBwb2ludC4KQEAgLTIwMTAsOCArMjMyMiw4IEBACiAgICAgICAgICIiIgogICAgICAgICBpZiBzZWxmLmNsb3NlZDoKICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoIiVzIGlzIGNsb3NlZCIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXykKLSAgICAgICAgaWYgbW9kZSBpcyBub3QgTm9uZSBhbmQgc2VsZi5fbW9kZSBub3QgaW4gbW9kZToKLSAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoImJhZCBvcGVyYXRpb24gZm9yIG1vZGUgJXIiICUgc2VsZi5fbW9kZSkKKyAgICAgICAgaWYgbW9kZSBpcyBub3QgTm9uZSBhbmQgc2VsZi5tb2RlIG5vdCBpbiBtb2RlOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiYmFkIG9wZXJhdGlvbiBmb3IgbW9kZSAlciIgJSBzZWxmLm1vZGUpCiAKICAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgICIiIlByb3ZpZGUgYW4gaXRlcmF0b3Igb2JqZWN0LgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5IGIvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5CmluZGV4IGYyZGQ5N2QuLjU3MzQ4OWEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RhcmZpbGUucHkKQEAgLTEsOCArMSwxMiBAQAorIyBlbmNvZGluZzogaXNvODg1OS0xNQorCiBpbXBvcnQgc3lzCiBpbXBvcnQgb3MKIGltcG9ydCBzaHV0aWwKIGltcG9ydCB0ZW1wZmlsZQogaW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgbWQ1CitpbXBvcnQgZXJybm8KIAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgdGFyZmlsZQpAQCAtMjAsNDUyICsyNCw1NDYgQEAKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICBiejIgPSBOb25lCiAKK2RlZiBtZDVzdW0oZGF0YSk6CisgICAgcmV0dXJuIG1kNS5uZXcoZGF0YSkuaGV4ZGlnZXN0KCkKKwogZGVmIHBhdGgocGF0aCk6CiAgICAgcmV0dXJuIHRlc3Rfc3VwcG9ydC5maW5kZmlsZShwYXRoKQogCi10ZXN0dGFyID0gcGF0aCgidGVzdHRhci50YXIiKQotdGVtcGRpciA9IG9zLnBhdGguam9pbih0ZW1wZmlsZS5nZXR0ZW1wZGlyKCksICJ0ZXN0dGFyIiArIG9zLmV4dHNlcCArICJkaXIiKQotdGVtcG5hbWUgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCi1tZW1iZXJjb3VudCA9IDEyCitURU1QRElSID0gb3MucGF0aC5qb2luKHRlbXBmaWxlLmdldHRlbXBkaXIoKSwgInRlc3RfdGFyZmlsZV90bXAiKQordGFybmFtZSA9IHBhdGgoInRlc3R0YXIudGFyIikKK2d6aXBuYW1lID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJ0ZXN0dGFyLnRhci5neiIpCitiejJuYW1lID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJ0ZXN0dGFyLnRhci5iejIiKQordG1wbmFtZSA9IG9zLnBhdGguam9pbihURU1QRElSLCAidG1wLnRhciIpCiAKLWRlZiB0YXJuYW1lKGNvbXA9IiIpOgotICAgIGlmIG5vdCBjb21wOgotICAgICAgICByZXR1cm4gdGVzdHRhcgotICAgIHJldHVybiBvcy5wYXRoLmpvaW4odGVtcGRpciwgIiVzJXMlcyIgJSAodGVzdHRhciwgb3MuZXh0c2VwLCBjb21wKSkKLQotZGVmIGRpcm5hbWUoKToKLSAgICBpZiBub3Qgb3MucGF0aC5leGlzdHModGVtcGRpcik6Ci0gICAgICAgIG9zLm1rZGlyKHRlbXBkaXIpCi0gICAgcmV0dXJuIHRlbXBkaXIKLQotZGVmIHRtcG5hbWUoKToKLSAgICByZXR1cm4gdGVtcG5hbWUKK21kNV9yZWd0eXBlID0gIjY1ZjQ3N2M4MThhZDllMTVmN2ZlYWIwYzZkMzc3NDJmIgorbWQ1X3NwYXJzZSA9ICJhNTRmYmM0Y2E0ZjQzOTlhOTBlMWIyNzE2NDAxMmZjNiIKIAogCi1jbGFzcyBCYXNlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgY29tcCA9ICcnCi0gICAgbW9kZSA9ICdyJwotICAgIHNlcCA9ICc6JworY2xhc3MgUmVhZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgdGFybmFtZSA9IHRhcm5hbWUKKyAgICBtb2RlID0gInI6IgogCiAgICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBtb2RlID0gc2VsZi5tb2RlICsgc2VsZi5zZXAgKyBzZWxmLmNvbXAKLSAgICAgICAgc2VsZi50YXIgPSB0YXJmaWxlLm9wZW4odGFybmFtZShzZWxmLmNvbXApLCBtb2RlKQorICAgICAgICBzZWxmLnRhciA9IHRhcmZpbGUub3BlbihzZWxmLnRhcm5hbWUsIG1vZGU9c2VsZi5tb2RlKQogCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzZWxmLnRhci5jbG9zZSgpCiAKLWNsYXNzIFJlYWRUZXN0KEJhc2VUZXN0KToKIAotICAgIGRlZiB0ZXN0KHNlbGYpOgotICAgICAgICAiIiJUZXN0IG1lbWJlciBleHRyYWN0aW9uLgotICAgICAgICAiIiIKLSAgICAgICAgbWVtYmVycyA9IDAKLSAgICAgICAgZm9yIHRhcmluZm8gaW4gc2VsZi50YXI6Ci0gICAgICAgICAgICBtZW1iZXJzICs9IDEKLSAgICAgICAgICAgIGlmIG5vdCB0YXJpbmZvLmlzcmVnKCk6Ci0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIGYgPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihmLnJlYWQoKSkgPT0gdGFyaW5mby5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICJzaXplIHJlYWQgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgc2l6ZSIpCi0gICAgICAgICAgICBmLmNsb3NlKCkKK2NsYXNzIFVzdGFyUmVhZFRlc3QoUmVhZFRlc3QpOgogCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtZW1iZXJzID09IG1lbWJlcmNvdW50LAotICAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBmaW5kIGFsbCBtZW1iZXJzIikKKyAgICBkZWYgdGVzdF9maWxlb2JqX3JlZ3VsYXJfZmlsZShzZWxmKToKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvcmVndHlwZSIpCisgICAgICAgIGZvYmogPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvKQorICAgICAgICBkYXRhID0gZm9iai5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKChsZW4oZGF0YSksIG1kNXN1bShkYXRhKSkgPT0gKHRhcmluZm8uc2l6ZSwgbWQ1X3JlZ3R5cGUpLAorICAgICAgICAgICAgICAgICJyZWd1bGFyIGZpbGUgZXh0cmFjdGlvbiBmYWlsZWQiKQogCi0gICAgZGVmIHRlc3Rfc3BhcnNlKHNlbGYpOgotICAgICAgICAiIiJUZXN0IHNwYXJzZSBtZW1iZXIgZXh0cmFjdGlvbi4KLSAgICAgICAgIiIiCi0gICAgICAgIGlmIHNlbGYuc2VwICE9ICJ8IjoKLSAgICAgICAgICAgIGYxID0gc2VsZi50YXIuZXh0cmFjdGZpbGUoIlMtU1BBUlNFIikKLSAgICAgICAgICAgIGYyID0gc2VsZi50YXIuZXh0cmFjdGZpbGUoIlMtU1BBUlNFLVdJVEgtTlVMTFMiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGYxLnJlYWQoKSA9PSBmMi5yZWFkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIl9GaWxlT2JqZWN0IGZhaWxlZCBvbiBzcGFyc2UgZmlsZSBtZW1iZXIiKQorICAgIGRlZiB0ZXN0X2ZpbGVvYmpfcmVhZGxpbmVzKHNlbGYpOgorICAgICAgICBzZWxmLnRhci5leHRyYWN0KCJ1c3Rhci9yZWd0eXBlIiwgVEVNUERJUikKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvcmVndHlwZSIpCisgICAgICAgIGZvYmoxID0gb3Blbihvcy5wYXRoLmpvaW4oVEVNUERJUiwgInVzdGFyL3JlZ3R5cGUiKSwgInJVIikKKyAgICAgICAgZm9iajIgPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvKQogCi0gICAgZGVmIHRlc3RfcmVhZGxpbmVzKHNlbGYpOgotICAgICAgICAiIiJUZXN0IHJlYWRsaW5lcygpIG1ldGhvZCBvZiBfRmlsZU9iamVjdC4KLSAgICAgICAgIiIiCi0gICAgICAgIGlmIHNlbGYuc2VwICE9ICJ8IjoKLSAgICAgICAgICAgIGZpbGVuYW1lID0gIjAtUkVHVFlQRS1URVhUIgotICAgICAgICAgICAgc2VsZi50YXIuZXh0cmFjdChmaWxlbmFtZSwgZGlybmFtZSgpKQotICAgICAgICAgICAgZiA9IG9wZW4ob3MucGF0aC5qb2luKGRpcm5hbWUoKSwgZmlsZW5hbWUpLCAiclUiKQotICAgICAgICAgICAgbGluZXMxID0gZi5yZWFkbGluZXMoKQotICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBsaW5lczIgPSBzZWxmLnRhci5leHRyYWN0ZmlsZShmaWxlbmFtZSkucmVhZGxpbmVzKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhsaW5lczEgPT0gbGluZXMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICJfRmlsZU9iamVjdC5yZWFkbGluZSgpIGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IikKKyAgICAgICAgbGluZXMxID0gZm9iajEucmVhZGxpbmVzKCkKKyAgICAgICAgbGluZXMyID0gZm9iajIucmVhZGxpbmVzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGxpbmVzMSA9PSBsaW5lczIsCisgICAgICAgICAgICAgICAgImZpbGVvYmoucmVhZGxpbmVzKCkgZmFpbGVkIikKKyAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihsaW5lczIpID09IDExNCwKKyAgICAgICAgICAgICAgICAiZmlsZW9iai5yZWFkbGluZXMoKSBmYWlsZWQiKQorICAgICAgICBzZWxmLmFzc2VydF8obGluZXMyWzgzXSA9PSBcCisgICAgICAgICAgICAgICAgIkkgd2lsbCBnbGFkbHkgYWRtaXQgdGhhdCBQeXRob24gaXMgbm90IHRoZSBmYXN0ZXN0IHJ1bm5pbmcgc2NyaXB0aW5nIGxhbmd1YWdlLlxuIiwKKyAgICAgICAgICAgICAgICAiZmlsZW9iai5yZWFkbGluZXMoKSBmYWlsZWQiKQogCi0gICAgZGVmIHRlc3RfaXRlcihzZWxmKToKLSAgICAgICAgIyBUZXN0IGl0ZXJhdGlvbiBvdmVyIEV4RmlsZU9iamVjdC4KLSAgICAgICAgaWYgc2VsZi5zZXAgIT0gInwiOgotICAgICAgICAgICAgZmlsZW5hbWUgPSAiMC1SRUdUWVBFLVRFWFQiCi0gICAgICAgICAgICBzZWxmLnRhci5leHRyYWN0KGZpbGVuYW1lLCBkaXJuYW1lKCkpCi0gICAgICAgICAgICBmID0gb3Blbihvcy5wYXRoLmpvaW4oZGlybmFtZSgpLCBmaWxlbmFtZSksICJyVSIpCi0gICAgICAgICAgICBsaW5lczEgPSBmLnJlYWRsaW5lcygpCi0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIGxpbmVzMiA9IFtsaW5lIGZvciBsaW5lIGluIHNlbGYudGFyLmV4dHJhY3RmaWxlKGZpbGVuYW1lKV0KLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhsaW5lczEgPT0gbGluZXMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICJFeEZpbGVPYmplY3QgaXRlcmF0aW9uIGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IikKKyAgICBkZWYgdGVzdF9maWxlb2JqX2l0ZXIoc2VsZik6CisgICAgICAgIHNlbGYudGFyLmV4dHJhY3QoInVzdGFyL3JlZ3R5cGUiLCBURU1QRElSKQorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9yZWd0eXBlIikKKyAgICAgICAgZm9iajEgPSBvcGVuKG9zLnBhdGguam9pbihURU1QRElSLCAidXN0YXIvcmVndHlwZSIpLCAiclUiKQorICAgICAgICBmb2JqMiA9IHNlbGYudGFyLmV4dHJhY3RmaWxlKHRhcmluZm8pCisgICAgICAgIGxpbmVzMSA9IGZvYmoxLnJlYWRsaW5lcygpCisgICAgICAgIGxpbmVzMiA9IFtsaW5lIGZvciBsaW5lIGluIGZvYmoyXQorICAgICAgICBzZWxmLmFzc2VydF8obGluZXMxID09IGxpbmVzMiwKKyAgICAgICAgICAgICAgICAgICAgICJmaWxlb2JqLl9faXRlcl9fKCkgZmFpbGVkIikKIAotICAgIGRlZiB0ZXN0X3NlZWsoc2VsZik6Ci0gICAgICAgICIiIlRlc3Qgc2VlaygpIG1ldGhvZCBvZiBfRmlsZU9iamVjdCwgaW5jbC4gcmFuZG9tIHJlYWRpbmcuCi0gICAgICAgICIiIgotICAgICAgICBpZiBzZWxmLnNlcCAhPSAifCI6Ci0gICAgICAgICAgICBmaWxlbmFtZSA9ICIwLVJFR1RZUEUtVEVYVCIKLSAgICAgICAgICAgIHNlbGYudGFyLmV4dHJhY3QoZmlsZW5hbWUsIGRpcm5hbWUoKSkKLSAgICAgICAgICAgIGYgPSBvcGVuKG9zLnBhdGguam9pbihkaXJuYW1lKCksIGZpbGVuYW1lKSwgInJiIikKLSAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQotICAgICAgICAgICAgZi5jbG9zZSgpCi0KLSAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoZmlsZW5hbWUpCi0gICAgICAgICAgICBmb2JqID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbykKLQotICAgICAgICAgICAgdGV4dCA9IGZvYmoucmVhZCgpCi0gICAgICAgICAgICBmb2JqLnNlZWsoMCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygwID09IGZvYmoudGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICJzZWVrKCkgdG8gZmlsZSdzIHN0YXJ0IGZhaWxlZCIpCi0gICAgICAgICAgICBmb2JqLnNlZWsoMjA0OCwgMCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygyMDQ4ID09IGZvYmoudGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICJzZWVrKCkgdG8gYWJzb2x1dGUgcG9zaXRpb24gZmFpbGVkIikKLSAgICAgICAgICAgIGZvYmouc2VlaygtMTAyNCwgMSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygxMDI0ID09IGZvYmoudGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICJzZWVrKCkgdG8gbmVnYXRpdmUgcmVsYXRpdmUgcG9zaXRpb24gZmFpbGVkIikKLSAgICAgICAgICAgIGZvYmouc2VlaygxMDI0LCAxKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKDIwNDggPT0gZm9iai50ZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgInNlZWsoKSB0byBwb3NpdGl2ZSByZWxhdGl2ZSBwb3NpdGlvbiBmYWlsZWQiKQotICAgICAgICAgICAgcyA9IGZvYmoucmVhZCgxMCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhzID09IGRhdGFbMjA0ODoyMDU4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZCgpIGFmdGVyIHNlZWsgZmFpbGVkIikKLSAgICAgICAgICAgIGZvYmouc2VlaygwLCAyKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHRhcmluZm8uc2l6ZSA9PSBmb2JqLnRlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAic2VlaygpIHRvIGZpbGUncyBlbmQgZmFpbGVkIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhmb2JqLnJlYWQoKSA9PSAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZCgpIGF0IGZpbGUncyBlbmQgZGlkIG5vdCByZXR1cm4gZW1wdHkgc3RyaW5nIikKLSAgICAgICAgICAgIGZvYmouc2VlaygtdGFyaW5mby5zaXplLCAyKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKDAgPT0gZm9iai50ZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgInJlbGF0aXZlIHNlZWsoKSB0byBmaWxlJ3Mgc3RhcnQgZmFpbGVkIikKLSAgICAgICAgICAgIGZvYmouc2Vlayg1MTIpCi0gICAgICAgICAgICBzMSA9IGZvYmoucmVhZGxpbmVzKCkKLSAgICAgICAgICAgIGZvYmouc2Vlayg1MTIpCi0gICAgICAgICAgICBzMiA9IGZvYmoucmVhZGxpbmVzKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhzMSA9PSBzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZGxpbmVzKCkgYWZ0ZXIgc2VlayBmYWlsZWQiKQotICAgICAgICAgICAgZm9iai5zZWVrKDApCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obGVuKGZvYmoucmVhZGxpbmUoKSkgPT0gZm9iai50ZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgInRlbGwoKSBhZnRlciByZWFkbGluZSgpIGZhaWxlZCIpCi0gICAgICAgICAgICBmb2JqLnNlZWsoNTEyKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihmb2JqLnJlYWRsaW5lKCkpICsgNTEyID09IGZvYmoudGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZWxsKCkgYWZ0ZXIgc2VlaygpIGFuZCByZWFkbGluZSgpIGZhaWxlZCIpCi0gICAgICAgICAgICBmb2JqLnNlZWsoMCkKLSAgICAgICAgICAgIGxpbmUgPSBmb2JqLnJlYWRsaW5lKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhmb2JqLnJlYWQoKSA9PSBkYXRhW2xlbihsaW5lKTpdLAotICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkKCkgYWZ0ZXIgcmVhZGxpbmUoKSBmYWlsZWQiKQotICAgICAgICAgICAgZm9iai5jbG9zZSgpCi0KLSAgICBkZWYgdGVzdF9vbGRfZGlydHlwZShzZWxmKToKLSAgICAgICAgIiIiVGVzdCBvbGQgc3R5bGUgZGlydHlwZSBtZW1iZXIgKGJ1ZyAjMTMzNjYyMykuCi0gICAgICAgICIiIgotICAgICAgICAjIE9sZCB0YXJzIGNyZWF0ZSBkaXJlY3RvcnkgbWVtYmVycyB1c2luZyBhIFJFR1RZUEUKLSAgICAgICAgIyBoZWFkZXIgd2l0aCBhICIvIiBhcHBlbmRlZCB0byB0aGUgZmlsZW5hbWUgZmllbGQuCi0KLSAgICAgICAgIyBDcmVhdGUgYW4gb2xkIHRhciBzdHlsZSBkaXJlY3RvcnkgZW50cnkuCi0gICAgICAgIGZpbGVuYW1lID0gdG1wbmFtZSgpCi0gICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oImRpcmVjdG9yeS8iKQotICAgICAgICB0YXJpbmZvLnR5cGUgPSB0YXJmaWxlLlJFR1RZUEUKLQotICAgICAgICBmb2JqID0gb3BlbihmaWxlbmFtZSwgInciKQotICAgICAgICBmb2JqLndyaXRlKHRhcmluZm8udG9idWYoKSkKKyAgICBkZWYgdGVzdF9maWxlb2JqX3NlZWsoc2VsZik6CisgICAgICAgIHNlbGYudGFyLmV4dHJhY3QoInVzdGFyL3JlZ3R5cGUiLCBURU1QRElSKQorICAgICAgICBmb2JqID0gb3Blbihvcy5wYXRoLmpvaW4oVEVNUERJUiwgInVzdGFyL3JlZ3R5cGUiKSwgInJiIikKKyAgICAgICAgZGF0YSA9IGZvYmoucmVhZCgpCiAgICAgICAgIGZvYmouY2xvc2UoKQogCisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL3JlZ3R5cGUiKQorICAgICAgICBmb2JqID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbykKKworICAgICAgICB0ZXh0ID0gZm9iai5yZWFkKCkKKyAgICAgICAgZm9iai5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0XygwID09IGZvYmoudGVsbCgpLAorICAgICAgICAgICAgICAgICAgICAgInNlZWsoKSB0byBmaWxlJ3Mgc3RhcnQgZmFpbGVkIikKKyAgICAgICAgZm9iai5zZWVrKDIwNDgsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0XygyMDQ4ID09IGZvYmoudGVsbCgpLAorICAgICAgICAgICAgICAgICAgICAgInNlZWsoKSB0byBhYnNvbHV0ZSBwb3NpdGlvbiBmYWlsZWQiKQorICAgICAgICBmb2JqLnNlZWsoLTEwMjQsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0XygxMDI0ID09IGZvYmoudGVsbCgpLAorICAgICAgICAgICAgICAgICAgICAgInNlZWsoKSB0byBuZWdhdGl2ZSByZWxhdGl2ZSBwb3NpdGlvbiBmYWlsZWQiKQorICAgICAgICBmb2JqLnNlZWsoMTAyNCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKDIwNDggPT0gZm9iai50ZWxsKCksCisgICAgICAgICAgICAgICAgICAgICAic2VlaygpIHRvIHBvc2l0aXZlIHJlbGF0aXZlIHBvc2l0aW9uIGZhaWxlZCIpCisgICAgICAgIHMgPSBmb2JqLnJlYWQoMTApCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzID09IGRhdGFbMjA0ODoyMDU4XSwKKyAgICAgICAgICAgICAgICAgICAgICJyZWFkKCkgYWZ0ZXIgc2VlayBmYWlsZWQiKQorICAgICAgICBmb2JqLnNlZWsoMCwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRfKHRhcmluZm8uc2l6ZSA9PSBmb2JqLnRlbGwoKSwKKyAgICAgICAgICAgICAgICAgICAgICJzZWVrKCkgdG8gZmlsZSdzIGVuZCBmYWlsZWQiKQorICAgICAgICBzZWxmLmFzc2VydF8oZm9iai5yZWFkKCkgPT0gIiIsCisgICAgICAgICAgICAgICAgICAgICAicmVhZCgpIGF0IGZpbGUncyBlbmQgZGlkIG5vdCByZXR1cm4gZW1wdHkgc3RyaW5nIikKKyAgICAgICAgZm9iai5zZWVrKC10YXJpbmZvLnNpemUsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0XygwID09IGZvYmoudGVsbCgpLAorICAgICAgICAgICAgICAgICAgICAgInJlbGF0aXZlIHNlZWsoKSB0byBmaWxlJ3Mgc3RhcnQgZmFpbGVkIikKKyAgICAgICAgZm9iai5zZWVrKDUxMikKKyAgICAgICAgczEgPSBmb2JqLnJlYWRsaW5lcygpCisgICAgICAgIGZvYmouc2Vlayg1MTIpCisgICAgICAgIHMyID0gZm9iai5yZWFkbGluZXMoKQorICAgICAgICBzZWxmLmFzc2VydF8oczEgPT0gczIsCisgICAgICAgICAgICAgICAgICAgICAicmVhZGxpbmVzKCkgYWZ0ZXIgc2VlayBmYWlsZWQiKQorICAgICAgICBmb2JqLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihmb2JqLnJlYWRsaW5lKCkpID09IGZvYmoudGVsbCgpLAorICAgICAgICAgICAgICAgICAgICAgInRlbGwoKSBhZnRlciByZWFkbGluZSgpIGZhaWxlZCIpCisgICAgICAgIGZvYmouc2Vlayg1MTIpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oZm9iai5yZWFkbGluZSgpKSArIDUxMiA9PSBmb2JqLnRlbGwoKSwKKyAgICAgICAgICAgICAgICAgICAgICJ0ZWxsKCkgYWZ0ZXIgc2VlaygpIGFuZCByZWFkbGluZSgpIGZhaWxlZCIpCisgICAgICAgIGZvYmouc2VlaygwKQorICAgICAgICBsaW5lID0gZm9iai5yZWFkbGluZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhmb2JqLnJlYWQoKSA9PSBkYXRhW2xlbihsaW5lKTpdLAorICAgICAgICAgICAgICAgICAgICAgInJlYWQoKSBhZnRlciByZWFkbGluZSgpIGZhaWxlZCIpCisgICAgICAgIGZvYmouY2xvc2UoKQorCisKK2NsYXNzIE1pc2NSZWFkVGVzdChSZWFkVGVzdCk6CisKKyAgICBkZWYgdGVzdF9ub19maWxlbmFtZShzZWxmKToKKyAgICAgICAgZm9iaiA9IG9wZW4oc2VsZi50YXJuYW1lLCAicmIiKQorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4oZmlsZW9iaj1mb2JqLCBtb2RlPXNlbGYubW9kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIubmFtZSwgb3MucGF0aC5hYnNwYXRoKGZvYmoubmFtZSkpCisKKyAgICBkZWYgdGVzdF9mYWlsX2NvbXAoc2VsZik6CisgICAgICAgICMgRm9yIEd6aXAgYW5kIEJ6MiBUZXN0czogZmFpbCB3aXRoIGEgUmVhZEVycm9yIG9uIGFuIHVuY29tcHJlc3NlZCBmaWxlLgorICAgICAgICBpZiBzZWxmLm1vZGUgPT0gInI6IjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCB0YXJuYW1lLCBzZWxmLm1vZGUpCisgICAgICAgIGZvYmogPSBvcGVuKHRhcm5hbWUsICJyYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIGZpbGVvYmo9Zm9iaiwgbW9kZT1zZWxmLm1vZGUpCisKKyAgICBkZWYgdGVzdF92N19kaXJ0eXBlKHNlbGYpOgorICAgICAgICAjIFRlc3Qgb2xkIHN0eWxlIGRpcnR5cGUgbWVtYmVyIChidWcgIzEzMzY2MjMpOgorICAgICAgICAjIE9sZCBWNyB0YXJzIGNyZWF0ZSBkaXJlY3RvcnkgbWVtYmVycyB1c2luZyBhbiBBUkVHVFlQRQorICAgICAgICAjIGhlYWRlciB3aXRoIGEgIi8iIGFwcGVuZGVkIHRvIHRoZSBmaWxlbmFtZSBmaWVsZC4KKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigibWlzYy9kaXJ0eXBlLW9sZC12NyIpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXJpbmZvLnR5cGUgPT0gdGFyZmlsZS5ESVJUWVBFLAorICAgICAgICAgICAgICAgICJ2NyBkaXJ0eXBlIGZhaWxlZCIpCisKKyAgICBkZWYgdGVzdF9jaGVja19tZW1iZXJzKHNlbGYpOgorICAgICAgICBmb3IgdGFyaW5mbyBpbiBzZWxmLnRhcjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhpbnQodGFyaW5mby5tdGltZSkgPT0gMDc2MDYxMzY2MTcsCisgICAgICAgICAgICAgICAgICAgICJ3cm9uZyBtdGltZSBmb3IgJXMiICUgdGFyaW5mby5uYW1lKQorICAgICAgICAgICAgaWYgbm90IHRhcmluZm8ubmFtZS5zdGFydHN3aXRoKCJ1c3Rhci8iKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHRhcmluZm8udW5hbWUgPT0gInRhcmZpbGUiLAorICAgICAgICAgICAgICAgICAgICAid3JvbmcgdW5hbWUgZm9yICVzIiAlIHRhcmluZm8ubmFtZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfbWVtYmVycyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYudGFyLmdldG1lbWJlcnMoKVstMV0ubmFtZSA9PSAibWlzYy9lb2YiLAorICAgICAgICAgICAgICAgICJjb3VsZCBub3QgZmluZCBhbGwgbWVtYmVycyIpCisKKyAgICBkZWYgdGVzdF9leHRyYWN0X2hhcmRsaW5rKHNlbGYpOgorICAgICAgICAjIFRlc3QgaGFyZGxpbmsgZXh0cmFjdGlvbiAoZS5nLiBidWcgIzg1NzI5NykuCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0YXJuYW1lLCBlcnJvcmxldmVsPTEpCisKKyAgICAgICAgdGFyLmV4dHJhY3QoInVzdGFyL3JlZ3R5cGUiLCBURU1QRElSKQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICAjIFRlc3QgaWYgaXQgaXMgc3RpbGwgYSBkaXJlY3RvcnkgZW50cnkgd2hlbgotICAgICAgICAgICAgIyByZWFkIGJhY2suCi0gICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4oZmlsZW5hbWUpCi0gICAgICAgICAgICB0YXJpbmZvID0gdGFyLmdldG1lbWJlcnMoKVswXQotICAgICAgICAgICAgdGFyLmNsb3NlKCkKKyAgICAgICAgICAgIHRhci5leHRyYWN0KCJ1c3Rhci9sbmt0eXBlIiwgVEVNUERJUikKKyAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IsIGU6CisgICAgICAgICAgICBpZiBlLmVycm5vID09IGVycm5vLkVOT0VOVDoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImhhcmRsaW5rIG5vdCBleHRyYWN0ZWQgcHJvcGVybHkiKQogCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odGFyaW5mby50eXBlID09IHRhcmZpbGUuRElSVFlQRSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXJpbmZvLm5hbWUuZW5kc3dpdGgoIi8iKSkKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUpCi0gICAgICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAgICAgcGFzcworICAgICAgICBkYXRhID0gb3Blbihvcy5wYXRoLmpvaW4oVEVNUERJUiwgInVzdGFyL2xua3R5cGUiKSwgInJiIikucmVhZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWQ1c3VtKGRhdGEpLCBtZDVfcmVndHlwZSkKIAotY2xhc3MgUmVhZFN0cmVhbVRlc3QoUmVhZFRlc3QpOgotICAgIHNlcCA9ICJ8IgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0YXIuZXh0cmFjdCgidXN0YXIvc3ltdHlwZSIsIFRFTVBESVIpCisgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yLCBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FTk9FTlQ6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJzeW1saW5rIG5vdCBleHRyYWN0ZWQgcHJvcGVybHkiKQogCi0gICAgZGVmIHRlc3Qoc2VsZik6Ci0gICAgICAgICIiIlRlc3QgbWVtYmVyIGV4dHJhY3Rpb24sIGFuZCBmb3IgU3RyZWFtRXJyb3Igd2hlbgotICAgICAgICAgICBzZWVraW5nIGJhY2t3YXJkcy4KLSAgICAgICAgIiIiCi0gICAgICAgIFJlYWRUZXN0LnRlc3Qoc2VsZikKLSAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcnMoKVswXQotICAgICAgICBmID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbykKKyAgICAgICAgZGF0YSA9IG9wZW4ob3MucGF0aC5qb2luKFRFTVBESVIsICJ1c3Rhci9zeW10eXBlIiksICJyYiIpLnJlYWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1kNXN1bShkYXRhKSwgbWQ1X3JlZ3R5cGUpCisKKworY2xhc3MgU3RyZWFtUmVhZFRlc3QoUmVhZFRlc3QpOgorCisgICAgbW9kZT0icnwiCisKKyAgICBkZWYgdGVzdF9maWxlb2JqX3JlZ3VsYXJfZmlsZShzZWxmKToKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLm5leHQoKSAjIGdldCAicmVndHlwZSIgKGNhbid0IHVzZSBnZXRtZW1iZXIpCisgICAgICAgIGZvYmogPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvKQorICAgICAgICBkYXRhID0gZm9iai5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKChsZW4oZGF0YSksIG1kNXN1bShkYXRhKSkgPT0gKHRhcmluZm8uc2l6ZSwgbWQ1X3JlZ3R5cGUpLAorICAgICAgICAgICAgICAgICJyZWd1bGFyIGZpbGUgZXh0cmFjdGlvbiBmYWlsZWQiKQorCisgICAgZGVmIHRlc3RfcHJvdm9rZV9zdHJlYW1fZXJyb3Ioc2VsZik6CisgICAgICAgIHRhcmluZm9zID0gc2VsZi50YXIuZ2V0bWVtYmVycygpCisgICAgICAgIGYgPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvc1swXSkgIyByZWFkIHRoZSBmaXJzdCBtZW1iZXIKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5TdHJlYW1FcnJvciwgZi5yZWFkKQogCi0gICAgZGVmIHRlc3Rfc3RyZWFtKHNlbGYpOgotICAgICAgICAiIiJDb21wYXJlIHRoZSBub3JtYWwgdGFyIGFuZCB0aGUgc3RyZWFtIHRhci4KLSAgICAgICAgIiIiCi0gICAgICAgIHN0cmVhbSA9IHNlbGYudGFyCi0gICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0YXJuYW1lKCksICdyJykKKyAgICBkZWYgdGVzdF9jb21wYXJlX21lbWJlcnMoc2VsZik6CisgICAgICAgIHRhcjEgPSB0YXJmaWxlLm9wZW4odGFybmFtZSkKKyAgICAgICAgdGFyMiA9IHNlbGYudGFyCiAKLSAgICAgICAgd2hpbGUgMToKLSAgICAgICAgICAgIHQxID0gdGFyLm5leHQoKQotICAgICAgICAgICAgdDIgPSBzdHJlYW0ubmV4dCgpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0MSA9IHRhcjEubmV4dCgpCisgICAgICAgICAgICB0MiA9IHRhcjIubmV4dCgpCiAgICAgICAgICAgICBpZiB0MSBpcyBOb25lOgogICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICBzZWxmLmFzc2VydF8odDIgaXMgbm90IE5vbmUsICJzdHJlYW0ubmV4dCgpIGZhaWxlZC4iKQogCiAgICAgICAgICAgICBpZiB0Mi5pc2xuaygpIG9yIHQyLmlzc3ltKCk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5TdHJlYW1FcnJvciwgc3RyZWFtLmV4dHJhY3RmaWxlLCB0MikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlN0cmVhbUVycm9yLCB0YXIyLmV4dHJhY3RmaWxlLCB0MikKICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgdjEgPSB0YXIuZXh0cmFjdGZpbGUodDEpCi0gICAgICAgICAgICB2MiA9IHN0cmVhbS5leHRyYWN0ZmlsZSh0MikKKworICAgICAgICAgICAgdjEgPSB0YXIxLmV4dHJhY3RmaWxlKHQxKQorICAgICAgICAgICAgdjIgPSB0YXIyLmV4dHJhY3RmaWxlKHQyKQogICAgICAgICAgICAgaWYgdjEgaXMgTm9uZToKICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHYyIGlzIG5vdCBOb25lLCAic3RyZWFtLmV4dHJhY3RmaWxlKCkgZmFpbGVkIikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh2MS5yZWFkKCkgPT0gdjIucmVhZCgpLCAic3RyZWFtIGV4dHJhY3Rpb24gZmFpbGVkIikKIAotICAgICAgICB0YXIuY2xvc2UoKQotICAgICAgICBzdHJlYW0uY2xvc2UoKQotCi1jbGFzcyBSZWFkRGV0ZWN0VGVzdChSZWFkVGVzdCk6Ci0KLSAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIHNlbGYudGFyID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUoc2VsZi5jb21wKSwgc2VsZi5tb2RlKQotCi1jbGFzcyBSZWFkRGV0ZWN0RmlsZW9ialRlc3QoUmVhZFRlc3QpOgotCi0gICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBuYW1lID0gdGFybmFtZShzZWxmLmNvbXApCi0gICAgICAgIHNlbGYudGFyID0gdGFyZmlsZS5vcGVuKG5hbWUsIG1vZGU9c2VsZi5tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlb2JqPW9wZW4obmFtZSwgInJiIikpCi0KLWNsYXNzIFJlYWRBc3Rlcmlza1Rlc3QoUmVhZFRlc3QpOgotCi0gICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBtb2RlID0gc2VsZi5tb2RlICsgc2VsZi5zZXAgKyAiKiIKLSAgICAgICAgc2VsZi50YXIgPSB0YXJmaWxlLm9wZW4odGFybmFtZShzZWxmLmNvbXApLCBtb2RlKQotCi1jbGFzcyBSZWFkU3RyZWFtQXN0ZXJpc2tUZXN0KFJlYWRTdHJlYW1UZXN0KToKLQotICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgbW9kZSA9IHNlbGYubW9kZSArIHNlbGYuc2VwICsgIioiCi0gICAgICAgIHNlbGYudGFyID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUoc2VsZi5jb21wKSwgbW9kZSkKLQotY2xhc3MgV3JpdGVUZXN0KEJhc2VUZXN0KToKLSAgICBtb2RlID0gJ3cnCi0KLSAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIG1vZGUgPSBzZWxmLm1vZGUgKyBzZWxmLnNlcCArIHNlbGYuY29tcAotICAgICAgICBzZWxmLnNyYyA9IHRhcmZpbGUub3Blbih0YXJuYW1lKHNlbGYuY29tcCksICdyJykKLSAgICAgICAgc2VsZi5kc3RuYW1lID0gdG1wbmFtZSgpCi0gICAgICAgIHNlbGYuZHN0ID0gdGFyZmlsZS5vcGVuKHNlbGYuZHN0bmFtZSwgbW9kZSkKLQotICAgIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAgICAgc2VsZi5zcmMuY2xvc2UoKQotICAgICAgICBzZWxmLmRzdC5jbG9zZSgpCi0KLSAgICBkZWYgdGVzdF9wb3NpeChzZWxmKToKLSAgICAgICAgc2VsZi5kc3QucG9zaXggPSAxCi0gICAgICAgIHNlbGYuX3Rlc3QoKQotCi0gICAgZGVmIHRlc3Rfbm9ucG9zaXgoc2VsZik6Ci0gICAgICAgIHNlbGYuZHN0LnBvc2l4ID0gMAotICAgICAgICBzZWxmLl90ZXN0KCkKLQotICAgIGRlZiB0ZXN0X3NtYWxsKHNlbGYpOgotICAgICAgICBzZWxmLmRzdC5hZGQob3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksImNmZ3BhcnNlci4xIikpCi0gICAgICAgIHNlbGYuZHN0LmNsb3NlKCkKLSAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChvcy5zdGF0KHNlbGYuZHN0bmFtZSkuc3Rfc2l6ZSwgMCkKLQotICAgIGRlZiBfdGVzdChzZWxmKToKLSAgICAgICAgZm9yIHRhcmluZm8gaW4gc2VsZi5zcmM6Ci0gICAgICAgICAgICBpZiBub3QgdGFyaW5mby5pc3JlZygpOgotICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICBmID0gc2VsZi5zcmMuZXh0cmFjdGZpbGUodGFyaW5mbykKLSAgICAgICAgICAgIGlmIHNlbGYuZHN0LnBvc2l4IGFuZCBsZW4odGFyaW5mby5uYW1lKSA+IHRhcmZpbGUuTEVOR1RIX05BTUUgYW5kICIvIiBub3QgaW4gdGFyaW5mby5uYW1lOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuZHN0LmFkZGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJpbmZvLCBmKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLmRzdC5hZGRmaWxlKHRhcmluZm8sIGYpCi0KLSAgICBkZWYgdGVzdF9hZGRfc2VsZihzZWxmKToKLSAgICAgICAgZHN0bmFtZSA9IG9zLnBhdGguYWJzcGF0aChzZWxmLmRzdG5hbWUpCi0KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRzdC5uYW1lLCBkc3RuYW1lLCAiYXJjaGl2ZSBuYW1lIG11c3QgYmUgYWJzb2x1dGUiKQotCi0gICAgICAgIHNlbGYuZHN0LmFkZChkc3RuYW1lKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZHN0LmdldG5hbWVzKCksIFtdLCAiYWRkZWQgdGhlIGFyY2hpdmUgdG8gaXRzZWxmIikKLQotICAgICAgICBjd2QgPSBvcy5nZXRjd2QoKQotICAgICAgICBvcy5jaGRpcihkaXJuYW1lKCkpCi0gICAgICAgIHNlbGYuZHN0LmFkZChkc3RuYW1lKQotICAgICAgICBvcy5jaGRpcihjd2QpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kc3QuZ2V0bmFtZXMoKSwgW10sICJhZGRlZCB0aGUgYXJjaGl2ZSB0byBpdHNlbGYiKQorICAgICAgICB0YXIxLmNsb3NlKCkKIAogCi1jbGFzcyBBcHBlbmRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICAjIFRlc3QgYXBwZW5kIG1vZGUgKGNwLiBwYXRjaCAjMTY1MjY4MSkuCitjbGFzcyBEZXRlY3RSZWFkVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLSAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIHNlbGYudGFybmFtZSA9IHRtcG5hbWUoKQotICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLnRhcm5hbWUpOgotICAgICAgICAgICAgb3MucmVtb3ZlKHNlbGYudGFybmFtZSkKKyAgICBkZWYgX3Rlc3RmdW5jX2ZpbGUoc2VsZiwgbmFtZSwgbW9kZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRhcmZpbGUub3BlbihuYW1lLCBtb2RlKQorICAgICAgICBleGNlcHQgdGFyZmlsZS5SZWFkRXJyb3I6CisgICAgICAgICAgICBzZWxmLmZhaWwoKQogCi0gICAgZGVmIF9hZGRfdGVzdGZpbGUoc2VsZiwgZmlsZW9iaj1Ob25lKToKLSAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHNlbGYudGFybmFtZSwgImEiLCBmaWxlb2JqPWZpbGVvYmopCi0gICAgICAgIHRhci5hZGRmaWxlKHRhcmZpbGUuVGFySW5mbygiYmFyIikpCisgICAgZGVmIF90ZXN0ZnVuY19maWxlb2JqKHNlbGYsIG5hbWUsIG1vZGUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0YXJmaWxlLm9wZW4obmFtZSwgbW9kZSwgZmlsZW9iaj1vcGVuKG5hbWUsICJyYiIpKQorICAgICAgICBleGNlcHQgdGFyZmlsZS5SZWFkRXJyb3I6CisgICAgICAgICAgICBzZWxmLmZhaWwoKQorCisgICAgZGVmIF90ZXN0X21vZGVzKHNlbGYsIHRlc3RmdW5jKToKKyAgICAgICAgdGVzdGZ1bmModGFybmFtZSwgInIiKQorICAgICAgICB0ZXN0ZnVuYyh0YXJuYW1lLCAicjoiKQorICAgICAgICB0ZXN0ZnVuYyh0YXJuYW1lLCAicjoqIikKKyAgICAgICAgdGVzdGZ1bmModGFybmFtZSwgInJ8IikKKyAgICAgICAgdGVzdGZ1bmModGFybmFtZSwgInJ8KiIpCisKKyAgICAgICAgaWYgZ3ppcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIHRhcm5hbWUsIG1vZGU9InI6Z3oiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgdGFybmFtZSwgbW9kZT0icnxneiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCBnemlwbmFtZSwgbW9kZT0icjoiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgZ3ppcG5hbWUsIG1vZGU9InJ8IikKKworICAgICAgICAgICAgdGVzdGZ1bmMoZ3ppcG5hbWUsICJyIikKKyAgICAgICAgICAgIHRlc3RmdW5jKGd6aXBuYW1lLCAicjoqIikKKyAgICAgICAgICAgIHRlc3RmdW5jKGd6aXBuYW1lLCAicjpneiIpCisgICAgICAgICAgICB0ZXN0ZnVuYyhnemlwbmFtZSwgInJ8KiIpCisgICAgICAgICAgICB0ZXN0ZnVuYyhnemlwbmFtZSwgInJ8Z3oiKQorCisgICAgICAgIGlmIGJ6MjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIHRhcm5hbWUsIG1vZGU9InI6YnoyIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIHRhcm5hbWUsIG1vZGU9InJ8YnoyIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIGJ6Mm5hbWUsIG1vZGU9InI6IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIGJ6Mm5hbWUsIG1vZGU9InJ8IikKKworICAgICAgICAgICAgdGVzdGZ1bmMoYnoybmFtZSwgInIiKQorICAgICAgICAgICAgdGVzdGZ1bmMoYnoybmFtZSwgInI6KiIpCisgICAgICAgICAgICB0ZXN0ZnVuYyhiejJuYW1lLCAicjpiejIiKQorICAgICAgICAgICAgdGVzdGZ1bmMoYnoybmFtZSwgInJ8KiIpCisgICAgICAgICAgICB0ZXN0ZnVuYyhiejJuYW1lLCAicnxiejIiKQorCisgICAgZGVmIHRlc3RfZGV0ZWN0X2ZpbGUoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfbW9kZXMoc2VsZi5fdGVzdGZ1bmNfZmlsZSkKKworICAgIGRlZiB0ZXN0X2RldGVjdF9maWxlb2JqKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X21vZGVzKHNlbGYuX3Rlc3RmdW5jX2ZpbGVvYmopCisKKworY2xhc3MgTWVtYmVyUmVhZFRlc3QoUmVhZFRlc3QpOgorCisgICAgZGVmIF90ZXN0X21lbWJlcihzZWxmLCB0YXJpbmZvLCBjaGtzdW09Tm9uZSwgKiprd2FyZ3MpOgorICAgICAgICBpZiBjaGtzdW0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmFzc2VydF8obWQ1c3VtKHNlbGYudGFyLmV4dHJhY3RmaWxlKHRhcmluZm8pLnJlYWQoKSkgPT0gY2hrc3VtLAorICAgICAgICAgICAgICAgICAgICAid3JvbmcgbWQ1c3VtIGZvciAlcyIgJSB0YXJpbmZvLm5hbWUpCisKKyAgICAgICAga3dhcmdzWyJtdGltZSJdID0gMDc2MDYxMzY2MTcKKyAgICAgICAga3dhcmdzWyJ1aWQiXSA9IDEwMDAKKyAgICAgICAga3dhcmdzWyJnaWQiXSA9IDEwMAorICAgICAgICBpZiAib2xkLXY3IiBub3QgaW4gdGFyaW5mby5uYW1lOgorICAgICAgICAgICAgIyBWNyB0YXIgY2FuJ3QgaGFuZGxlIGFscGhhYmV0aWMgb3duZXJzLgorICAgICAgICAgICAga3dhcmdzWyJ1bmFtZSJdID0gInRhcmZpbGUiCisgICAgICAgICAgICBrd2FyZ3NbImduYW1lIl0gPSAidGFyZmlsZSIKKyAgICAgICAgZm9yIGssIHYgaW4ga3dhcmdzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGdldGF0dHIodGFyaW5mbywgaykgPT0gdiwKKyAgICAgICAgICAgICAgICAgICAgIndyb25nIHZhbHVlIGluICVzIGZpZWxkIG9mICVzIiAlIChrLCB0YXJpbmZvLm5hbWUpKQorCisgICAgZGVmIHRlc3RfZmluZF9yZWd0eXBlKHNlbGYpOgorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9yZWd0eXBlIikKKyAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT03MDExLCBjaGtzdW09bWQ1X3JlZ3R5cGUpCisKKyAgICBkZWYgdGVzdF9maW5kX2NvbnR0eXBlKHNlbGYpOgorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9jb250dHlwZSIpCisgICAgICAgIHNlbGYuX3Rlc3RfbWVtYmVyKHRhcmluZm8sIHNpemU9NzAxMSwgY2hrc3VtPW1kNV9yZWd0eXBlKQorCisgICAgZGVmIHRlc3RfZmluZF9kaXJ0eXBlKHNlbGYpOgorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9kaXJ0eXBlIikKKyAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT0wKQorCisgICAgZGVmIHRlc3RfZmluZF9kaXJ0eXBlX3dpdGhfc2l6ZShzZWxmKToKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvZGlydHlwZS13aXRoLXNpemUiKQorICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTI1NSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfbG5rdHlwZShzZWxmKToKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvbG5rdHlwZSIpCisgICAgICAgIHNlbGYuX3Rlc3RfbWVtYmVyKHRhcmluZm8sIHNpemU9MCwgbGlua25hbWU9InVzdGFyL3JlZ3R5cGUiKQorCisgICAgZGVmIHRlc3RfZmluZF9zeW10eXBlKHNlbGYpOgorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9zeW10eXBlIikKKyAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT0wLCBsaW5rbmFtZT0icmVndHlwZSIpCisKKyAgICBkZWYgdGVzdF9maW5kX2Jsa3R5cGUoc2VsZik6CisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL2Jsa3R5cGUiKQorICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTAsIGRldm1ham9yPTMsIGRldm1pbm9yPTApCisKKyAgICBkZWYgdGVzdF9maW5kX2NocnR5cGUoc2VsZik6CisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL2NocnR5cGUiKQorICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTAsIGRldm1ham9yPTEsIGRldm1pbm9yPTMpCisKKyAgICBkZWYgdGVzdF9maW5kX2ZpZm90eXBlKHNlbGYpOgorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9maWZvdHlwZSIpCisgICAgICAgIHNlbGYuX3Rlc3RfbWVtYmVyKHRhcmluZm8sIHNpemU9MCkKKworICAgIGRlZiB0ZXN0X2ZpbmRfc3BhcnNlKHNlbGYpOgorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9zcGFyc2UiKQorICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTg2MDE2LCBjaGtzdW09bWQ1X3NwYXJzZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfdW1sYXV0cyhzZWxmKToKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvdW1sYXV0cy3E1tzk9vzfIikKKyAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT03MDExLCBjaGtzdW09bWQ1X3JlZ3R5cGUpCisKKyAgICBkZWYgdGVzdF9maW5kX3VzdGFyX2xvbmduYW1lKHNlbGYpOgorICAgICAgICBuYW1lID0gInVzdGFyLyIgKyAiMTIzNDUvIiAqIDM5ICsgIjEyMzQ1NjcvbG9uZ25hbWUiCisgICAgICAgIHNlbGYuYXNzZXJ0XyhuYW1lIGluIHNlbGYudGFyLmdldG5hbWVzKCkpCisKKyAgICBkZWYgdGVzdF9maW5kX3JlZ3R5cGVfb2xkdjcoc2VsZik6CisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoIm1pc2MvcmVndHlwZS1vbGQtdjciKQorICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTcwMTEsIGNoa3N1bT1tZDVfcmVndHlwZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfcGF4X3VtbGF1dHMoc2VsZik6CisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInBheC91bWxhdXRzLcTW3OT2/N8iKQorICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTcwMTEsIGNoa3N1bT1tZDVfcmVndHlwZSkKKworCitjbGFzcyBMb25nbmFtZVRlc3QoUmVhZFRlc3QpOgorCisgICAgZGVmIHRlc3RfcmVhZF9sb25nbmFtZShzZWxmKToKKyAgICAgICAgIyBUZXN0IHJlYWRpbmcgb2YgbG9uZ25hbWUgKGJ1ZyAjMTQ3MTQyNykuCisgICAgICAgIG5hbWUgPSBzZWxmLnN1YmRpciArICIvIiArICIxMjMvIiAqIDEyNSArICJsb25nbmFtZSIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcihuYW1lKQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBzZWxmLmZhaWwoImxvbmduYW1lIG5vdCBmb3VuZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXJpbmZvLnR5cGUgIT0gdGFyZmlsZS5ESVJUWVBFLCAicmVhZCBsb25nbmFtZSBhcyBkaXJ0eXBlIikKKworICAgIGRlZiB0ZXN0X3JlYWRfbG9uZ2xpbmsoc2VsZik6CisgICAgICAgIGxvbmduYW1lID0gc2VsZi5zdWJkaXIgKyAiLyIgKyAiMTIzLyIgKiAxMjUgKyAibG9uZ25hbWUiCisgICAgICAgIGxvbmdsaW5rID0gc2VsZi5zdWJkaXIgKyAiLyIgKyAiMTIzLyIgKiAxMjUgKyAibG9uZ2xpbmsiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIobG9uZ2xpbmspCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgibG9uZ2xpbmsgbm90IGZvdW5kIikKKyAgICAgICAgc2VsZi5hc3NlcnRfKHRhcmluZm8ubGlua25hbWUgPT0gbG9uZ25hbWUsICJsaW5rbmFtZSB3cm9uZyIpCisKKyAgICBkZWYgdGVzdF90cnVuY2F0ZWRfbG9uZ25hbWUoc2VsZik6CisgICAgICAgIGxvbmduYW1lID0gc2VsZi5zdWJkaXIgKyAiLyIgKyAiMTIzLyIgKiAxMjUgKyAibG9uZ25hbWUiCisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIobG9uZ25hbWUpCisgICAgICAgIG9mZnNldCA9IHRhcmluZm8ub2Zmc2V0CisgICAgICAgIHNlbGYudGFyLmZpbGVvYmouc2VlayhvZmZzZXQpCisgICAgICAgIGZvYmogPSBTdHJpbmdJTy5TdHJpbmdJTyhzZWxmLnRhci5maWxlb2JqLnJlYWQoMTUzNikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIG5hbWU9ImZvby50YXIiLCBmaWxlb2JqPWZvYmopCisKKworY2xhc3MgR05VUmVhZFRlc3QoTG9uZ25hbWVUZXN0KToKKworICAgIHN1YmRpciA9ICJnbnUiCisKKyAgICBkZWYgdGVzdF9zcGFyc2VfZmlsZShzZWxmKToKKyAgICAgICAgdGFyaW5mbzEgPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL3NwYXJzZSIpCisgICAgICAgIGZvYmoxID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbzEpCisgICAgICAgIHRhcmluZm8yID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJnbnUvc3BhcnNlIikKKyAgICAgICAgZm9iajIgPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvMikKKyAgICAgICAgc2VsZi5hc3NlcnRfKGZvYmoxLnJlYWQoKSA9PSBmb2JqMi5yZWFkKCksCisgICAgICAgICAgICAgICAgInNwYXJzZSBmaWxlIGV4dHJhY3Rpb24gZmFpbGVkIikKKworCitjbGFzcyBQYXhSZWFkVGVzdChSZWFkVGVzdCk6CisKKyAgICBzdWJkaXIgPSAicGF4IgorCisgICAgZGVmIHRlc3RfcGF4X2dsb2JoZWFkZXJzKHNlbGYpOgorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odGFybmFtZSkKKyAgICAgICAgdGFyaW5mbyA9IHRhci5nZXRtZW1iZXIoInBheC9yZWd0eXBlMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby51bmFtZSwgImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5nbmFtZSwgImJhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5wYXhfaGVhZGVycy5nZXQoIlZFTkRPUi51bWxhdXRzIiksICLE1tzk9vzfIikKKworICAgICAgICB0YXJpbmZvID0gdGFyLmdldG1lbWJlcigicGF4L3JlZ3R5cGUyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnVuYW1lLCAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLmduYW1lLCAiYmFyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnBheF9oZWFkZXJzLmdldCgiVkVORE9SLnVtbGF1dHMiKSwgIsTW3OT2/N8iKQorCisgICAgICAgIHRhcmluZm8gPSB0YXIuZ2V0bWVtYmVyKCJwYXgvcmVndHlwZTMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8udW5hbWUsICJ0YXJmaWxlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLmduYW1lLCAidGFyZmlsZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5wYXhfaGVhZGVycy5nZXQoIlZFTkRPUi51bWxhdXRzIiksICLE1tzk9vzfIikKKworCitjbGFzcyBXcml0ZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgbW9kZSA9ICJ3OiIKKworICAgIGRlZiB0ZXN0XzEwMF9jaGFyX25hbWUoc2VsZik6CisgICAgICAgICMgVGhlIG5hbWUgZmllbGQgaW4gYSB0YXIgaGVhZGVyIHN0b3JlcyBzdHJpbmdzIG9mIGF0IG1vc3QgMTAwIGNoYXJzLgorICAgICAgICAjIElmIGEgc3RyaW5nIGlzIHNob3J0ZXIgdGhhbiAxMDAgY2hhcnMgaXQgaGFzIHRvIGJlIHBhZGRlZCB3aXRoICdcMCcsCisgICAgICAgICMgd2hpY2ggaW1wbGllcyB0aGF0IGEgc3RyaW5nIG9mIGV4YWN0bHkgMTAwIGNoYXJzIGlzIHN0b3JlZCB3aXRob3V0CisgICAgICAgICMgYSB0cmFpbGluZyAnXDAnLgorICAgICAgICBuYW1lID0gIjAxMjM0NTY3ODkiICogMTAKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZSkKKyAgICAgICAgdCA9IHRhcmZpbGUuVGFySW5mbyhuYW1lKQorICAgICAgICB0YXIuYWRkZmlsZSh0KQogICAgICAgICB0YXIuY2xvc2UoKQogCi0gICAgZGVmIF9jcmVhdGVfdGVzdHRhcihzZWxmKToKLSAgICAgICAgc3JjID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUoKSkKLSAgICAgICAgdCA9IHNyYy5nZXRtZW1iZXIoIjAtUkVHVFlQRSIpCi0gICAgICAgIHQubmFtZSA9ICJmb28iCi0gICAgICAgIGYgPSBzcmMuZXh0cmFjdGZpbGUodCkKLSAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHNlbGYudGFybmFtZSwgInciKQotICAgICAgICB0YXIuYWRkZmlsZSh0LCBmKQotICAgICAgICB0YXIuY2xvc2UoKQotCi0gICAgZGVmIF90ZXN0KHNlbGYsIG5hbWVzPVsiYmFyIl0sIGZpbGVvYmo9Tm9uZSk6Ci0gICAgICAgIHRhciA9IHRhcmZpbGUub3BlbihzZWxmLnRhcm5hbWUsIGZpbGVvYmo9ZmlsZW9iaikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHRhci5nZXRuYW1lcygpID09IG5hbWVzKQotCi0gICAgZGVmIHRlc3Rfbm9uX2V4aXN0aW5nKHNlbGYpOgotICAgICAgICBzZWxmLl9hZGRfdGVzdGZpbGUoKQotICAgICAgICBzZWxmLl90ZXN0KCkKLQotICAgIGRlZiB0ZXN0X2VtcHR5KHNlbGYpOgotICAgICAgICBvcGVuKHNlbGYudGFybmFtZSwgIndiIikuY2xvc2UoKQotICAgICAgICBzZWxmLl9hZGRfdGVzdGZpbGUoKQotICAgICAgICBzZWxmLl90ZXN0KCkKLQotICAgIGRlZiB0ZXN0X2VtcHR5X2ZpbGVvYmooc2VsZik6Ci0gICAgICAgIGZvYmogPSBTdHJpbmdJTy5TdHJpbmdJTygpCi0gICAgICAgIHNlbGYuX2FkZF90ZXN0ZmlsZShmb2JqKQotICAgICAgICBmb2JqLnNlZWsoMCkKLSAgICAgICAgc2VsZi5fdGVzdChmaWxlb2JqPWZvYmopCi0KLSAgICBkZWYgdGVzdF9maWxlb2JqKHNlbGYpOgotICAgICAgICBzZWxmLl9jcmVhdGVfdGVzdHRhcigpCi0gICAgICAgIGRhdGEgPSBvcGVuKHNlbGYudGFybmFtZSwgInJiIikucmVhZCgpCi0gICAgICAgIGZvYmogPSBTdHJpbmdJTy5TdHJpbmdJTyhkYXRhKQotICAgICAgICBzZWxmLl9hZGRfdGVzdGZpbGUoZm9iaikKLSAgICAgICAgZm9iai5zZWVrKDApCi0gICAgICAgIHNlbGYuX3Rlc3QobmFtZXM9WyJmb28iLCAiYmFyIl0sIGZpbGVvYmo9Zm9iaikKLQotICAgIGRlZiB0ZXN0X2V4aXN0aW5nKHNlbGYpOgotICAgICAgICBzZWxmLl9jcmVhdGVfdGVzdHRhcigpCi0gICAgICAgIHNlbGYuX2FkZF90ZXN0ZmlsZSgpCi0gICAgICAgIHNlbGYuX3Rlc3QobmFtZXM9WyJmb28iLCAiYmFyIl0pCi0KLQotY2xhc3MgV3JpdGUxMDBUZXN0KEJhc2VUZXN0KToKLSAgICAjIFRoZSBuYW1lIGZpZWxkIGluIGEgdGFyIGhlYWRlciBzdG9yZXMgc3RyaW5ncyBvZiBhdCBtb3N0IDEwMCBjaGFycy4KLSAgICAjIElmIGEgc3RyaW5nIGlzIHNob3J0ZXIgdGhhbiAxMDAgY2hhcnMgaXQgaGFzIHRvIGJlIHBhZGRlZCB3aXRoICdcMCcsCi0gICAgIyB3aGljaCBpbXBsaWVzIHRoYXQgYSBzdHJpbmcgb2YgZXhhY3RseSAxMDAgY2hhcnMgaXMgc3RvcmVkIHdpdGhvdXQKLSAgICAjIGEgdHJhaWxpbmcgJ1wwJy4KLQotICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgc2VsZi5uYW1lID0gIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IgotICAgICAgICBzZWxmLm5hbWUgKz0gIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IgotCi0gICAgICAgIHNlbGYudGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUoKSwgInciKQotICAgICAgICB0ID0gdGFyZmlsZS5UYXJJbmZvKHNlbGYubmFtZSkKLSAgICAgICAgc2VsZi50YXIuYWRkZmlsZSh0KQotICAgICAgICBzZWxmLnRhci5jbG9zZSgpCi0KLSAgICAgICAgc2VsZi50YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSgpKQotCi0gICAgZGVmIHRlYXJEb3duKHNlbGYpOgotICAgICAgICBzZWxmLnRhci5jbG9zZSgpCi0KLSAgICBkZWYgdGVzdChzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRhci5nZXRuYW1lcygpWzBdLCBzZWxmLm5hbWUsCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lKQorICAgICAgICBzZWxmLmFzc2VydF8odGFyLmdldG5hbWVzKClbMF0gPT0gbmFtZSwKICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIHN0b3JlIDEwMCBjaGFyIGZpbGVuYW1lIikKKyAgICAgICAgdGFyLmNsb3NlKCkKIAorICAgIGRlZiB0ZXN0X3Rhcl9zaXplKHNlbGYpOgorICAgICAgICAjIFRlc3QgZm9yIGJ1ZyAjMTAxMzg4Mi4KKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZSkKKyAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihURU1QRElSLCAiZmlsZSIpCisgICAgICAgIGZvYmogPSBvcGVuKHBhdGgsICJ3YiIpCisgICAgICAgIGZvYmoud3JpdGUoImFhYSIpCisgICAgICAgIGZvYmouY2xvc2UoKQorICAgICAgICB0YXIuYWRkKHBhdGgpCisgICAgICAgIHRhci5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmdldHNpemUodG1wbmFtZSkgPiAwLAorICAgICAgICAgICAgICAgICJ0YXJmaWxlIGlzIGVtcHR5IikKIAotY2xhc3MgV3JpdGVTaXplMFRlc3QoQmFzZVRlc3QpOgotICAgIG1vZGUgPSAndycKKyAgICAjIFRoZSB0ZXN0Xypfc2l6ZSB0ZXN0cyB0ZXN0IGZvciBidWcgIzExNjcxMjguCisgICAgZGVmIHRlc3RfZmlsZV9zaXplKHNlbGYpOgorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgc2VsZi5tb2RlKQogCi0gICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBzZWxmLnRtcGRpciA9IGRpcm5hbWUoKQotICAgICAgICBzZWxmLmRzdG5hbWUgPSB0bXBuYW1lKCkKLSAgICAgICAgc2VsZi5kc3QgPSB0YXJmaWxlLm9wZW4oc2VsZi5kc3RuYW1lLCAidyIpCi0KLSAgICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgICAgIHNlbGYuZHN0LmNsb3NlKCkKLQotICAgIGRlZiB0ZXN0X2ZpbGUoc2VsZik6Ci0gICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi50bXBkaXIsICJmaWxlIikKLSAgICAgICAgZiA9IG9wZW4ocGF0aCwgInciKQotICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgdGFyaW5mbyA9IHNlbGYuZHN0LmdldHRhcmluZm8ocGF0aCkKKyAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihURU1QRElSLCAiZmlsZSIpCisgICAgICAgIGZvYmogPSBvcGVuKHBhdGgsICJ3YiIpCisgICAgICAgIGZvYmouY2xvc2UoKQorICAgICAgICB0YXJpbmZvID0gdGFyLmdldHRhcmluZm8ocGF0aCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnNpemUsIDApCi0gICAgICAgIGYgPSBvcGVuKHBhdGgsICJ3IikKLSAgICAgICAgZi53cml0ZSgiYWFhIikKLSAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgIHRhcmluZm8gPSBzZWxmLmRzdC5nZXR0YXJpbmZvKHBhdGgpCisKKyAgICAgICAgZm9iaiA9IG9wZW4ocGF0aCwgIndiIikKKyAgICAgICAgZm9iai53cml0ZSgiYWFhIikKKyAgICAgICAgZm9iai5jbG9zZSgpCisgICAgICAgIHRhcmluZm8gPSB0YXIuZ2V0dGFyaW5mbyhwYXRoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8uc2l6ZSwgMykKIAotICAgIGRlZiB0ZXN0X2RpcmVjdG9yeShzZWxmKToKLSAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnRtcGRpciwgImRpcmVjdG9yeSIpCi0gICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgotICAgICAgICAgICAgIyBUaGlzIHNob3VsZG4ndCBiZSBuZWNlc3NhcnksIGJ1dCBpcyA8d2luaz4gaWYgYSBwcmV2aW91cwotICAgICAgICAgICAgIyBydW4gd2FzIGtpbGxlZCBpbiBtaWQtc3RyZWFtLgotICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShwYXRoKQorICAgICAgICB0YXIuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfZGlyZWN0b3J5X3NpemUoc2VsZik6CisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgImRpcmVjdG9yeSIpCiAgICAgICAgIG9zLm1rZGlyKHBhdGgpCi0gICAgICAgIHRhcmluZm8gPSBzZWxmLmRzdC5nZXR0YXJpbmZvKHBhdGgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5zaXplLCAwKQotCi0gICAgZGVmIHRlc3Rfc3ltbGluayhzZWxmKToKLSAgICAgICAgaWYgaGFzYXR0cihvcywgInN5bWxpbmsiKToKLSAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi50bXBkaXIsICJzeW1saW5rIikKLSAgICAgICAgICAgIG9zLnN5bWxpbmsoImxpbmtfdGFyZ2V0IiwgcGF0aCkKLSAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLmRzdC5nZXR0YXJpbmZvKHBhdGgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpCisgICAgICAgICAgICB0YXJpbmZvID0gdGFyLmdldHRhcmluZm8ocGF0aCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5zaXplLCAwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3Mucm1kaXIocGF0aCkKKworICAgIGRlZiB0ZXN0X2xpbmtfc2l6ZShzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihvcywgImxpbmsiKToKKyAgICAgICAgICAgIGxpbmsgPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgImxpbmsiKQorICAgICAgICAgICAgdGFyZ2V0ID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJsaW5rX3RhcmdldCIpCisgICAgICAgICAgICBvcGVuKHRhcmdldCwgIndiIikuY2xvc2UoKQorICAgICAgICAgICAgb3MubGluayh0YXJnZXQsIGxpbmspCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZSkKKyAgICAgICAgICAgICAgICB0YXJpbmZvID0gdGFyLmdldHRhcmluZm8obGluaykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8uc2l6ZSwgMCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHRhcmdldCkKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUobGluaykKKworICAgIGRlZiB0ZXN0X3N5bWxpbmtfc2l6ZShzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihvcywgInN5bWxpbmsiKToKKyAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgInN5bWxpbmsiKQorICAgICAgICAgICAgb3Muc3ltbGluaygibGlua190YXJnZXQiLCBwYXRoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpCisgICAgICAgICAgICAgICAgdGFyaW5mbyA9IHRhci5nZXR0YXJpbmZvKHBhdGgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnNpemUsIDApCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIG9zLnJlbW92ZShwYXRoKQorCisgICAgZGVmIHRlc3RfYWRkX3NlbGYoc2VsZik6CisgICAgICAgICMgVGVzdCBmb3IgIzEyNTcyNTUuCisgICAgICAgIGRzdG5hbWUgPSBvcy5wYXRoLmFic3BhdGgodG1wbmFtZSkKKworICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgc2VsZi5tb2RlKQorICAgICAgICBzZWxmLmFzc2VydF8odGFyLm5hbWUgPT0gZHN0bmFtZSwgImFyY2hpdmUgbmFtZSBtdXN0IGJlIGFic29sdXRlIikKKworICAgICAgICB0YXIuYWRkKGRzdG5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXIuZ2V0bmFtZXMoKSA9PSBbXSwgImFkZGVkIHRoZSBhcmNoaXZlIHRvIGl0c2VsZiIpCisKKyAgICAgICAgY3dkID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgb3MuY2hkaXIoVEVNUERJUikKKyAgICAgICAgdGFyLmFkZChkc3RuYW1lKQorICAgICAgICBvcy5jaGRpcihjd2QpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXIuZ2V0bmFtZXMoKSA9PSBbXSwgImFkZGVkIHRoZSBhcmNoaXZlIHRvIGl0c2VsZiIpCiAKIAotY2xhc3MgV3JpdGVTdHJlYW1UZXN0KFdyaXRlVGVzdCk6Ci0gICAgc2VwID0gJ3wnCitjbGFzcyBTdHJlYW1Xcml0ZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCi0gICAgZGVmIHRlc3RfcGFkZGluZyhzZWxmKToKLSAgICAgICAgc2VsZi5kc3QuY2xvc2UoKQorICAgIG1vZGUgPSAid3wiCiAKLSAgICAgICAgaWYgc2VsZi5jb21wID09ICJneiI6Ci0gICAgICAgICAgICBmID0gZ3ppcC5HemlwRmlsZShzZWxmLmRzdG5hbWUpCi0gICAgICAgICAgICBzID0gZi5yZWFkKCkKLSAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICBlbGlmIHNlbGYuY29tcCA9PSAiYnoyIjoKLSAgICAgICAgICAgIGYgPSBiejIuQloyRGVjb21wcmVzc29yKCkKLSAgICAgICAgICAgIHMgPSBmaWxlKHNlbGYuZHN0bmFtZSkucmVhZCgpCi0gICAgICAgICAgICBzID0gZi5kZWNvbXByZXNzKHMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihmLnVudXNlZF9kYXRhKSwgMCwgInRyYWlsaW5nIGRhdGEiKQorICAgIGRlZiB0ZXN0X3N0cmVhbV9wYWRkaW5nKHNlbGYpOgorICAgICAgICAjIFRlc3QgZm9yIGJ1ZyAjMTU0MzMwMy4KKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZSkKKyAgICAgICAgdGFyLmNsb3NlKCkKKworICAgICAgICBpZiBzZWxmLm1vZGUuZW5kc3dpdGgoImd6Iik6CisgICAgICAgICAgICBmb2JqID0gZ3ppcC5HemlwRmlsZSh0bXBuYW1lKQorICAgICAgICAgICAgZGF0YSA9IGZvYmoucmVhZCgpCisgICAgICAgICAgICBmb2JqLmNsb3NlKCkKKyAgICAgICAgZWxpZiBzZWxmLm1vZGUuZW5kc3dpdGgoImJ6MiIpOgorICAgICAgICAgICAgZGVjID0gYnoyLkJaMkRlY29tcHJlc3NvcigpCisgICAgICAgICAgICBkYXRhID0gb3Blbih0bXBuYW1lLCAicmIiKS5yZWFkKCkKKyAgICAgICAgICAgIGRhdGEgPSBkZWMuZGVjb21wcmVzcyhkYXRhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihkZWMudW51c2VkX2RhdGEpID09IDAsCisgICAgICAgICAgICAgICAgICAgICJmb3VuZCB0cmFpbGluZyBkYXRhIikKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGYgPSBmaWxlKHNlbGYuZHN0bmFtZSkKLSAgICAgICAgICAgIHMgPSBmLnJlYWQoKQotICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBmb2JqID0gb3Blbih0bXBuYW1lLCAicmIiKQorICAgICAgICAgICAgZGF0YSA9IGZvYmoucmVhZCgpCisgICAgICAgICAgICBmb2JqLmNsb3NlKCkKIAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuY291bnQoIlwwIiksIHRhcmZpbGUuUkVDT1JEU0laRSwKKyAgICAgICAgc2VsZi5hc3NlcnRfKGRhdGEuY291bnQoIlwwIikgPT0gdGFyZmlsZS5SRUNPUkRTSVpFLAogICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNvcnJlY3QgemVybyBwYWRkaW5nIikKIAogCi1jbGFzcyBXcml0ZUdOVUxvbmdUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICAiIiJUaGlzIHRlc3RjYXNlIGNoZWNrcyBmb3IgY29ycmVjdCBjcmVhdGlvbiBvZiBHTlUgTG9uZ25hbWUKLSAgICAgICBhbmQgTG9uZ2xpbmsgZXh0ZW5zaW9ucy4KLQotICAgICAgIEl0IGNyZWF0ZXMgYSB0YXJmaWxlIGFuZCBhZGRzIGVtcHR5IG1lbWJlcnMgd2l0aCBlaXRoZXIKLSAgICAgICBsb25nIG5hbWVzLCBsb25nIGxpbmtuYW1lcyBvciBib3RoIGFuZCBjb21wYXJlcyB0aGUgc2l6ZQotICAgICAgIG9mIHRoZSB0YXJmaWxlIHdpdGggdGhlIGV4cGVjdGVkIHNpemUuCi0KLSAgICAgICBJdCBjaGVja3MgZm9yIFNGIGJ1ZyAjODEyMzI1IGluIFRhckZpbGUuX2NyZWF0ZV9nbnVsb25nKCkuCi0KLSAgICAgICBXaGlsZSBJIHdhcyB3cml0aW5nIHRoaXMgdGVzdGNhc2UsIEkgbm90aWNlZCBhIHNlY29uZCBidWcKLSAgICAgICBpbiB0aGUgc2FtZSBtZXRob2Q6Ci0gICAgICAgTG9uZ3tuYW1lcyxsaW5rc30gd2VyZW4ndCBudWxsLXRlcm1pbmF0ZWQgd2hpY2ggbGVhZCB0bwotICAgICAgIGJhZCB0YXJmaWxlcyB3aGVuIHRoZWlyIGxlbmd0aCB3YXMgYSBtdWx0aXBsZSBvZiA1MTIuIFRoaXMKLSAgICAgICBpcyB0ZXN0ZWQgYXMgd2VsbC4KLSAgICAiIiIKK2NsYXNzIEdOVVdyaXRlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBUaGlzIHRlc3RjYXNlIGNoZWNrcyBmb3IgY29ycmVjdCBjcmVhdGlvbiBvZiBHTlUgTG9uZ25hbWUKKyAgICAjIGFuZCBMb25nbGluayBleHRlbmRlZCBoZWFkZXJzIChjcC4gYnVnICM4MTIzMjUpLgogCiAgICAgZGVmIF9sZW5ndGgoc2VsZiwgcyk6CiAgICAgICAgIGJsb2NrcywgcmVtYWluZGVyID0gZGl2bW9kKGxlbihzKSArIDEsIDUxMikKQEAgLTQ3NCwxOSArNTcyLDE3IEBACiAgICAgICAgIHJldHVybiBibG9ja3MgKiA1MTIKIAogICAgIGRlZiBfY2FsY19zaXplKHNlbGYsIG5hbWUsIGxpbms9Tm9uZSk6Ci0gICAgICAgICMgaW5pdGlhbCB0YXIgaGVhZGVyCisgICAgICAgICMgSW5pdGlhbCB0YXIgaGVhZGVyCiAgICAgICAgIGNvdW50ID0gNTEyCiAKICAgICAgICAgaWYgbGVuKG5hbWUpID4gdGFyZmlsZS5MRU5HVEhfTkFNRToKLSAgICAgICAgICAgICMgZ251IGxvbmduYW1lIGV4dGVuZGVkIGhlYWRlciArIGxvbmduYW1lCisgICAgICAgICAgICAjIEdOVSBsb25nbmFtZSBleHRlbmRlZCBoZWFkZXIgKyBsb25nbmFtZQogICAgICAgICAgICAgY291bnQgKz0gNTEyCiAgICAgICAgICAgICBjb3VudCArPSBzZWxmLl9sZW5ndGgobmFtZSkKLQogICAgICAgICBpZiBsaW5rIGlzIG5vdCBOb25lIGFuZCBsZW4obGluaykgPiB0YXJmaWxlLkxFTkdUSF9MSU5LOgotICAgICAgICAgICAgIyBnbnUgbG9uZ2xpbmsgZXh0ZW5kZWQgaGVhZGVyICsgbG9uZ2xpbmsKKyAgICAgICAgICAgICMgR05VIGxvbmdsaW5rIGV4dGVuZGVkIGhlYWRlciArIGxvbmdsaW5rCiAgICAgICAgICAgICBjb3VudCArPSA1MTIKICAgICAgICAgICAgIGNvdW50ICs9IHNlbGYuX2xlbmd0aChsaW5rKQotCiAgICAgICAgIHJldHVybiBjb3VudAogCiAgICAgZGVmIF90ZXN0KHNlbGYsIG5hbWUsIGxpbms9Tm9uZSk6CkBAIC00OTUsMTcgKzU5MSwxNyBAQAogICAgICAgICAgICAgdGFyaW5mby5saW5rbmFtZSA9IGxpbmsKICAgICAgICAgICAgIHRhcmluZm8udHlwZSA9IHRhcmZpbGUuTE5LVFlQRQogCi0gICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lKCksICJ3IikKLSAgICAgICAgdGFyLnBvc2l4ID0gRmFsc2UKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IikKKyAgICAgICAgdGFyLmZvcm1hdCA9IHRhcmZpbGUuR05VX0ZPUk1BVAogICAgICAgICB0YXIuYWRkZmlsZSh0YXJpbmZvKQogCiAgICAgICAgIHYxID0gc2VsZi5fY2FsY19zaXplKG5hbWUsIGxpbmspCiAgICAgICAgIHYyID0gdGFyLm9mZnNldAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYxLCB2MiwgIkdOVSBsb25nbmFtZS9sb25nbGluayBjcmVhdGlvbiBmYWlsZWQiKQorICAgICAgICBzZWxmLmFzc2VydF8odjEgPT0gdjIsICJHTlUgbG9uZ25hbWUvbG9uZ2xpbmsgY3JlYXRpb24gZmFpbGVkIikKIAogICAgICAgICB0YXIuY2xvc2UoKQogCi0gICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lKCkpCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lKQogICAgICAgICBtZW1iZXIgPSB0YXIubmV4dCgpCiAgICAgICAgIHNlbGYuZmFpbElmKG1lbWJlciBpcyBOb25lLCAidW5hYmxlIHRvIHJlYWQgbG9uZ25hbWUgbWVtYmVyIikKICAgICAgICAgc2VsZi5hc3NlcnRfKHRhcmluZm8ubmFtZSA9PSBtZW1iZXIubmFtZSBhbmQgXApAQCAtNTQyLDI2OCArNjM4LDM1MiBAQAogICAgICAgICBzZWxmLl90ZXN0KCgibG9uZ25hbS8iICogMTI3KSArICJsb25nbmFtZV8iLAogICAgICAgICAgICAgICAgICAgICgibG9uZ2xuay8iICogMTI3KSArICJsb25nbGlua18iKQogCi1jbGFzcyBSZWFkR05VTG9uZ1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCitjbGFzcyBIYXJkbGlua1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgVGVzdCB0aGUgY3JlYXRpb24gb2YgTE5LVFlQRSAoaGFyZGxpbmspIG1lbWJlcnMgaW4gYW4gYXJjaGl2ZS4KIAogICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgc2VsZi50YXIgPSB0YXJmaWxlLm9wZW4odGFybmFtZSgpKQorICAgICAgICBzZWxmLmZvbyA9IG9zLnBhdGguam9pbihURU1QRElSLCAiZm9vIikKKyAgICAgICAgc2VsZi5iYXIgPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgImJhciIpCiAKLSAgICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgICAgIHNlbGYudGFyLmNsb3NlKCkKKyAgICAgICAgZm9iaiA9IG9wZW4oc2VsZi5mb28sICJ3YiIpCisgICAgICAgIGZvYmoud3JpdGUoImZvbyIpCisgICAgICAgIGZvYmouY2xvc2UoKQogCi0gICAgZGVmIHRlc3RfMTQ3MTQyNyhzZWxmKToKLSAgICAgICAgIiIiVGVzdCByZWFkaW5nIG9mIGxvbmduYW1lIChidWcgIzE0NzE0MjcpLgotICAgICAgICAiIiIKLSAgICAgICAgbmFtZSA9ICJ0ZXN0LyIgKiAyMCArICIwLVJFR1RZUEUiCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIobmFtZSkKLSAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgdGFyaW5mbyA9IE5vbmUKLSAgICAgICAgc2VsZi5hc3NlcnRfKHRhcmluZm8gaXMgbm90IE5vbmUsICJsb25nbmFtZSBub3QgZm91bmQiKQotICAgICAgICBzZWxmLmFzc2VydF8odGFyaW5mby50eXBlICE9IHRhcmZpbGUuRElSVFlQRSwgInJlYWQgbG9uZ25hbWUgYXMgZGlydHlwZSIpCisgICAgICAgIG9zLmxpbmsoc2VsZi5mb28sIHNlbGYuYmFyKQogCi0gICAgZGVmIHRlc3RfcmVhZF9uYW1lKHNlbGYpOgotICAgICAgICBuYW1lID0gKCIwLUxPTkdOQU1FLSIgKiAxMClbOjEwMV0KLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcihuYW1lKQotICAgICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgICAgICB0YXJpbmZvID0gTm9uZQotICAgICAgICBzZWxmLmFzc2VydF8odGFyaW5mbyBpcyBub3QgTm9uZSwgImxvbmduYW1lIG5vdCBmb3VuZCIpCi0KLSAgICBkZWYgdGVzdF9yZWFkX2xpbmsoc2VsZik6Ci0gICAgICAgIGxpbmsgPSAoIjEtTE9OR0xJTkstIiAqIDEwKVs6MTAxXQotICAgICAgICBuYW1lID0gKCIwLUxPTkdOQU1FLSIgKiAxMClbOjEwMV0KLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcihsaW5rKQotICAgICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgICAgICB0YXJpbmZvID0gTm9uZQotICAgICAgICBzZWxmLmFzc2VydF8odGFyaW5mbyBpcyBub3QgTm9uZSwgImxvbmdsaW5rIG5vdCBmb3VuZCIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXJpbmZvLmxpbmtuYW1lID09IG5hbWUsICJsaW5rbmFtZSB3cm9uZyIpCi0KLSAgICBkZWYgdGVzdF90cnVuY2F0ZWRfbG9uZ25hbWUoc2VsZik6Ci0gICAgICAgIGYgPSBvcGVuKHRhcm5hbWUoKSkKLSAgICAgICAgZm9iaiA9IFN0cmluZ0lPLlN0cmluZ0lPKGYucmVhZCgxMDI0KSkKLSAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgIHRhciA9IHRhcmZpbGUub3BlbihuYW1lPSJmb28udGFyIiwgZmlsZW9iaj1mb2JqKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHRhci5nZXRtZW1iZXJzKCkpID09IDAsICIiKQotICAgICAgICB0YXIuY2xvc2UoKQotCi0KLWNsYXNzIEV4dHJhY3RIYXJkbGlua1Rlc3QoQmFzZVRlc3QpOgotCi0gICAgZGVmIHRlc3RfaGFyZGxpbmsoc2VsZik6Ci0gICAgICAgICIiIlRlc3QgaGFyZGxpbmsgZXh0cmFjdGlvbiAoYnVnICM4NTcyOTcpCi0gICAgICAgICIiIgotICAgICAgICAjIFByZXZlbnQgZXJyb3JzIGZyb20gYmVpbmcgY2F1Z2h0Ci0gICAgICAgIHNlbGYudGFyLmVycm9ybGV2ZWwgPSAxCi0KLSAgICAgICAgc2VsZi50YXIuZXh0cmFjdCgiMC1SRUdUWVBFIiwgZGlybmFtZSgpKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICAjIEV4dHJhY3QgMS1MTktUWVBFIHdoaWNoIGlzIGEgaGFyZGxpbmsgdG8gMC1SRUdUWVBFCi0gICAgICAgICAgICBzZWxmLnRhci5leHRyYWN0KCIxLUxOS1RZUEUiLCBkaXJuYW1lKCkpCi0gICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yLCBlOgotICAgICAgICAgICAgaW1wb3J0IGVycm5vCi0gICAgICAgICAgICBpZiBlLmVycm5vID09IGVycm5vLkVOT0VOVDoKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImhhcmRsaW5rIG5vdCBleHRyYWN0ZWQgcHJvcGVybHkiKQotCi1jbGFzcyBDcmVhdGVIYXJkbGlua1Rlc3QoQmFzZVRlc3QpOgotICAgICIiIlRlc3QgdGhlIGNyZWF0aW9uIG9mIExOS1RZUEUgKGhhcmRsaW5rKSBtZW1iZXJzIGluIGFuIGFyY2hpdmUuCi0gICAgICAgSW4gdGhpcyByZXNwZWN0IHRhcmZpbGUucHkgbWltaWNzIHRoZSBiZWhhdmlvdXIgb2YgR05VIHRhcjogSWYKLSAgICAgICBhIGZpbGUgaGFzIGEgc3RfbmxpbmsgPiAxLCBpdCB3aWxsIGJlIGFkZGVkIGEgUkVHVFlQRSBtZW1iZXIKLSAgICAgICBvbmx5IHRoZSBmaXJzdCB0aW1lLgotICAgICIiIgotCi0gICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBzZWxmLnRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lKCksICJ3IikKLQotICAgICAgICBzZWxmLmZvbyA9IG9zLnBhdGguam9pbihkaXJuYW1lKCksICJmb28iKQotICAgICAgICBzZWxmLmJhciA9IG9zLnBhdGguam9pbihkaXJuYW1lKCksICJiYXIiKQotCi0gICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYuZm9vKToKLSAgICAgICAgICAgIG9zLnJlbW92ZShzZWxmLmZvbykKLSAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi5iYXIpOgotICAgICAgICAgICAgb3MucmVtb3ZlKHNlbGYuYmFyKQotCi0gICAgICAgIGYgPSBvcGVuKHNlbGYuZm9vLCAidyIpCi0gICAgICAgIGYud3JpdGUoImZvbyIpCi0gICAgICAgIGYuY2xvc2UoKQorICAgICAgICBzZWxmLnRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAidyIpCiAgICAgICAgIHNlbGYudGFyLmFkZChzZWxmLmZvbykKIAorICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgb3MucmVtb3ZlKHNlbGYuZm9vKQorICAgICAgICBvcy5yZW1vdmUoc2VsZi5iYXIpCisKICAgICBkZWYgdGVzdF9hZGRfdHdpY2Uoc2VsZik6Ci0gICAgICAgICMgSWYgc3RfbmxpbmsgPT0gMSB0aGVuIHRoZSBzYW1lIGZpbGUgd2lsbCBiZSBhZGRlZCBhcwotICAgICAgICAjIFJFR1RZUEUgZXZlcnkgdGltZS4KKyAgICAgICAgIyBUaGUgc2FtZSBuYW1lIHdpbGwgYmUgYWRkZWQgYXMgYSBSRUdUWVBFIGV2ZXJ5CisgICAgICAgICMgdGltZSByZWdhcmRsZXNzIG9mIHN0X25saW5rLgogICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0dGFyaW5mbyhzZWxmLmZvbykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnR5cGUsIHRhcmZpbGUuUkVHVFlQRSwKKyAgICAgICAgc2VsZi5hc3NlcnRfKHRhcmluZm8udHlwZSA9PSB0YXJmaWxlLlJFR1RZUEUsCiAgICAgICAgICAgICAgICAgImFkZCBmaWxlIGFzIHJlZ3VsYXIgZmFpbGVkIikKIAogICAgIGRlZiB0ZXN0X2FkZF9oYXJkbGluayhzZWxmKToKLSAgICAgICAgIyBJZiBzdF9ubGluayA+IDEgdGhlbiB0aGUgc2FtZSBmaWxlIHdpbGwgYmUgYWRkZWQgYXMKLSAgICAgICAgIyBMTktUWVBFLgotICAgICAgICBvcy5saW5rKHNlbGYuZm9vLCBzZWxmLmJhcikKLSAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldHRhcmluZm8oc2VsZi5mb28pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby50eXBlLCB0YXJmaWxlLkxOS1RZUEUsCi0gICAgICAgICAgICAgICAgImFkZCBmaWxlIGFzIGhhcmRsaW5rIGZhaWxlZCIpCi0KICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldHRhcmluZm8oc2VsZi5iYXIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby50eXBlLCB0YXJmaWxlLkxOS1RZUEUsCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXJpbmZvLnR5cGUgPT0gdGFyZmlsZS5MTktUWVBFLAogICAgICAgICAgICAgICAgICJhZGQgZmlsZSBhcyBoYXJkbGluayBmYWlsZWQiKQogCiAgICAgZGVmIHRlc3RfZGVyZWZlcmVuY2VfaGFyZGxpbmsoc2VsZik6CiAgICAgICAgIHNlbGYudGFyLmRlcmVmZXJlbmNlID0gVHJ1ZQotICAgICAgICBvcy5saW5rKHNlbGYuZm9vLCBzZWxmLmJhcikKICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldHRhcmluZm8oc2VsZi5iYXIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby50eXBlLCB0YXJmaWxlLlJFR1RZUEUsCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXJpbmZvLnR5cGUgPT0gdGFyZmlsZS5SRUdUWVBFLAogICAgICAgICAgICAgICAgICJkZXJlZmVyZW5jaW5nIGhhcmRsaW5rIGZhaWxlZCIpCiAKIAotIyBHemlwIFRlc3RDYXNlcwotY2xhc3MgUmVhZFRlc3RHemlwKFJlYWRUZXN0KToKLSAgICBjb21wID0gImd6IgotY2xhc3MgUmVhZFN0cmVhbVRlc3RHemlwKFJlYWRTdHJlYW1UZXN0KToKLSAgICBjb21wID0gImd6IgotY2xhc3MgV3JpdGVUZXN0R3ppcChXcml0ZVRlc3QpOgotICAgIGNvbXAgPSAiZ3oiCi1jbGFzcyBXcml0ZVN0cmVhbVRlc3RHemlwKFdyaXRlU3RyZWFtVGVzdCk6Ci0gICAgY29tcCA9ICJneiIKLWNsYXNzIFJlYWREZXRlY3RUZXN0R3ppcChSZWFkRGV0ZWN0VGVzdCk6Ci0gICAgY29tcCA9ICJneiIKLWNsYXNzIFJlYWREZXRlY3RGaWxlb2JqVGVzdEd6aXAoUmVhZERldGVjdEZpbGVvYmpUZXN0KToKLSAgICBjb21wID0gImd6IgotY2xhc3MgUmVhZEFzdGVyaXNrVGVzdEd6aXAoUmVhZEFzdGVyaXNrVGVzdCk6Ci0gICAgY29tcCA9ICJneiIKLWNsYXNzIFJlYWRTdHJlYW1Bc3Rlcmlza1Rlc3RHemlwKFJlYWRTdHJlYW1Bc3Rlcmlza1Rlc3QpOgotICAgIGNvbXAgPSAiZ3oiCitjbGFzcyBQYXhXcml0ZVRlc3QoR05VV3JpdGVUZXN0KToKIAotIyBGaWxlbW9kZSB0ZXN0IGNhc2VzCisgICAgZGVmIF90ZXN0KHNlbGYsIG5hbWUsIGxpbms9Tm9uZSk6CisgICAgICAgICMgU2VlIEdOVVdyaXRlVGVzdC4KKyAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbyhuYW1lKQorICAgICAgICBpZiBsaW5rOgorICAgICAgICAgICAgdGFyaW5mby5saW5rbmFtZSA9IGxpbmsKKyAgICAgICAgICAgIHRhcmluZm8udHlwZSA9IHRhcmZpbGUuTE5LVFlQRQogCi1jbGFzcyBGaWxlTW9kZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGRlZiB0ZXN0X21vZGVzKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmZpbGUuZmlsZW1vZGUoMDc1NSksICctcnd4ci14ci14JykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJmaWxlLmZpbGVtb2RlKDA3MTExKSwgJy0tLXMtLXMtLXQnKQorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInciLCBmb3JtYXQ9dGFyZmlsZS5QQVhfRk9STUFUKQorICAgICAgICB0YXIuYWRkZmlsZSh0YXJpbmZvKQorICAgICAgICB0YXIuY2xvc2UoKQogCi1jbGFzcyBIZWFkZXJFcnJvclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSkKKyAgICAgICAgaWYgbGluazoKKyAgICAgICAgICAgIGwgPSB0YXIuZ2V0bWVtYmVycygpWzBdLmxpbmtuYW1lCisgICAgICAgICAgICBzZWxmLmFzc2VydF8obGluayA9PSBsLCAiUEFYIGxvbmdsaW5rIGNyZWF0aW9uIGZhaWxlZCIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuID0gdGFyLmdldG1lbWJlcnMoKVswXS5uYW1lCisgICAgICAgICAgICBzZWxmLmFzc2VydF8obmFtZSA9PSBuLCAiUEFYIGxvbmduYW1lIGNyZWF0aW9uIGZhaWxlZCIpCisKKyAgICBkZWYgdGVzdF9pc284ODU5XzE1X2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X3VuaWNvZGVfZmlsZW5hbWUoImlzbzg4NTktMTUiKQorCisgICAgZGVmIHRlc3RfdXRmOF9maWxlbmFtZShzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF91bmljb2RlX2ZpbGVuYW1lKCJ1dGY4IikKKworICAgIGRlZiB0ZXN0X3V0ZjE2X2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X3VuaWNvZGVfZmlsZW5hbWUoInV0ZjE2IikKKworICAgIGRlZiBfdGVzdF91bmljb2RlX2ZpbGVuYW1lKHNlbGYsIGVuY29kaW5nKToKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IiwgZm9ybWF0PXRhcmZpbGUuUEFYX0ZPUk1BVCkKKyAgICAgICAgbmFtZSA9IHUiXHUyMGFjIi5lbmNvZGUoZW5jb2RpbmcpICMgRXVybyBzaWduCisgICAgICAgIHRhci5lbmNvZGluZyA9IGVuY29kaW5nCisgICAgICAgIHRhci5hZGRmaWxlKHRhcmZpbGUuVGFySW5mbyhuYW1lKSkKKyAgICAgICAgdGFyLmNsb3NlKCkKKworICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgZW5jb2Rpbmc9ZW5jb2RpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyLmdldG1lbWJlcnMoKVswXS5uYW1lLCBuYW1lKQorICAgICAgICB0YXIuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfdW5pY29kZV9maWxlbmFtZV9lcnJvcihzZWxmKToKKyAgICAgICAgIyBUaGUgZXVybyBzaWduIGZpbGVuYW1lIGNhbm5vdCBiZSB0cmFuc2xhdGVkIHRvIGlzbzg4NTktMSBlbmNvZGluZy4KKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IiwgZm9ybWF0PXRhcmZpbGUuUEFYX0ZPUk1BVCwgZW5jb2Rpbmc9InV0ZjgiKQorICAgICAgICBuYW1lID0gdSJcdTIwYWMiLmVuY29kZSgidXRmOCIpICMgRXVybyBzaWduCisgICAgICAgIHRhci5hZGRmaWxlKHRhcmZpbGUuVGFySW5mbyhuYW1lKSkKKyAgICAgICAgdGFyLmNsb3NlKCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIHRhcmZpbGUub3BlbiwgdG1wbmFtZSwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpCisKKyAgICBkZWYgdGVzdF9wYXhfaGVhZGVycyhzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9wYXhfaGVhZGVycyh7ImZvbyI6ICJiYXIiLCAidWlkIjogMCwgIm10aW1lIjogMS4yM30pCisKKyAgICAgICAgc2VsZi5fdGVzdF9wYXhfaGVhZGVycyh7ImV1cm8iOiB1Ilx1MjBhYyIuZW5jb2RlKCJ1dGY4Iil9KQorCisgICAgICAgIHNlbGYuX3Rlc3RfcGF4X2hlYWRlcnMoeyJldXJvIjogdSJcdTIwYWMifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImV1cm8iOiB1Ilx1MjBhYyIuZW5jb2RlKCJ1dGY4Iil9KQorCisgICAgICAgIHNlbGYuX3Rlc3RfcGF4X2hlYWRlcnMoe3UiXHUyMGFjIjogImV1cm8ifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dSJcdTIwYWMiLmVuY29kZSgidXRmOCIpOiAiZXVybyJ9KQorCisgICAgZGVmIF90ZXN0X3BheF9oZWFkZXJzKHNlbGYsIHBheF9oZWFkZXJzLCBjbXBfaGVhZGVycz1Ob25lKToKKyAgICAgICAgaWYgY21wX2hlYWRlcnMgaXMgTm9uZToKKyAgICAgICAgICAgIGNtcF9oZWFkZXJzID0gcGF4X2hlYWRlcnMKKworICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInciLCBmb3JtYXQ9dGFyZmlsZS5QQVhfRk9STUFULCBcCisgICAgICAgICAgICAgICAgcGF4X2hlYWRlcnM9cGF4X2hlYWRlcnMsIGVuY29kaW5nPSJ1dGY4IikKKyAgICAgICAgdGFyLmFkZGZpbGUodGFyZmlsZS5UYXJJbmZvKCJ0ZXN0IikpCisgICAgICAgIHRhci5jbG9zZSgpCisKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIGVuY29kaW5nPSJ1dGY4IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIucGF4X2hlYWRlcnMsIGNtcF9oZWFkZXJzKQogCiAgICAgZGVmIHRlc3RfdHJ1bmNhdGVkX2hlYWRlcihzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5IZWFkZXJFcnJvciwgdGFyZmlsZS5UYXJJbmZvLmZyb21idWYsICIiKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLkhlYWRlckVycm9yLCB0YXJmaWxlLlRhckluZm8uZnJvbWJ1ZiwgImZpbGVuYW1lXDAiKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLkhlYWRlckVycm9yLCB0YXJmaWxlLlRhckluZm8uZnJvbWJ1ZiwgIlwwIiAqIDUxMSkKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5IZWFkZXJFcnJvciwgdGFyZmlsZS5UYXJJbmZvLmZyb21idWYsICJcMCIgKiA1MTMpCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAidyIsIGZvcm1hdD10YXJmaWxlLlBBWF9GT1JNQVQpCisgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIjEyMy8iICogMTI2ICsgImxvbmduYW1lIikKKyAgICAgICAgdGFyLmFkZGZpbGUodGFyaW5mbykKKyAgICAgICAgdGFyLmNsb3NlKCkKIAotICAgIGRlZiB0ZXN0X2VtcHR5X2hlYWRlcihzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5IZWFkZXJFcnJvciwgdGFyZmlsZS5UYXJJbmZvLmZyb21idWYsICJcMCIgKiA1MTIpCisgICAgICAgICMgU2ltdWxhdGUgYSBwcmVtYXR1cmUgRU9GLgorICAgICAgICBvcGVuKHRtcG5hbWUsICJyYisiKS50cnVuY2F0ZSgxNTM2KQorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIuZ2V0bWVtYmVycygpLCBbXSkKIAotICAgIGRlZiB0ZXN0X2ludmFsaWRfaGVhZGVyKHNlbGYpOgotICAgICAgICBidWYgPSB0YXJmaWxlLlRhckluZm8oImZpbGVuYW1lIikudG9idWYoKQotICAgICAgICBidWYgPSBidWZbOjE0OF0gKyAiZm9vXDBcMFwwXDBcMCIgKyBidWZbMTU2Ol0gIyBpbnZhbGlkIG51bWJlciBmaWVsZC4KLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5IZWFkZXJFcnJvciwgdGFyZmlsZS5UYXJJbmZvLmZyb21idWYsIGJ1ZikKIAotICAgIGRlZiB0ZXN0X2JhZF9jaGVja3N1bShzZWxmKToKLSAgICAgICAgYnVmID0gdGFyZmlsZS5UYXJJbmZvKCJmaWxlbmFtZSIpLnRvYnVmKCkKLSAgICAgICAgYiA9IGJ1Zls6MTQ4XSArICIgICAgICAgICIgKyBidWZbMTU2Ol0gIyBjbGVhciB0aGUgY2hlY2tzdW0gZmllbGQuCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuSGVhZGVyRXJyb3IsIHRhcmZpbGUuVGFySW5mby5mcm9tYnVmLCBiKQotICAgICAgICBiID0gImEiICsgYnVmWzE6XSAjIG1hbmlwdWxhdGUgdGhlIGJ1ZmZlciwgc28gY2hlY2tzdW0gd29uJ3QgbWF0Y2guCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuSGVhZGVyRXJyb3IsIHRhcmZpbGUuVGFySW5mby5mcm9tYnVmLCBiKQorY2xhc3MgQXBwZW5kVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBUZXN0IGFwcGVuZCBtb2RlIChjcC4gcGF0Y2ggIzE2NTI2ODEpLgogCi1jbGFzcyBPcGVuRmlsZW9ialRlc3QoQmFzZVRlc3QpOgotICAgICMgVGVzdCBmb3IgU0YgYnVnICMxNDk2NTAxLgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi50YXJuYW1lID0gdG1wbmFtZQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLnRhcm5hbWUpOgorICAgICAgICAgICAgb3MucmVtb3ZlKHNlbGYudGFybmFtZSkKIAotICAgIGRlZiB0ZXN0X29wZW5lcihzZWxmKToKLSAgICAgICAgZm9iaiA9IFN0cmluZ0lPLlN0cmluZ0lPKCJmb29cbiIpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHRhcmZpbGUub3BlbigiIiwgInIiLCBmaWxlb2JqPWZvYmopCi0gICAgICAgIGV4Y2VwdCB0YXJmaWxlLlJlYWRFcnJvcjoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9iai50ZWxsKCksIDAsICJmaWxlb2JqJ3MgcG9zaXRpb24gaGFzIG1vdmVkIikKKyAgICBkZWYgX2FkZF90ZXN0ZmlsZShzZWxmLCBmaWxlb2JqPU5vbmUpOgorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4oc2VsZi50YXJuYW1lLCAiYSIsIGZpbGVvYmo9ZmlsZW9iaikKKyAgICAgICAgdGFyLmFkZGZpbGUodGFyZmlsZS5UYXJJbmZvKCJiYXIiKSkKKyAgICAgICAgdGFyLmNsb3NlKCkKIAotaWYgYnoyOgotICAgICMgQnppcDIgVGVzdENhc2VzCi0gICAgY2xhc3MgUmVhZFRlc3RCemlwMihSZWFkVGVzdEd6aXApOgotICAgICAgICBjb21wID0gImJ6MiIKLSAgICBjbGFzcyBSZWFkU3RyZWFtVGVzdEJ6aXAyKFJlYWRTdHJlYW1UZXN0R3ppcCk6Ci0gICAgICAgIGNvbXAgPSAiYnoyIgotICAgIGNsYXNzIFdyaXRlVGVzdEJ6aXAyKFdyaXRlVGVzdCk6Ci0gICAgICAgIGNvbXAgPSAiYnoyIgotICAgIGNsYXNzIFdyaXRlU3RyZWFtVGVzdEJ6aXAyKFdyaXRlU3RyZWFtVGVzdEd6aXApOgotICAgICAgICBjb21wID0gImJ6MiIKLSAgICBjbGFzcyBSZWFkRGV0ZWN0VGVzdEJ6aXAyKFJlYWREZXRlY3RUZXN0KToKLSAgICAgICAgY29tcCA9ICJiejIiCi0gICAgY2xhc3MgUmVhZERldGVjdEZpbGVvYmpUZXN0QnppcDIoUmVhZERldGVjdEZpbGVvYmpUZXN0KToKLSAgICAgICAgY29tcCA9ICJiejIiCi0gICAgY2xhc3MgUmVhZEFzdGVyaXNrVGVzdEJ6aXAyKFJlYWRBc3Rlcmlza1Rlc3QpOgotICAgICAgICBjb21wID0gImJ6MiIKLSAgICBjbGFzcyBSZWFkU3RyZWFtQXN0ZXJpc2tUZXN0QnppcDIoUmVhZFN0cmVhbUFzdGVyaXNrVGVzdCk6Ci0gICAgICAgIGNvbXAgPSAiYnoyIgorICAgIGRlZiBfY3JlYXRlX3Rlc3R0YXIoc2VsZiwgbW9kZT0idzoiKToKKyAgICAgICAgc3JjID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUpCisgICAgICAgIHQgPSBzcmMuZ2V0bWVtYmVyKCJ1c3Rhci9yZWd0eXBlIikKKyAgICAgICAgdC5uYW1lID0gImZvbyIKKyAgICAgICAgZiA9IHNyYy5leHRyYWN0ZmlsZSh0KQorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4oc2VsZi50YXJuYW1lLCBtb2RlKQorICAgICAgICB0YXIuYWRkZmlsZSh0LCBmKQorICAgICAgICB0YXIuY2xvc2UoKQogCi0jIElmIGltcG9ydGluZyBnemlwIGZhaWxlZCwgZGlzY2FyZCB0aGUgR3ppcCBUZXN0Q2FzZXMuCi1pZiBub3QgZ3ppcDoKLSAgICBkZWwgUmVhZFRlc3RHemlwCi0gICAgZGVsIFJlYWRTdHJlYW1UZXN0R3ppcAotICAgIGRlbCBXcml0ZVRlc3RHemlwCi0gICAgZGVsIFdyaXRlU3RyZWFtVGVzdEd6aXAKKyAgICBkZWYgX3Rlc3Qoc2VsZiwgbmFtZXM9WyJiYXIiXSwgZmlsZW9iaj1Ob25lKToKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHNlbGYudGFybmFtZSwgZmlsZW9iaj1maWxlb2JqKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhci5nZXRuYW1lcygpLCBuYW1lcykKKworICAgIGRlZiB0ZXN0X25vbl9leGlzdGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5fYWRkX3Rlc3RmaWxlKCkKKyAgICAgICAgc2VsZi5fdGVzdCgpCisKKyAgICBkZWYgdGVzdF9lbXB0eShzZWxmKToKKyAgICAgICAgb3BlbihzZWxmLnRhcm5hbWUsICJ3IikuY2xvc2UoKQorICAgICAgICBzZWxmLl9hZGRfdGVzdGZpbGUoKQorICAgICAgICBzZWxmLl90ZXN0KCkKKworICAgIGRlZiB0ZXN0X2VtcHR5X2ZpbGVvYmooc2VsZik6CisgICAgICAgIGZvYmogPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHNlbGYuX2FkZF90ZXN0ZmlsZShmb2JqKQorICAgICAgICBmb2JqLnNlZWsoMCkKKyAgICAgICAgc2VsZi5fdGVzdChmaWxlb2JqPWZvYmopCisKKyAgICBkZWYgdGVzdF9maWxlb2JqKHNlbGYpOgorICAgICAgICBzZWxmLl9jcmVhdGVfdGVzdHRhcigpCisgICAgICAgIGRhdGEgPSBvcGVuKHNlbGYudGFybmFtZSkucmVhZCgpCisgICAgICAgIGZvYmogPSBTdHJpbmdJTy5TdHJpbmdJTyhkYXRhKQorICAgICAgICBzZWxmLl9hZGRfdGVzdGZpbGUoZm9iaikKKyAgICAgICAgZm9iai5zZWVrKDApCisgICAgICAgIHNlbGYuX3Rlc3QobmFtZXM9WyJmb28iLCAiYmFyIl0sIGZpbGVvYmo9Zm9iaikKKworICAgIGRlZiB0ZXN0X2V4aXN0aW5nKHNlbGYpOgorICAgICAgICBzZWxmLl9jcmVhdGVfdGVzdHRhcigpCisgICAgICAgIHNlbGYuX2FkZF90ZXN0ZmlsZSgpCisgICAgICAgIHNlbGYuX3Rlc3QobmFtZXM9WyJmb28iLCAiYmFyIl0pCisKKyAgICBkZWYgdGVzdF9hcHBlbmRfZ3ooc2VsZik6CisgICAgICAgIGlmIGd6aXAgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9jcmVhdGVfdGVzdHRhcigidzpneiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIHRtcG5hbWUsICJhIikKKworICAgIGRlZiB0ZXN0X2FwcGVuZF9iejIoc2VsZik6CisgICAgICAgIGlmIGJ6MiBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX2NyZWF0ZV90ZXN0dGFyKCJ3OmJ6MiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIHRtcG5hbWUsICJhIikKKworCitjbGFzcyBMaW1pdHNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3VzdGFyX2xpbWl0cyhzZWxmKToKKyAgICAgICAgIyAxMDAgY2hhciBuYW1lCisgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIjAxMjM0NTY3ODkiICogMTApCisgICAgICAgIHRhcmluZm8uY3JlYXRlX3VzdGFyX2hlYWRlcigpCisKKyAgICAgICAgIyAxMDEgY2hhciBuYW1lIHRoYXQgY2Fubm90IGJlIHN0b3JlZAorICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIwMTIzNDU2Nzg5IiAqIDEwICsgIjAiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0YXJpbmZvLmNyZWF0ZV91c3Rhcl9oZWFkZXIpCisKKyAgICAgICAgIyAyNTYgY2hhciBuYW1lIHdpdGggYSBzbGFzaCBhdCBwb3MgMTU2CisgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIjEyMy8iICogNjIgKyAibG9uZ25hbWUiKQorICAgICAgICB0YXJpbmZvLmNyZWF0ZV91c3Rhcl9oZWFkZXIoKQorCisgICAgICAgICMgMjU2IGNoYXIgbmFtZSB0aGF0IGNhbm5vdCBiZSBzdG9yZWQKKyAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygiMTIzNDU2Ny8iICogMzEgKyAibG9uZ25hbWUiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0YXJpbmZvLmNyZWF0ZV91c3Rhcl9oZWFkZXIpCisKKyAgICAgICAgIyA1MTIgY2hhciBuYW1lCisgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIjEyMy8iICogMTI2ICsgImxvbmduYW1lIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGFyaW5mby5jcmVhdGVfdXN0YXJfaGVhZGVyKQorCisgICAgICAgICMgNTEyIGNoYXIgbGlua25hbWUKKyAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygibG9uZ2xpbmsiKQorICAgICAgICB0YXJpbmZvLmxpbmtuYW1lID0gIjEyMy8iICogMTI2ICsgImxvbmduYW1lIgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0YXJpbmZvLmNyZWF0ZV91c3Rhcl9oZWFkZXIpCisKKyAgICAgICAgIyB1aWQgPiA4IGRpZ2l0cworICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCJuYW1lIikKKyAgICAgICAgdGFyaW5mby51aWQgPSAwMTAwMDAwMDAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGFyaW5mby5jcmVhdGVfdXN0YXJfaGVhZGVyKQorCisgICAgZGVmIHRlc3RfZ251X2xpbWl0cyhzZWxmKToKKyAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygiMTIzLyIgKiAxMjYgKyAibG9uZ25hbWUiKQorICAgICAgICB0YXJpbmZvLmNyZWF0ZV9nbnVfaGVhZGVyKCkKKworICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCJsb25nbGluayIpCisgICAgICAgIHRhcmluZm8ubGlua25hbWUgPSAiMTIzLyIgKiAxMjYgKyAibG9uZ25hbWUiCisgICAgICAgIHRhcmluZm8uY3JlYXRlX2dudV9oZWFkZXIoKQorCisgICAgICAgICMgdWlkID49IDI1NiAqKiA3CisgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIm5hbWUiKQorICAgICAgICB0YXJpbmZvLnVpZCA9IDA0MDAwMDAwMDAwMDAwMDAwMDAwTAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0YXJpbmZvLmNyZWF0ZV9nbnVfaGVhZGVyKQorCisgICAgZGVmIHRlc3RfcGF4X2xpbWl0cyhzZWxmKToKKyAgICAgICAgIyBBIDI1NiBjaGFyIG5hbWUgdGhhdCBjYW4gYmUgc3RvcmVkIHdpdGhvdXQgYW4gZXh0ZW5kZWQgaGVhZGVyLgorICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIxMjMvIiAqIDYyICsgImxvbmduYW1lIikKKyAgICAgICAgc2VsZi5hc3NlcnRfKGxlbih0YXJpbmZvLmNyZWF0ZV9wYXhfaGVhZGVyKCJ1dGY4IikpID09IDUxMiwKKyAgICAgICAgICAgICAgICAiY3JlYXRlX3BheF9oZWFkZXIgYXR0YWNoZWQgc3VwZXJmbHVvdXMgZXh0ZW5kZWQgaGVhZGVyIikKKworICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIxMjMvIiAqIDEyNiArICJsb25nbmFtZSIpCisgICAgICAgIHRhcmluZm8uY3JlYXRlX3BheF9oZWFkZXIoInV0ZjgiKQorCisgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oImxvbmdsaW5rIikKKyAgICAgICAgdGFyaW5mby5saW5rbmFtZSA9ICIxMjMvIiAqIDEyNiArICJsb25nbmFtZSIKKyAgICAgICAgdGFyaW5mby5jcmVhdGVfcGF4X2hlYWRlcigidXRmOCIpCisKKyAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygibmFtZSIpCisgICAgICAgIHRhcmluZm8udWlkID0gMDQwMDAwMDAwMDAwMDAwMDAwMDBMCisgICAgICAgIHRhcmluZm8uY3JlYXRlX3BheF9oZWFkZXIoInV0ZjgiKQorCisKK2NsYXNzIEd6aXBNaXNjUmVhZFRlc3QoTWlzY1JlYWRUZXN0KToKKyAgICB0YXJuYW1lID0gZ3ppcG5hbWUKKyAgICBtb2RlID0gInI6Z3oiCitjbGFzcyBHemlwVXN0YXJSZWFkVGVzdChVc3RhclJlYWRUZXN0KToKKyAgICB0YXJuYW1lID0gZ3ppcG5hbWUKKyAgICBtb2RlID0gInI6Z3oiCitjbGFzcyBHemlwU3RyZWFtUmVhZFRlc3QoU3RyZWFtUmVhZFRlc3QpOgorICAgIHRhcm5hbWUgPSBnemlwbmFtZQorICAgIG1vZGUgPSAicnxneiIKK2NsYXNzIEd6aXBXcml0ZVRlc3QoV3JpdGVUZXN0KToKKyAgICBtb2RlID0gInc6Z3oiCitjbGFzcyBHemlwU3RyZWFtV3JpdGVUZXN0KFN0cmVhbVdyaXRlVGVzdCk6CisgICAgbW9kZSA9ICJ3fGd6IgorCisKK2NsYXNzIEJ6Mk1pc2NSZWFkVGVzdChNaXNjUmVhZFRlc3QpOgorICAgIHRhcm5hbWUgPSBiejJuYW1lCisgICAgbW9kZSA9ICJyOmJ6MiIKK2NsYXNzIEJ6MlVzdGFyUmVhZFRlc3QoVXN0YXJSZWFkVGVzdCk6CisgICAgdGFybmFtZSA9IGJ6Mm5hbWUKKyAgICBtb2RlID0gInI6YnoyIgorY2xhc3MgQnoyU3RyZWFtUmVhZFRlc3QoU3RyZWFtUmVhZFRlc3QpOgorICAgIHRhcm5hbWUgPSBiejJuYW1lCisgICAgbW9kZSA9ICJyfGJ6MiIKK2NsYXNzIEJ6MldyaXRlVGVzdChXcml0ZVRlc3QpOgorICAgIG1vZGUgPSAidzpiejIiCitjbGFzcyBCejJTdHJlYW1Xcml0ZVRlc3QoU3RyZWFtV3JpdGVUZXN0KToKKyAgICBtb2RlID0gInd8YnoyIgogCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgIyBDcmVhdGUgYXJjaGl2ZS4KLSAgICBmID0gb3Blbih0YXJuYW1lKCksICJyYiIpCi0gICAgZmd1dHMgPSBmLnJlYWQoKQotICAgIGYuY2xvc2UoKQotICAgIGlmIGd6aXA6Ci0gICAgICAgICMgY3JlYXRlIHRlc3R0YXIudGFyLmd6Ci0gICAgICAgIHRhciA9IGd6aXAub3Blbih0YXJuYW1lKCJneiIpLCAid2IiKQotICAgICAgICB0YXIud3JpdGUoZmd1dHMpCi0gICAgICAgIHRhci5jbG9zZSgpCi0gICAgaWYgYnoyOgotICAgICAgICAjIGNyZWF0ZSB0ZXN0dGFyLnRhci5iejIKLSAgICAgICAgdGFyID0gYnoyLkJaMkZpbGUodGFybmFtZSgiYnoyIiksICJ3YiIpCi0gICAgICAgIHRhci53cml0ZShmZ3V0cykKLSAgICAgICAgdGFyLmNsb3NlKCkKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoVEVNUERJUik6CisgICAgICAgIG9zLm1rZGlyKFRFTVBESVIpCiAKICAgICB0ZXN0cyA9IFsKLSAgICAgICAgRmlsZU1vZGVUZXN0LAotICAgICAgICBIZWFkZXJFcnJvclRlc3QsCi0gICAgICAgIE9wZW5GaWxlb2JqVGVzdCwKLSAgICAgICAgUmVhZFRlc3QsCi0gICAgICAgIFJlYWRTdHJlYW1UZXN0LAotICAgICAgICBSZWFkRGV0ZWN0VGVzdCwKLSAgICAgICAgUmVhZERldGVjdEZpbGVvYmpUZXN0LAotICAgICAgICBSZWFkQXN0ZXJpc2tUZXN0LAotICAgICAgICBSZWFkU3RyZWFtQXN0ZXJpc2tUZXN0LAorICAgICAgICBVc3RhclJlYWRUZXN0LAorICAgICAgICBNaXNjUmVhZFRlc3QsCisgICAgICAgIFN0cmVhbVJlYWRUZXN0LAorICAgICAgICBEZXRlY3RSZWFkVGVzdCwKKyAgICAgICAgTWVtYmVyUmVhZFRlc3QsCisgICAgICAgIEdOVVJlYWRUZXN0LAorICAgICAgICBQYXhSZWFkVGVzdCwKICAgICAgICAgV3JpdGVUZXN0LAorICAgICAgICBTdHJlYW1Xcml0ZVRlc3QsCisgICAgICAgIEdOVVdyaXRlVGVzdCwKKyAgICAgICAgUGF4V3JpdGVUZXN0LAogICAgICAgICBBcHBlbmRUZXN0LAotICAgICAgICBXcml0ZTEwMFRlc3QsCi0gICAgICAgIFdyaXRlU2l6ZTBUZXN0LAotICAgICAgICBXcml0ZVN0cmVhbVRlc3QsCi0gICAgICAgIFdyaXRlR05VTG9uZ1Rlc3QsCi0gICAgICAgIFJlYWRHTlVMb25nVGVzdCwKKyAgICAgICAgTGltaXRzVGVzdCwKICAgICBdCiAKICAgICBpZiBoYXNhdHRyKG9zLCAibGluayIpOgotICAgICAgICB0ZXN0cy5hcHBlbmQoRXh0cmFjdEhhcmRsaW5rVGVzdCkKLSAgICAgICAgdGVzdHMuYXBwZW5kKENyZWF0ZUhhcmRsaW5rVGVzdCkKKyAgICAgICAgdGVzdHMuYXBwZW5kKEhhcmRsaW5rVGVzdCkKKworICAgIGZvYmogPSBvcGVuKHRhcm5hbWUsICJyYiIpCisgICAgZGF0YSA9IGZvYmoucmVhZCgpCisgICAgZm9iai5jbG9zZSgpCiAKICAgICBpZiBnemlwOgotICAgICAgICB0ZXN0cy5leHRlbmQoWwotICAgICAgICAgICAgUmVhZFRlc3RHemlwLCBSZWFkU3RyZWFtVGVzdEd6aXAsCi0gICAgICAgICAgICBXcml0ZVRlc3RHemlwLCBXcml0ZVN0cmVhbVRlc3RHemlwLAotICAgICAgICAgICAgUmVhZERldGVjdFRlc3RHemlwLCBSZWFkRGV0ZWN0RmlsZW9ialRlc3RHemlwLAotICAgICAgICAgICAgUmVhZEFzdGVyaXNrVGVzdEd6aXAsIFJlYWRTdHJlYW1Bc3Rlcmlza1Rlc3RHemlwCi0gICAgICAgIF0pCisgICAgICAgICMgQ3JlYXRlIHRlc3R0YXIudGFyLmd6IGFuZCBhZGQgZ3ppcC1zcGVjaWZpYyB0ZXN0cy4KKyAgICAgICAgdGFyID0gZ3ppcC5vcGVuKGd6aXBuYW1lLCAid2IiKQorICAgICAgICB0YXIud3JpdGUoZGF0YSkKKyAgICAgICAgdGFyLmNsb3NlKCkKKworICAgICAgICB0ZXN0cyArPSBbCisgICAgICAgICAgICBHemlwTWlzY1JlYWRUZXN0LAorICAgICAgICAgICAgR3ppcFVzdGFyUmVhZFRlc3QsCisgICAgICAgICAgICBHemlwU3RyZWFtUmVhZFRlc3QsCisgICAgICAgICAgICBHemlwV3JpdGVUZXN0LAorICAgICAgICAgICAgR3ppcFN0cmVhbVdyaXRlVGVzdCwKKyAgICAgICAgXQogCiAgICAgaWYgYnoyOgotICAgICAgICB0ZXN0cy5leHRlbmQoWwotICAgICAgICAgICAgUmVhZFRlc3RCemlwMiwgUmVhZFN0cmVhbVRlc3RCemlwMiwKLSAgICAgICAgICAgIFdyaXRlVGVzdEJ6aXAyLCBXcml0ZVN0cmVhbVRlc3RCemlwMiwKLSAgICAgICAgICAgIFJlYWREZXRlY3RUZXN0QnppcDIsIFJlYWREZXRlY3RGaWxlb2JqVGVzdEJ6aXAyLAotICAgICAgICAgICAgUmVhZEFzdGVyaXNrVGVzdEJ6aXAyLCBSZWFkU3RyZWFtQXN0ZXJpc2tUZXN0QnppcDIKLSAgICAgICAgXSkKKyAgICAgICAgIyBDcmVhdGUgdGVzdHRhci50YXIuYnoyIGFuZCBhZGQgYnoyLXNwZWNpZmljIHRlc3RzLgorICAgICAgICB0YXIgPSBiejIuQloyRmlsZShiejJuYW1lLCAid2IiKQorICAgICAgICB0YXIud3JpdGUoZGF0YSkKKyAgICAgICAgdGFyLmNsb3NlKCkKKworICAgICAgICB0ZXN0cyArPSBbCisgICAgICAgICAgICBCejJNaXNjUmVhZFRlc3QsCisgICAgICAgICAgICBCejJVc3RhclJlYWRUZXN0LAorICAgICAgICAgICAgQnoyU3RyZWFtUmVhZFRlc3QsCisgICAgICAgICAgICBCejJXcml0ZVRlc3QsCisgICAgICAgICAgICBCejJTdHJlYW1Xcml0ZVRlc3QsCisgICAgICAgIF0KKwogICAgIHRyeToKICAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdHMpCiAgICAgZmluYWxseToKLSAgICAgICAgaWYgZ3ppcDoKLSAgICAgICAgICAgIG9zLnJlbW92ZSh0YXJuYW1lKCJneiIpKQotICAgICAgICBpZiBiejI6Ci0gICAgICAgICAgICBvcy5yZW1vdmUodGFybmFtZSgiYnoyIikpCi0gICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRpcm5hbWUoKSk6Ci0gICAgICAgICAgICBzaHV0aWwucm10cmVlKGRpcm5hbWUoKSkKLSAgICAgICAgaWYgb3MucGF0aC5leGlzdHModG1wbmFtZSgpKToKLSAgICAgICAgICAgIG9zLnJlbW92ZSh0bXBuYW1lKCkpCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKFRFTVBESVIpOgorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShURU1QRElSKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHRlc3RfbWFpbigpCisKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3R0YXIudGFyIGIvTGliL3Rlc3QvdGVzdHRhci50YXIKaW5kZXggMWY0NDkzZi4uYzRjODJiOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdHRhci50YXIKKysrIGIvTGliL3Rlc3QvdGVzdHRhci50YXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTWlzYy9ORVdTIGIvTWlzYy9ORVdTCmluZGV4IGYwNjQ5OWEuLmQwZWE0MGIgMTAwNjQ0Ci0tLSBhL01pc2MvTkVXUworKysgYi9NaXNjL05FV1MKQEAgLTE2OCw2ICsxNjgsOSBAQAogTGlicmFyeQogLS0tLS0tLQogCistIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBQT1NJWC4xLTIwMDEgKHBheCkgZm9ybWF0IHRvIHRhcmZpbGUucHkuIEV4dGVuZGVkCisgIGFuZCBjbGVhbmVkIHVwIHRoZSB0ZXN0IHN1aXRlLiBBZGRlZCBhIG5ldyB0ZXN0dGFyLnRhci4KKwogLSBQYXRjaCAjMTQ0OTI0NDogU3VwcG9ydCBVbmljb2RlIHN0cmluZ3MgaW4KICAgZW1haWwubWVzc2FnZS5NZXNzYWdlLntzZXRfY2hhcnNldCxnZXRfY29udGVudF9jaGFyc2V0fS4KIAo=