IyEgL3Vzci9iaW4vZW52IHB5dGhvbgojIC0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCiMgV3JpdHRlbiBieSBNYXJ0aW4gdi4gTPZ3aXMgPGxvZXdpc0BpbmZvcm1hdGlrLmh1LWJlcmxpbi5kZT4KCiIiIkdlbmVyYXRlIGJpbmFyeSBtZXNzYWdlIGNhdGFsb2cgZnJvbSB0ZXh0dWFsIHRyYW5zbGF0aW9uIGRlc2NyaXB0aW9uLgoKVGhpcyBwcm9ncmFtIGNvbnZlcnRzIGEgdGV4dHVhbCBVbmlmb3J1bS1zdHlsZSBtZXNzYWdlIGNhdGFsb2cgKC5wbyBmaWxlKSBpbnRvCmEgYmluYXJ5IEdOVSBjYXRhbG9nICgubW8gZmlsZSkuICBUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGZ1bmN0aW9uIGFzIHRoZQpHTlUgbXNnZm10IHByb2dyYW0sIGhvd2V2ZXIsIGl0IGlzIGEgc2ltcGxlciBpbXBsZW1lbnRhdGlvbi4KClVzYWdlOiBtc2dmbXQucHkgW09QVElPTlNdIGZpbGVuYW1lLnBvCgpPcHRpb25zOgogICAgLW8gZmlsZQogICAgLS1vdXRwdXQtZmlsZT1maWxlCiAgICAgICAgU3BlY2lmeSB0aGUgb3V0cHV0IGZpbGUgdG8gd3JpdGUgdG8uICBJZiBvbWl0dGVkLCBvdXRwdXQgd2lsbCBnbyB0byBhCiAgICAgICAgZmlsZSBuYW1lZCBmaWxlbmFtZS5tbyAoYmFzZWQgb2ZmIHRoZSBpbnB1dCBmaWxlIG5hbWUpLgoKICAgIC1oCiAgICAtLWhlbHAKICAgICAgICBQcmludCB0aGlzIG1lc3NhZ2UgYW5kIGV4aXQuCgogICAgLVYKICAgIC0tdmVyc2lvbgogICAgICAgIERpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdC4KIiIiCgppbXBvcnQgc3lzCmltcG9ydCBvcwppbXBvcnQgZ2V0b3B0CmltcG9ydCBzdHJ1Y3QKaW1wb3J0IGFycmF5CgpfX3ZlcnNpb25fXyA9ICIxLjEiCgpNRVNTQUdFUyA9IHt9CgoKDApkZWYgdXNhZ2UoY29kZSwgbXNnPScnKToKICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIF9fZG9jX18KICAgIGlmIG1zZzoKICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCBtc2cKICAgIHN5cy5leGl0KGNvZGUpCgoKDApkZWYgYWRkKGlkLCBzdHIsIGZ1enp5KToKICAgICJBZGQgYSBub24tZnV6enkgdHJhbnNsYXRpb24gdG8gdGhlIGRpY3Rpb25hcnkuIgogICAgZ2xvYmFsIE1FU1NBR0VTCiAgICBpZiBub3QgZnV6enkgYW5kIHN0cjoKICAgICAgICBNRVNTQUdFU1tpZF0gPSBzdHIKCgoMCmRlZiBnZW5lcmF0ZSgpOgogICAgIlJldHVybiB0aGUgZ2VuZXJhdGVkIG91dHB1dC4iCiAgICBnbG9iYWwgTUVTU0FHRVMKICAgIGtleXMgPSBNRVNTQUdFUy5rZXlzKCkKICAgICMgdGhlIGtleXMgYXJlIHNvcnRlZCBpbiB0aGUgLm1vIGZpbGUKICAgIGtleXMuc29ydCgpCiAgICBvZmZzZXRzID0gW10KICAgIGlkcyA9IHN0cnMgPSAnJwogICAgZm9yIGlkIGluIGtleXM6CiAgICAgICAgIyBGb3IgZWFjaCBzdHJpbmcsIHdlIG5lZWQgc2l6ZSBhbmQgZmlsZSBvZmZzZXQuICBFYWNoIHN0cmluZyBpcyBOVUwKICAgICAgICAjIHRlcm1pbmF0ZWQ7IHRoZSBOVUwgZG9lcyBub3QgY291bnQgaW50byB0aGUgc2l6ZS4KICAgICAgICBvZmZzZXRzLmFwcGVuZCgobGVuKGlkcyksIGxlbihpZCksIGxlbihzdHJzKSwgbGVuKE1FU1NBR0VTW2lkXSkpKQogICAgICAgIGlkcyArPSBpZCArICdcMCcKICAgICAgICBzdHJzICs9IE1FU1NBR0VTW2lkXSArICdcMCcKICAgIG91dHB1dCA9ICcnCiAgICAjIFRoZSBoZWFkZXIgaXMgNyAzMi1iaXQgdW5zaWduZWQgaW50ZWdlcnMuICBXZSBkb24ndCB1c2UgaGFzaCB0YWJsZXMsIHNvCiAgICAjIHRoZSBrZXlzIHN0YXJ0IHJpZ2h0IGFmdGVyIHRoZSBpbmRleCB0YWJsZXMuCiAgICAjIHRyYW5zbGF0ZWQgc3RyaW5nLgogICAga2V5c3RhcnQgPSA3KjQrMTYqbGVuKGtleXMpCiAgICAjIGFuZCB0aGUgdmFsdWVzIHN0YXJ0IGFmdGVyIHRoZSBrZXlzCiAgICB2YWx1ZXN0YXJ0ID0ga2V5c3RhcnQgKyBsZW4oaWRzKQogICAga29mZnNldHMgPSBbXQogICAgdm9mZnNldHMgPSBbXQogICAgIyBUaGUgc3RyaW5nIHRhYmxlIGZpcnN0IGhhcyB0aGUgbGlzdCBvZiBrZXlzLCB0aGVuIHRoZSBsaXN0IG9mIHZhbHVlcy4KICAgICMgRWFjaCBlbnRyeSBoYXMgZmlyc3QgdGhlIHNpemUgb2YgdGhlIHN0cmluZywgdGhlbiB0aGUgZmlsZSBvZmZzZXQuCiAgICBmb3IgbzEsIGwxLCBvMiwgbDIgaW4gb2Zmc2V0czoKICAgICAgICBrb2Zmc2V0cyArPSBbbDEsIG8xK2tleXN0YXJ0XQogICAgICAgIHZvZmZzZXRzICs9IFtsMiwgbzIrdmFsdWVzdGFydF0KICAgIG9mZnNldHMgPSBrb2Zmc2V0cyArIHZvZmZzZXRzCiAgICBvdXRwdXQgPSBzdHJ1Y3QucGFjaygiSWlpaWlpaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAweDk1MDQxMmRlTCwgICAgICAgIyBNYWdpYwogICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICMgVmVyc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGtleXMpLCAgICAgICAgICMgIyBvZiBlbnRyaWVzCiAgICAgICAgICAgICAgICAgICAgICAgICA3KjQsICAgICAgICAgICAgICAgIyBzdGFydCBvZiBrZXkgaW5kZXgKICAgICAgICAgICAgICAgICAgICAgICAgIDcqNCtsZW4oa2V5cykqOCwgICAjIHN0YXJ0IG9mIHZhbHVlIGluZGV4CiAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwKSAgICAgICAgICAgICAgIyBzaXplIGFuZCBvZmZzZXQgb2YgaGFzaCB0YWJsZQogICAgb3V0cHV0ICs9IGFycmF5LmFycmF5KCJpIiwgb2Zmc2V0cykudG9zdHJpbmcoKQogICAgb3V0cHV0ICs9IGlkcwogICAgb3V0cHV0ICs9IHN0cnMKICAgIHJldHVybiBvdXRwdXQKCgoMCmRlZiBtYWtlKGZpbGVuYW1lLCBvdXRmaWxlKToKICAgIElEID0gMQogICAgU1RSID0gMgoKICAgICMgQ29tcHV0ZSAubW8gbmFtZSBmcm9tIC5wbyBuYW1lIGFuZCBhcmd1bWVudHMKICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCcucG8nKToKICAgICAgICBpbmZpbGUgPSBmaWxlbmFtZQogICAgZWxzZToKICAgICAgICBpbmZpbGUgPSBmaWxlbmFtZSArICcucG8nCiAgICBpZiBvdXRmaWxlIGlzIE5vbmU6CiAgICAgICAgb3V0ZmlsZSA9IG9zLnBhdGguc3BsaXRleHQoaW5maWxlKVswXSArICcubW8nCgogICAgdHJ5OgogICAgICAgIGxpbmVzID0gb3BlbihpbmZpbGUpLnJlYWRsaW5lcygpCiAgICBleGNlcHQgSU9FcnJvciwgbXNnOgogICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIG1zZwogICAgICAgIHN5cy5leGl0KDEpCiAgICAKICAgIHNlY3Rpb24gPSBOb25lCiAgICBmdXp6eSA9IDAKCiAgICAjIFBhcnNlIHRoZSBjYXRhbG9nCiAgICBsbm8gPSAwCiAgICBmb3IgbCBpbiBsaW5lczoKICAgICAgICBsbm8gKz0gMQogICAgICAgICMgSWYgd2UgZ2V0IGEgY29tbWVudCBsaW5lIGFmdGVyIGEgbXNnc3RyLCB0aGlzIGlzIGEgbmV3IGVudHJ5CiAgICAgICAgaWYgbFswXSA9PSAnIycgYW5kIHNlY3Rpb24gPT0gU1RSOgogICAgICAgICAgICBhZGQobXNnaWQsIG1zZ3N0ciwgZnV6enkpCiAgICAgICAgICAgIHNlY3Rpb24gPSBOb25lCiAgICAgICAgICAgIGZ1enp5ID0gMAogICAgICAgICMgUmVjb3JkIGEgZnV6enkgbWFyawogICAgICAgIGlmIGxbOjJdID09ICcjLCcgYW5kIGwuZmluZCgnZnV6enknKToKICAgICAgICAgICAgZnV6enkgPSAxCiAgICAgICAgIyBTa2lwIGNvbW1lbnRzCiAgICAgICAgaWYgbFswXSA9PSAnIyc6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgIyBOb3cgd2UgYXJlIGluIGEgbXNnaWQgc2VjdGlvbiwgb3V0cHV0IHByZXZpb3VzIHNlY3Rpb24KICAgICAgICBpZiBsLnN0YXJ0c3dpdGgoJ21zZ2lkJyk6CiAgICAgICAgICAgIGlmIHNlY3Rpb24gPT0gU1RSOgogICAgICAgICAgICAgICAgYWRkKG1zZ2lkLCBtc2dzdHIsIGZ1enp5KQogICAgICAgICAgICBzZWN0aW9uID0gSUQKICAgICAgICAgICAgbCA9IGxbNTpdCiAgICAgICAgICAgIG1zZ2lkID0gbXNnc3RyID0gJycKICAgICAgICAjIE5vdyB3ZSBhcmUgaW4gYSBtc2dzdHIgc2VjdGlvbgogICAgICAgIGVsaWYgbC5zdGFydHN3aXRoKCdtc2dzdHInKToKICAgICAgICAgICAgc2VjdGlvbiA9IFNUUgogICAgICAgICAgICBsID0gbFs2Ol0KICAgICAgICAjIFNraXAgZW1wdHkgbGluZXMKICAgICAgICBsID0gbC5zdHJpcCgpCiAgICAgICAgaWYgbm90IGw6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgIyBYWFg6IERvZXMgdGhpcyBhbHdheXMgZm9sbG93IFB5dGhvbiBlc2NhcGUgc2VtYW50aWNzPwogICAgICAgIGwgPSBldmFsKGwpCiAgICAgICAgaWYgc2VjdGlvbiA9PSBJRDoKICAgICAgICAgICAgbXNnaWQgKz0gbAogICAgICAgIGVsaWYgc2VjdGlvbiA9PSBTVFI6CiAgICAgICAgICAgIG1zZ3N0ciArPSBsCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgJ1N5bnRheCBlcnJvciBvbiAlczolZCcgJSAoaW5maWxlLCBsbm8pLCBcCiAgICAgICAgICAgICAgICAgICdiZWZvcmU6JwogICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCBsCiAgICAgICAgICAgIHN5cy5leGl0KDEpCiAgICAjIEFkZCBsYXN0IGVudHJ5CiAgICBpZiBzZWN0aW9uID09IFNUUjoKICAgICAgICBhZGQobXNnaWQsIG1zZ3N0ciwgZnV6enkpCgogICAgIyBDb21wdXRlIG91dHB1dAogICAgb3V0cHV0ID0gZ2VuZXJhdGUoKQoKICAgIHRyeToKICAgICAgICBvcGVuKG91dGZpbGUsIndiIikud3JpdGUob3V0cHV0KQogICAgZXhjZXB0IElPRXJyb3IsbXNnOgogICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIG1zZwogICAgICAgICAgICAgICAgICAgICAgCgoMCmRlZiBtYWluKCk6CiAgICB0cnk6CiAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAnaFZvOicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydoZWxwJywgJ3ZlcnNpb24nLCAnb3V0cHV0LWZpbGU9J10pCiAgICBleGNlcHQgZ2V0b3B0LmVycm9yLCBtc2c6CiAgICAgICAgdXNhZ2UoMSwgbXNnKQoKICAgIG91dGZpbGUgPSBOb25lCiAgICAjIHBhcnNlIG9wdGlvbnMKICAgIGZvciBvcHQsIGFyZyBpbiBvcHRzOgogICAgICAgIGlmIG9wdCBpbiAoJy1oJywgJy0taGVscCcpOgogICAgICAgICAgICB1c2FnZSgwKQogICAgICAgIGVsaWYgb3B0IGluICgnLVYnLCAnLS12ZXJzaW9uJyk6CiAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICJtc2dmbXQucHkiLCBfX3ZlcnNpb25fXwogICAgICAgICAgICBzeXMuZXhpdCgwKQogICAgICAgIGVsaWYgb3B0IGluICgnLW8nLCAnLS1vdXRwdXQtZmlsZScpOgogICAgICAgICAgICBvdXRmaWxlID0gYXJnCiAgICAjIGRvIGl0CiAgICBpZiBub3QgYXJnczoKICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAnTm8gaW5wdXQgZmlsZSBnaXZlbicKICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiVHJ5IGBtc2dmbXQgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCiAgICAgICAgcmV0dXJuCgogICAgZm9yIGZpbGVuYW1lIGluIGFyZ3M6CiAgICAgICAgbWFrZShmaWxlbmFtZSwgb3V0ZmlsZSkKCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgbWFpbigpCg==