IyEgL3Vzci9iaW4vZW52IGJhc2gKCiMgICBDT1BZUklHSFQgTk9USUNFIFNUQVJUUyBIRVJFCiMKIyAgIENvcHlyaWdodCAyMDE4LTIwMjCpIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCiMKIyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwojICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgojICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIwojICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQojICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgojICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAojICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiMKIyAgIENPUFlSSUdIVCBOT1RJQ0UgRU5EUyBIRVJFCgojIyMgVGhpcyBzY3JpcHQgcHJlcGFyZXMgTmV4dXMgcmVwb3NpdG9yaWVzIGRhdGEgYmxvYnMgZm9yIE9OQVAKCiMjIFRoZSBzY3JpcHQgcmVxdWlyZXMgZm9sbG93aW5nIGRlcGVuZGVuY2llcyBhcmUgaW5zdGFsbGVkOiBub2RlanMsIGpxLCBkb2NrZXIsIHR3aW5lLCBleHBlY3QKIyMgQWxsIHJlcXVpcmVkIHJlc291cmNlcyBhcmUgZXhwZWN0ZWQgaW4gdGhlIHVwcGVyIGRpcmVjdG9yeSBjcmVhdGVkIGR1cmluZwojIyBkb3dubG9hZCBwcm9jZWR1cmUgYXMgREFUQV9ESVIgb3IgaW4gdGhlIGRpcmVjdG9yeSBnaXZlbiBhcyAtLWlucHV0LWRpcmVjdG9yeQojIyBBbGwgbGlzdHMgdXNlZCBtdXN0IGJlIGluIHByb2plY3QgZGF0YV9saXN0cyBkaXJlY3Rvcnkgb3IgaW4gdGhlIGRpcmVjdG9yeSBnaXZlbgojIyBhcyAtLXJlc291cmNlLWxpc3QtZGlyZWN0b3J5CgojIEZhaWwgZmFzdCBzZXR0aW5ncwpzZXQgLWUKClRJTUVTVEFNUD0iZGF0ZSArJyVZLSVtLSVkXyVILSVNLSVTJyIKU0NSSVBUX0xPRz0iL3RtcC8kKGJhc2VuYW1lICQwKV8kKGV2YWwgJHtUSU1FU1RBTVB9KS5sb2ciCgojIExvZyBldmVyeXRoaW5nCmV4ZWMgJj4gPih0ZWUgLWEgIiR7U0NSSVBUX0xPR30iKQoKIyBOZXh1cyByZXBvc2l0b3J5IHByb3BlcnRpZXMKTkVYVVNfRE9NQUlOPSJuZXh1cyIKTkVYVVNfSE9TVD0iMTI3LjAuMC4xIgpORVhVU19FWFBPU0VEX1BPUlQ9IjgwODEiCk5FWFVTX1BPUlQ9JHtORVhVU19FWFBPU0VEX1BPUlR9Ck5FWFVTX0RPQ0tFUl9FWFBPU0VEX1BPUlQ9IjgwODIiCk5FWFVTX0RPQ0tFUl9QT1JUPSR7TkVYVVNfRE9DS0VSX0VYUE9TRURfUE9SVH0KREVGQVVMVF9SRUdJU1RSWT0iZG9ja2VyLmlvIgoKIyBOZXh1cyByZXBvc2l0b3J5IGNyZWRlbnRpYWxzCk5FWFVTX1VTRVJOQU1FPWFkbWluCk5FWFVTX1BBU1NXT1JEPWFkbWluMTIzCk5FWFVTX0VNQUlMPWFkbWluQGV4YW1wbGUub3JnCgojIFNldHRpbmcgcGF0aHMKTE9DQUxfUEFUSD0iJChyZWFkbGluayAtZiAkKGRpcm5hbWUgJHswfSkpIgoKIyBEZWZhdWx0cwpET0NLRVJfTE9BRD0iZmFsc2UiCk5QTV9QVVNIPSJmYWxzZSIKUFlQSV9QVVNIPSJmYWxzZSIKREFUQV9ESVI9IiQocmVhbHBhdGggJHtMT0NBTF9QQVRIfS8uLi8uLi9yZXNvdXJjZXMpIgpORVhVU19EQVRBX0RJUj0iJHtEQVRBX0RJUn0vbmV4dXNfZGF0YSIKTElTVFNfRElSPSIke0xPQ0FMX1BBVEh9L2RhdGFfbGlzdHMiCgojIFJlcXVpcmVkIGRlcGVuZGVuY2llcwpDT01NQU5EUz0oanEgZG9ja2VyKQoKdXNhZ2UgKCkgewogICAgZWNobyAiCiAgICBVc2FnZTogJChiYXNlbmFtZSAkMCkgW09QVElPTi4uLl0gW0ZJTEVdLi4uCgogICAgVGhpcyBzY3JpcHQgcHJlcGFyZXMgTmV4dXMgcmVwb3NpdG9yaWVzIGRhdGEgYmxvYnMgZm9yIE9OQVAKCiAgICBGb2xsb3dpbmcgZGVwZW5kZW5jaWVzIGFyZSByZXF1aXJlZDogbm9kZWpzLCBqcSwgZG9ja2VyLCB0d2luZSwgZXhwZWN0CiAgICBCeSBkZWZhdWx0LCB3aXRob3V0IGFueSBsaXN0cyBvciBkaXJzIHByb3ZpZGVkLCB0aGUgcmVzb3VyY2VzIGFyZSBleHBlY3RlZCBhcyBkb3dubG9hZGVkCiAgICBkdXJpbmcgZG93bmxvYWQgcHJvY2VzcyBhbmQgZGVmYXVsdCBsaXN0cyB3aWxsIGJlIHVzZWQgdG8gYnVpbGQgdGhlIE5leHVzIGJsb2IgaW4gdGhlIHNhbWUKICAgIHJlc291cmNlcyBkaXIKCiAgICBFeGFtcGxlczoKICAgICAgICAkKGJhc2VuYW1lICQwKSAtLWlucHV0LWRpcmVjdG9yeSA8L3BhdGgvdG8vZG93bmxvYWRlZC9maWxlcy9kaXI+IC1sZCAtLW91dHB1dC1kaXJlY3RvcnkKICAgICAgICAgICA8L3BhdGgvdG8vb3V0cHV0L2Rpcj4gLS1yZXNvdXJjZS1saXN0LWRpcmVjdG9yeSA8L3BhdGgvdG8vZGlyL3dpdGgvcmVzb3VyY2UvbGlzdD4KICAgICAgICAgICAjIERvY2tlciBpbWFnZXMsIG5wbXMgYW5kIHB5cGkgcGFja2FnZXMgd2lsbCBiZSBsb2FkZWQgZnJvbSBzcGVjaWZpZWQgZGlyZWN0b3J5CiAgICAgICAgICAgIyBhbmQgdGhlIGJsb2IgaXMgY3JlYXRlZAogICAgICAgICQoYmFzZW5hbWUgJDApIC1kIDwvcGF0aC90by9kb2NrZXIvaW1hZ2VzL2xpc3Q+IC1kIDwvcGF0aC90by9hbm90aGVyL2RvY2tlci9pbWFnZXMvbGlzdD4KICAgICAgICAtbiA8L3BhdGgvdG8vbnBtL2xpc3Q+IC1wIDwvcGF0aC90by9waXAvbGlzdD4KICAgICAgICAgICAjIERvY2tlciBpbWFnZXMsIG5wbXMgYW5kIHB5cGkgcGFja2FnZXMgd2lsbCBiZSBwdXNoZWQgdG8gTmV4dXMgYmFzZWQgYW5kIHByb3ZpZGVkIGRhdGEKICAgICAgICAgICAjIGxpc3RzIChtdWx0aXBsZSBsaXN0cyBjYW4gYmUgcHJvdmlkZWQpCgogICAgIC1kICB8IC0tZG9ja2VyICAgICAgICAgICAgICAgICAgICAgdXNlIHNwZWNpZmljIGxpc3Qgb2YgZG9ja2VyIGltYWdlcyB0byBiZSBwdXNoZWQgaW50byBOZXh1cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluIGNhc2Ugb2YgLWxkIHVzZWQsIHRoaXMgbGlzdCB3aWxsIGJlIHVzZWQgZm9yIGxvYWRpbmcgb2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbWFnZXMpCiAgICAgLWggIHwgLS1oZWxwICAgICAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIHVzYWdlCiAgICAgLWkgIHwgLS1pbnB1dC1kaXJlY3RvcnkgICAgICAgICAgICB1c2Ugc3BlY2lmaWMgZGlyZWN0b3J5IGNvbnRhaW5pbmcgcmVzb3VyY2VzIG5lZWRlZCB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlIG5leHVzIGJsb2IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBzdHJ1Y3R1cmUgb2YgdGhpcyBkaXJlY3RvcnkgbXVzdCBvcmdhbml6ZWQgYXMgZGVzY3JpYmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBidWlsZCBndWlkZQogICAgIC1sZCB8IC0tbG9hZC1kb2NrZXItaW1hZ2VzICAgICAgICAgbG9hZCBkb2NrZXIgaW1hZ2VzIGZyb20gcmVzb3VyY2UgZGlyZWN0b3J5CiAgICAgLW4gIHwgLS1ucG0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0IG9mIG5wbSBwYWNrYWdlcyB0byBiZSBwdXNoZWQgaW50byBOZXh1cwogICAgIC1vICB8IC0tb3V0cHV0LWRpcmVjdG9yeSAgICAgICAgICAgdXNlIHNwZWNpZmljIGRpcmVjdG9yeSBmb3IgdGhlIHRhcmdldCBibG9iCiAgICAgLXAgIHwgLS1weXBpICAgICAgICAgICAgICAgICAgICAgICB1c2Ugc3BlY2lmaWMgbGlzdCBvZiBweXBpIHBhY2thZ2VzIHRvIGJlIHB1c2hlZCBpbnRvIE5leHVzCiAgICAgLXJsIHwgLS1yZXNvdXJjZS1saXN0LWRpcmVjdG9yeSAgICB1c2Ugc3BlY2lmaWMgZGlyZWN0b3J5IHdpdGggZG9ja2VyLCBweXBpIGFuZCBucG0gbGlzdHMKICAgICAtYyAgfCAtLWNvbnRhaW5lci1uYW1lICAgICAgICAgICAgIHVzZSBzcGVjaWZpYyBOZXh1cyBkb2NrZXIgY29udGFpbmVyIG5hbWUKICAgICAtTlAgfCAtLW5leHVzLXBvcnQgICAgICAgICAgICAgICAgIHVzZSBzcGVjaWZpYyBwb3J0IGZvciBwdWJsaXNoZWQgTmV4dXMgc2VydmljZQogICAgIC1EUCB8IC0tZG9ja2VyLXBvcnQgICAgICAgICAgICAgICAgdXNlIHNwZWNpZmljIHBvcnQgZm9yIHB1Ymxpc2hlZCBOZXh1cyBkb2NrZXIgcmVnaXN0cnkgcG9ydAogICAgIgogICAgZXhpdCAxCn0KCmxvYWRfZG9ja2VyX2ltYWdlcyAoKSB7CiAgICBmb3IgQVJDSElWRSBpbiAkKHNlZCAkJ3MvXHIvLyA7IC9eIy9kIDsgcy9cOi9cXy9nIDsgcy9cLy9cXy9nIDsgcy8kL1wudGFyL2cnICR7MX0gfCBhd2sgJ3sgcHJpbnQgJDEgfScpOyBkbwogICAgICAgIGRvY2tlciBsb2FkIC1pICR7TlhTX1NSQ19ET0NLRVJfSU1HX0RJUn0vJHtBUkNISVZFfQogICAgZG9uZQp9CgpwcmVwYXJlX25wbSAoKSB7CiAgICAjIENvbmZpZ3VyZSBOUE0gcmVnaXN0cnkgdG8gb3VyIE5leHVzIHJlcG9zaXRvcnkKICAgIGVjaG8gIkNvbmZpZ3VyZSBOUE0gcmVnaXN0cnkgdG8gJHtOUE1fUkVHSVNUUll9IgogICAgbnBtIGNvbmZpZyBzZXQgcmVnaXN0cnkgIiR7TlBNX1JFR0lTVFJZfSIKCiAgICAjIExvZ2luIHRvIE5QTSByZWdpc3RyeQogICAgL3Vzci9iaW4vZXhwZWN0IDw8LSBFT0YKCXNwYXduIG5wbSBsb2dpbgoJZXhwZWN0ICJVc2VybmFtZToiCglzZW5kICIke05FWFVTX1VTRVJOQU1FfVxuIgoJZXhwZWN0ICJQYXNzd29yZDoiCglzZW5kICIke05FWFVTX1BBU1NXT1JEfVxuIgoJZXhwZWN0IEVtYWlsOgoJc2VuZCAiJHtORVhVU19FTUFJTH1cbiIKCWV4cGVjdCBlb2YKCUVPRgp9CgpwYXRjaF9ucG0gKCkgewogICAgIyBQYXRjaCBwcm9ibGVtYXRpYyBwYWNrYWdlCiAgICBQQVRDSEVEX05QTT0iJChncmVwIHRzc2NtcCAkezF9IHwgc2VkICQncy9cci8vIDsgcy9cXEAvXC0vIDsgcy8kL1wudGd6LycpIgogICAgaWYgW1sgISAteiAiJHtQQVRDSEVEX05QTX0iIF1dICYmICEgemdyZXAgLWFxICIke05QTV9SRUdJU1RSWX0iICIke1BBVENIRURfTlBNfSIgMj4vZGV2L251bGwKICAgIHRoZW4KICAgICAgICB0YXIgeHpmICIke1BBVENIRURfTlBNfSIKICAgICAgICBybSAtZiAiJHtQQVRDSEVEX05QTX0iCiAgICAgICAgc2VkIC1pICdzfFwicmVnaXN0cnlcIjpcIFwiLipcInxcInJlZ2lzdHJ5XCI6XCBcIiciJHtOUE1fUkVHSVNUUll9IidcInxnJyBwYWNrYWdlL3BhY2thZ2UuanNvbgogICAgICAgIHRhciAtemNmICIke1BBVENIRURfTlBNfSIgcGFja2FnZQogICAgICAgIHJtIC1yZiBwYWNrYWdlCiAgICBmaQp9CgpwdXNoX25wbSAoKSB7CiAgICBmb3IgQVJDSElWRSBpbiAkKHNlZCAkJ3MvXHIvLyA7IHMvXFxAL1wtL2cgOyBzLyQvXC50Z3ovZycgJHsxfSk7IGRvCiAgICAgICAgbnBtIHB1Ymxpc2ggLS1hY2Nlc3MgcHVibGljICR7QVJDSElWRX0gPiAvZGV2L251bGwKICAgICAgICBlY2hvICJOUE0gJHtBUkNISVZFfSBwdXNoZWQgdG8gTmV4dXMiCiAgICBkb25lCn0KCnB1c2hfcGlwICgpIHsKICAgIGZvciBQQUNLQUdFIGluICQoc2VkICQncy9cci8vOyBzLz09Ly0vJyAkezF9KTsgZG8KICAgICAgICB0d2luZSB1cGxvYWQgLXUgIiR7TkVYVVNfVVNFUk5BTUV9IiAtcCAiJHtORVhVU19QQVNTV09SRH0iIC0tcmVwb3NpdG9yeS11cmwgJHtQWVBJX1JFR0lTVFJZfSAke1BBQ0tBR0V9KiA+IC9kZXYvbnVsbAogICAgICAgIGVjaG8gIlBZUEkgJHtQQUNLQUdFfSBwdXNoZWQgdG8gTmV4dXMiCiAgICBkb25lCn0KCmRvY2tlcl9sb2dpbiAoKSB7CiAgICBlY2hvICJEb2NrZXIgbG9naW4gdG8gJHtET0NLRVJfUkVHSVNUUll9IgogICAgZWNobyAtbiAiJHtORVhVU19QQVNTV09SRH0iIHwgZG9ja2VyIC0tY29uZmlnICIke0RPQ0tFUl9DT05GSUdfRElSfSIgbG9naW4gLXUgIiR7TkVYVVNfVVNFUk5BTUV9IiAtLXBhc3N3b3JkLXN0ZGluICR7RE9DS0VSX1JFR0lTVFJZfSA+IC9kZXYvbnVsbAp9CgpwdXNoX2RvY2tlciAoKSB7CiAgICBmb3IgSU1BR0UgaW4gJChzZWQgJCdzL1xyLy8gOyAvXiMvZCcgJHsxfSB8IGF3ayAneyBwcmludCAkMSB9Jyk7IGRvCiAgICAgICAgUFVTSD0iIgogICAgICAgIGlmIFtbICR7SU1BR0V9ICE9ICoiLyIqIF1dOyB0aGVuCiAgICAgICAgICAgIFBVU0g9IiR7RE9DS0VSX1JFR0lTVFJZfS9saWJyYXJ5LyR7SU1BR0V9IgogICAgICAgIGVsaWYgW1sgJHtJTUFHRX0gPT0gKiIke0RFRkFVTFRfUkVHSVNUUll9IiogXV07IHRoZW4KICAgICAgICAgICAgaWYgW1sgJHtJTUFHRX0gPT0gKiIvIioiLyIqIF1dOyB0aGVuCiAgICAgICAgICAgICAgICBQVVNIPSIkKHNlZCAncy8nIiR7REVGQVVMVF9SRUdJU1RSWX0iJy8nIiR7RE9DS0VSX1JFR0lTVFJZfSInLycgPDw8ICR7SU1BR0V9KSIKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgUFVTSD0iJChzZWQgJ3MvJyIke0RFRkFVTFRfUkVHSVNUUll9IicvJyIke0RPQ0tFUl9SRUdJU1RSWX0iJ1wvbGlicmFyeS8nIDw8PCAke0lNQUdFfSkiCiAgICAgICAgICAgIGZpCiAgICAgICAgZWxpZiBbWyAteiAkKHNlZCAtbiAnL1wuW14vXS4qXC8vcCcgPDw8ICR7SU1BR0V9KSBdXTsgdGhlbgogICAgICAgICAgICBQVVNIPSIke0RPQ0tFUl9SRUdJU1RSWX0vJHtJTUFHRX0iCiAgICAgICAgZWxzZQogICAgICAgICAgICAjIHN1YnN0aXR1dGUgYWxsIGhvc3QgbmFtZXMgd2l0aCAkRE9DS0VSX1JFR0lTVFJZCiAgICAgICAgICAgIHJlcG9faG9zdD0kKHNlZCAtZSAncy9cLy4qJC8vJyA8PDwgJHtJTUFHRX0pCiAgICAgICAgICAgIFBVU0g9IiQoc2VkIC1lICdzLyciJHtyZXBvX2hvc3R9IicvJyIke0RPQ0tFUl9SRUdJU1RSWX0iJy8nIDw8PCAke0lNQUdFfSkiCiAgICAgICAgZmkKICAgICAgICBkb2NrZXIgdGFnICR7SU1BR0V9ICR7UFVTSH0KICAgICAgICBkb2NrZXIgLS1jb25maWcgIiR7RE9DS0VSX0NPTkZJR19ESVJ9IiBwdXNoICR7UFVTSH0KICAgICAgICAjIFJlbW92ZSBjcmVhdGVkIHRhZwogICAgICAgIGRvY2tlciBybWkgJHtQVVNIfQogICAgICAgIGVjaG8gIiR7SU1BR0V9IHB1c2hlZCBhcyAke1BVU0h9IHRvIE5leHVzIgogICAgZG9uZQp9Cgp2YWxpZGF0ZV9jb250YWluZXJfbmFtZSAoKSB7CiAgICAjIFZlcmlmeSAkMSBpcyBhIHZhbGlkIGhvc3RuYW1lCiAgICBpZiAhIGVjaG8gIiR7MX0iIHwgZWdyZXAgLXEgIl4oKFthLXpBLVowLTldfFthLXpBLVowLTldW2EtekEtWjAtOVwtXSpbYS16QS1aMC05XSlcLikqKFtBLVphLXowLTldfFtBLVphLXowLTldW0EtWmEtejAtOVwtXSpbQS1aYS16MC05XSkkIjsKICAgIHRoZW4KICAgICAgICBlY2hvICJFUlJPUjogJHsxfSBpcyBub3QgYSB2YWxpZCBuYW1lISIKICAgICAgICBleGl0IDE7CiAgICBmaQp9Cgp3aGlsZSBbICIkezF9IiAhPSAiIiBdOyBkbwogICAgY2FzZSAkezF9IGluCiAgICAgICAgLWQgfCAtLWRvY2tlciApICAgICAgICAgICAgICAgICAgICBzaGlmdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlhTX0RPQ0tFUl9JTUdfTElTVFMrPSgiJChyZWFscGF0aCAkezF9KSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OwogICAgICAgIC1pIHwgLS1pbnB1dC1kaXJlY3RvcnkgKSAgICAgICAgICAgc2hpZnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEFfRElSPSIkKHJlYWxwYXRoICR7MX0pIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsKICAgICAgICAtbGQgfCAtLWxvYWQtZG9ja2VyLWltYWdlcyApICAgICAgIERPQ0tFUl9MT0FEPSJ0cnVlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsKICAgICAgICAtbiB8IC0tbnBtICkgICAgICAgICAgICAgICAgICAgICAgIE5QTV9QVVNIPSJ0cnVlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORFMrPShleHBlY3QgbnBtKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5YU19OUE1fTElTVFMrPSgiJChyZWFscGF0aCAkezF9KSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OwogICAgICAgIC1jIHwgLS1jb250YWluZXItbmFtZSApICAgICAgICAgICAgc2hpZnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlX2NvbnRhaW5lcl9uYW1lICIkezF9IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVYVVNfRE9NQUlOPSIkezF9IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsKICAgICAgICAtbyB8IC0tb3V0cHV0LWRpcmVjdG9yeSApICAgICAgICAgIHNoaWZ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVhVU19EQVRBX0RJUj0iJChyZWFscGF0aCAkezF9KSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7CiAgICAgICAgLXAgfCAtLXB5cGkgKSAgICAgICAgICAgICAgICAgICAgICBQWVBJX1BVU0g9InRydWUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EUys9KHR3aW5lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5YU19QWVBJX0xJU1RTKz0oIiQocmVhbHBhdGggJHsxfSkiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsKICAgICAgICAtcmwgfCAtLXJlc291cmNlLWxpc3QtZGlyZWN0b3J5ICkgIHNoaWZ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSVNUU19ESVI9IiQocmVhbHBhdGggJHsxfSkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OwogICAgICAgIC1OUCB8IC0tbmV4dXMtcG9ydCApICAgICAgICAgICAgICAgc2hpZnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FWFVTX1BPUlQ9IiR7MX0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OwogICAgICAgIC1EUCB8IC0tZG9ja2VyLXBvcnQgKSAgICAgICAgICAgICAgc2hpZnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FWFVTX0RPQ0tFUl9QT1JUPSIkezF9IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsKICAgICAgICAtaCB8IC0taGVscCApICAgICAgICAgICAgICAgICAgICAgIHVzYWdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OwogICAgICAgICopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7CiAgICBlc2FjCiAgICBzaGlmdApkb25lCgojIFZlcmlmeSBhbGwgZGVwZW5kZW5jaWVzIGFyZSBhdmFpbGFibGUgaW4gUEFUSApGQUlMRURfQ09NTUFORFM9KCkKZm9yIGNtZCBpbiAke0NPTU1BTkRTWypdfTsgZG8KICAgIGNvbW1hbmQgLXYgJGNtZCA+L2Rldi9udWxsIDI+JjEgfHwgRkFJTEVEX0NPTU1BTkRTKz0oJGNtZCkKZG9uZQoKaWYgWyAkeyNGQUlMRURfQ09NTUFORFNbKl19IC1ndCAwIF07IHRoZW4KICAgIGVjaG8gIkZvbGxvd2luZyBjb21tYW5kcyB3aGVyZSBub3QgZm91bmQgaW4gUEFUSCBhbmQgYXJlIHJlcXVpcmVkOiIKICAgIGVjaG8gJHtGQUlMRURfQ09NTUFORFNbKl19CiAgICBlY2hvICJBYm9ydGluZy4iCiAgICBleGl0IDEKZmkKCiMgTmV4dXMgcmVwb3NpdG9yeSBsb2NhdGlvbnMKTlBNX1JFR0lTVFJZPSJodHRwOi8vJHtORVhVU19IT1NUfToke05FWFVTX1BPUlR9L3JlcG9zaXRvcnkvbnBtLXByaXZhdGUvIgpQWVBJX1JFR0lTVFJZPSJodHRwOi8vJHtORVhVU19IT1NUfToke05FWFVTX1BPUlR9L3JlcG9zaXRvcnkvcHlwaS1wcml2YXRlLyIKRE9DS0VSX1JFR0lTVFJZPSIke05FWFVTX0hPU1R9OiR7TkVYVVNfRE9DS0VSX1BPUlR9IgoKIyBTZXR1cCBkaXJlY3RvcmllcyB3aXRoIHJlc291cmNlcyBmb3IgZG9ja2VyLCBucG0gYW5kIHB5cGkKTlhTX1NSQ19ET0NLRVJfSU1HX0RJUj0iJHtEQVRBX0RJUn0vb2ZmbGluZV9kYXRhL2RvY2tlcl9pbWFnZXNfZm9yX25leHVzIgpOWFNfU1JDX05QTV9ESVI9IiR7REFUQV9ESVJ9L29mZmxpbmVfZGF0YS9ucG1fdGFyIgpOWFNfU1JDX1BZUElfRElSPSIke0RBVEFfRElSfS9vZmZsaW5lX2RhdGEvcHlwaSIKCiMgU2V0dXAgc3BlY2lmaWMgcmVzb3VyY2VzIGxpc3RzCk5YU19JTkZSQV9MSVNUPSIke0xJU1RTX0RJUn0vaW5mcmFfZG9ja2VyX2ltYWdlcy5saXN0IgpOWFNfRE9DS0VSX0lNR19MSVNUPSIke0xJU1RTX0RJUn0vb25hcF9kb2NrZXJfaW1hZ2VzLmxpc3QiCk5YU19SS0VfRE9DS0VSX0lNR19MSVNUPSIke0xJU1RTX0RJUn0vcmtlX2RvY2tlcl9pbWFnZXMubGlzdCIKTlhTX0s4U19ET0NLRVJfSU1HX0xJU1Q9IiR7TElTVFNfRElSfS9rOHNfZG9ja2VyX2ltYWdlcy5saXN0IgpOWFNfUFJPTUVUSEVVU19ET0NLRVJfSU1HX0xJU1Q9IiR7TElTVFNfRElSfS9rdWJlX3Byb21ldGhldXNfc3RhY2tfZG9ja2VyX2ltYWdlcy5saXN0IgoKIyBTZXR1cCBOZXh1cyBpbWFnZSB1c2VkIGZvciBidWlsZCBhbmQgaW5zdGFsbCBpbmZyYQpORVhVU19JTUFHRT0iJChncmVwIHNvbmF0eXBlL25leHVzMyAke05YU19JTkZSQV9MSVNUfSkiCk5FWFVTX0lNQUdFX1RBUj0iJHtEQVRBX0RJUn0vb2ZmbGluZV9kYXRhL2RvY2tlcl9pbWFnZXNfaW5mcmEvJChzZWQgJ3MvXC8vXF8vIDsgcy8kL1wudGFyLyA7IHMvXDovXF8vJyA8PDwgJHtORVhVU19JTUFHRX0pIgoKIyBTZXQgZGVmYXVsdCBsaXN0cyBpZiBub3RoaW5nIHNwZWNpZmljIGRlZmluZWQgYnkgdXNlcgppZiBbICR7I05YU19ET0NLRVJfSU1HX0xJU1RTW0BdfSAtZXEgMCBdOyB0aGVuCiAgICBOWFNfRE9DS0VSX0lNR19MSVNUUz0oIiR7TlhTX0RPQ0tFUl9JTUdfTElTVH0iICIke05YU19SS0VfRE9DS0VSX0lNR19MSVNUfSIgIiR7TlhTX0s4U19ET0NLRVJfSU1HX0xJU1R9IiAiJHtOWFNfUFJPTUVUSEVVU19ET0NLRVJfSU1HX0xJU1R9IikKZmkKCiMgQ3JlYXRlIERvY2tlciBjbGllbnQgY29uZmlnIGRpcgpET0NLRVJfQ09ORklHX0RJUj0kKG1rdGVtcCAtcCAvdG1wIC1kIC5kb2NrZXIuWFhYWFhYWFgpCgojIFNldHVwIGRlZmF1bHQgcG9ydHMgcHVibGlzaGVkIHRvIGhvc3QgYXMgZG9ja2VyIHJlZ2lzdHJ5ClBVQkxJU0hFRF9QT1JUUz0iLXAgJHtORVhVU19QT1JUfToke05FWFVTX0VYUE9TRURfUE9SVH0gLXAgJHtORVhVU19ET0NLRVJfUE9SVH06JHtORVhVU19ET0NLRVJfRVhQT1NFRF9QT1JUfSIKCiMgTmV4dXMgcmVwb3NpdG9yeSBjb25maWd1cmF0aW9uIHNldHVwCk5FWFVTX0NPTkZJR19HUk9PVlk9J2ltcG9ydCBvcmcuc29uYXR5cGUubmV4dXMuc2VjdXJpdHkucmVhbG0uUmVhbG1NYW5hZ2VyCmltcG9ydCBvcmcuc29uYXR5cGUubmV4dXMucmVwb3NpdG9yeS5hdHRyaWJ1dGVzLkF0dHJpYnV0ZXNGYWNldAppbXBvcnQgb3JnLnNvbmF0eXBlLm5leHVzLnNlY3VyaXR5LnVzZXIuVXNlck1hbmFnZXIKaW1wb3J0IG9yZy5zb25hdHlwZS5uZXh1cy5yZXBvc2l0b3J5Lm1hbmFnZXIuUmVwb3NpdG9yeU1hbmFnZXIKaW1wb3J0IG9yZy5zb25hdHlwZS5uZXh1cy5zZWN1cml0eS51c2VyLlVzZXJOb3RGb3VuZEV4Y2VwdGlvbgovKiBVc2UgdGhlIGNvbnRhaW5lciB0byBsb29rIHVwIHNvbWUgc2VydmljZXMuICovCnJlYWxtTWFuYWdlciA9IGNvbnRhaW5lci5sb29rdXAoUmVhbG1NYW5hZ2VyLmNsYXNzKQp1c2VyTWFuYWdlciA9IGNvbnRhaW5lci5sb29rdXAoVXNlck1hbmFnZXIuY2xhc3MsICJkZWZhdWx0IikgLy9kZWZhdWx0IHVzZXIgbWFuYWdlcgpyZXBvc2l0b3J5TWFuYWdlciA9IGNvbnRhaW5lci5sb29rdXAoUmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MpCi8qIE1hbmFnZXJzIGFyZSB1c2VkIHdoZW4gc2NyaXB0aW5nIGFwaSBjYW5ub3QuIE5vdGUgdGhhdCBzY3JpcHRpbmcgYXBpIGNhbiBvbmx5IGNyZWF0ZSBtb3N0bHksIGFuZCB0aGF0IGNyZWF0aW9uIG1ldGhvZHMgcmV0dXJuIG9iamVjdHMgb2YgY3JlYXRlZCBlbnRpdGllcy4gKi8KLyogUGVyZm9ybSBjbGVhbnVwIGJ5IHJlbW92aW5nIGFsbCByZXBvcyBhbmQgdXNlcnMuIFJlYWxtcyBkbyBub3QgbmVlZCB0byBiZSByZS1kaXNhYmxlZCwgYWRtaW4gYW5kIGFub255bW91cyB1c2VyIHdpbGwgbm90IGJlIHJlbW92ZWQuICovCnVzZXJNYW5hZ2VyLmxpc3RVc2VySWRzKCkuZWFjaCh7IGlkIC0+CiAgICBpZiAoaWQgIT0gImFub255bW91cyIgJiYgaWQgIT0gImFkbWluIikKICAgICAgICB1c2VyTWFuYWdlci5kZWxldGVVc2VyKGlkKQp9KQpyZXBvc2l0b3J5TWFuYWdlci5icm93c2UoKS5lYWNoIHsKICAgIHJlcG9zaXRvcnlNYW5hZ2VyLmRlbGV0ZShpdC5nZXROYW1lKCkpCn0KLyogQWRkIGJlYXJlciB0b2tlbiByZWFsbXMgYXQgdGhlIGVuZCBvZiByZWFsbSBsaXN0cy4uLiAqLwpyZWFsbU1hbmFnZXIuZW5hYmxlUmVhbG0oIk5wbVRva2VuIikKcmVhbG1NYW5hZ2VyLmVuYWJsZVJlYWxtKCJEb2NrZXJUb2tlbiIpCnJlYWxtTWFuYWdlci5lbmFibGVSZWFsbSgiUHlwaVRva2VuIikKLyogQ3JlYXRlIHRoZSBkb2NrZXIgdXNlci4gKi8Kc2VjdXJpdHkuYWRkVXNlcigiZG9ja2VyIiwgImRvY2tlciIsICJkb2NrZXIiLCAiZG9ja2VyQGV4YW1wbGUuY29tIiwgdHJ1ZSwgImRvY2tlciIsIFsibngtYW5vbnltb3VzIl0pCi8qIENyZWF0ZSBkb2NrZXIsIG5wbSBhbmQgcHlwaSByZXBvc2l0b3JpZXMuIFRoZWlyIGRlZmF1bHQgY29uZmlndXJhdGlvbiBzaG91bGQgYmUgY29tcGxpYW50IHdpdGggb3VyIHJlcXVpcmVtZW50cywgZXhjZXB0IHRoZSBkb2NrZXIgcmVnaXN0cnkgY3JlYXRpb24uICovCnJlcG9zaXRvcnkuY3JlYXRlTnBtSG9zdGVkKCJucG0tcHJpdmF0ZSIpCnJlcG9zaXRvcnkuY3JlYXRlUHlQaUhvc3RlZCgicHlwaS1wcml2YXRlIikKZGVmIHIgPSByZXBvc2l0b3J5LmNyZWF0ZURvY2tlckhvc3RlZCgib25hcCIsIDgwODIsIDApCi8qIGZvcmNlIGJhc2ljIGF1dGhlbnRpY2F0aW9uIHRydWUgYnkgZGVmYXVsdCwgbXVzdCBzZXQgdG8gZmFsc2UgZm9yIGRvY2tlciByZXBvLiAqLwpjb25mPXIuZ2V0Q29uZmlndXJhdGlvbigpCmNvbmYuYXR0cmlidXRlcygiZG9ja2VyIikuc2V0KCJmb3JjZUJhc2ljQXV0aCIsIGZhbHNlKQpyZXBvc2l0b3J5TWFuYWdlci51cGRhdGUoY29uZiknCgojIFByZXBhcmUgdGhlIE5leHVzIGNvbmZpZ3VyYXRpb24KTkVYVVNfQ09ORklHPSQoZWNobyAiJHtORVhVU19DT05GSUdfR1JPT1ZZfSIgfCBqcSAtUnNjICAneyJuYW1lIjoiY29uZmlndXJlIiwgInR5cGUiOiJncm9vdnkiLCAiY29udGVudCI6Ln0nKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgRG9ja2VyIHJlcG9zaXRvcnkgcHJlcGFyYXRpb24gIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmlmIFsgIiR7RE9DS0VSX0xPQUR9IiA9PSAidHJ1ZSIgXTsgdGhlbgogICAgIyBMb2FkIHByZWRlZmluZWQgTmV4dXMgaW1hZ2UKICAgIGRvY2tlciBsb2FkIC1pICR7TkVYVVNfSU1BR0VfVEFSfQogICAgIyBMb2FkIGFsbCBuZWNlc3NhcnkgaW1hZ2VzCiAgICBmb3IgRE9DS0VSX0lNR19MSVNUIGluICIke05YU19ET0NLRVJfSU1HX0xJU1RTW0BdfSI7IGRvCiAgICAgICAgbG9hZF9kb2NrZXJfaW1hZ2VzICIke0RPQ0tFUl9JTUdfTElTVH0iCiAgICBkb25lCmZpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIE5leHVzIHJlcG9zaXRvcnkgcHJlcGFyYXRpb24gIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBQcmVwYXJlIG5leHVzLWRhdGEgZGlyZWN0b3J5CmlmIFsgLWQgJHtORVhVU19EQVRBX0RJUn0gXTsgdGhlbgogICBpZiBbICIkKGRvY2tlciBwcyAtcSAtZiBuYW1lPSIke05FWFVTX0RPTUFJTn0iKSIgXTsgdGhlbgogICAgICAgZWNobyAiUmVtb3ZpbmcgY29udGFpbmVyICR7TkVYVVNfRE9NQUlOfSIKICAgICAgIGRvY2tlciBybSAtZiAkKGRvY2tlciBwcyAtYXEgLWYgbmFtZT0iJHtORVhVU19ET01BSU59IikKICAgZmkKICAgcHVzaGQgJHtORVhVU19EQVRBX0RJUn0vLi4KICAgTlhTX0JBQ0tVUD0iJChldmFsICR7VElNRVNUQU1QfSlfJChiYXNlbmFtZSAke05FWFVTX0RBVEFfRElSfSlfYmsiCiAgIG12ICR7TkVYVVNfREFUQV9ESVJ9ICIke05YU19CQUNLVVB9IgogICBlY2hvICIke05FWFVTX0RBVEFfRElSfSBhbHJlYWR5IGV4aXN0cyAtIGJhY2tpbmcgdXAgdG8gJHtOWFNfQkFDS1VQfSIKICAgcG9wZApmaQoKbWtkaXIgLXAgJHtORVhVU19EQVRBX0RJUn0KY2hvd24gMjAwOjIwMCAke05FWFVTX0RBVEFfRElSfQpjaG1vZCA3NzcgJHtORVhVU19EQVRBX0RJUn0KCiMgU2F2ZSBOZXh1cyB2ZXJzaW9uIHRvIHByZXZlbnQvY2F0Y2ggZGF0YSBpbmNvbXBhdGliaWxpdHkKIyBBZGRpbmcgY29tbWl0IGluZm9ybWF0aW9ucyB0byBoYXZlIGxpbmsgdG8gZGF0YSBmcm9tIHdoaWNoIHRoZSBibG9iIHdhcyBidWlsdApjYXQgPj4gJHtORVhVU19EQVRBX0RJUn0vbmV4dXMudmVyIDw8IElORk8KbmV4dXNfaW1hZ2U9JChkb2NrZXIgaW1hZ2UgbHMgJHtORVhVU19JTUFHRX0gLS1uby10cnVuYyAtLWZvcm1hdCAie3suUmVwb3NpdG9yeX19Ont7LlRhZ319XG5uZXh1c19pbWFnZV9kaWdlc3Q9e3suSUR9fSIpCiQoZm9yIElOREVYIGluICR7IU5YU19ET0NLRVJfSU1HX0xJU1RTW0BdfTsgZG8gcHJpbnRmICd1c2VkX2ltYWdlX2xpc3Qlcz0lc1xuJyAiJElOREVYIiAiJChzZWQgJ3MvXi4qXC9cKC4qXCkkL1wxLycgPDw8ICR7TlhTX0RPQ0tFUl9JTUdfTElTVFNbJElOREVYXX0pIjsgZG9uZSkKJChzZWQgLW4gJ3MvXi4qT09NXCBjb21taXRcIC9vb21fcmVwb19jb21taXQ9L3AnICR7TlhTX0RPQ0tFUl9JTUdfTElTVFNbQF19KQppbnN0YWxsZXJfcmVwb19jb21taXQ9JChnaXQgLS1naXQtZGlyPSIke0xPQ0FMX1BBVEh9Ly4uLy5naXQiIHJldi1wYXJzZSBIRUFEKQpJTkZPCgojIFN0YXJ0IHRoZSBOZXh1cwpORVhVU19DT05UX0lEPSQoZG9ja2VyIHJ1biAtZCAtLXJtIC12ICR7TkVYVVNfREFUQV9ESVJ9Oi9uZXh1cy1kYXRhOnJ3IC0tbmFtZSAke05FWFVTX0RPTUFJTn0gJHtQVUJMSVNIRURfUE9SVFN9ICR7TkVYVVNfSU1BR0V9KQplY2hvICJXYWl0aW5nIGZvciBOZXh1cyB0byBmdWxseSBzdGFydCIKdW50aWwgY3VybCAtc3UgJHtORVhVU19VU0VSTkFNRX06JHtORVhVU19QQVNTV09SRH0gaHR0cDovLyR7TkVYVVNfSE9TVH06JHtORVhVU19QT1JUfS9zZXJ2aWNlL21ldHJpY3MvaGVhbHRoY2hlY2sgfCBncmVwICciaGVhbHRoeSI6dHJ1ZScgPiAvZGV2L251bGwgOyBkbwogICAgcHJpbnRmICIuIgogICAgc2xlZXAgMwpkb25lCmVjaG8gLWUgIlxuTmV4dXMgc3RhcnRlZCIKCiMgQ29uZmlndXJlIHRoZSBuZXh1cyByZXBvc2l0b3J5CmN1cmwgLXNYIFBPU1QgLS1oZWFkZXIgJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbicgLS1kYXRhLWJpbmFyeSAiJHtORVhVU19DT05GSUd9IiBodHRwOi8vJHtORVhVU19VU0VSTkFNRX06JHtORVhVU19QQVNTV09SRH1AJHtORVhVU19IT1NUfToke05FWFVTX1BPUlR9L3NlcnZpY2UvcmVzdC92MS9zY3JpcHQKY3VybCAtc1ggUE9TVCAtLWhlYWRlciAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluIiBodHRwOi8vJHtORVhVU19VU0VSTkFNRX06JHtORVhVU19QQVNTV09SRH1AJHtORVhVU19IT1NUfToke05FWFVTX1BPUlR9L3NlcnZpY2UvcmVzdC92MS9zY3JpcHQvY29uZmlndXJlL3J1biA+IC9kZXYvbnVsbAoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgUG9wdWxhdGUgTlBNIHJlcG9zaXRvcnkgIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKaWYgWyAkTlBNX1BVU0ggPT0gInRydWUiIF07IHRoZW4KICAgIHByZXBhcmVfbnBtCiAgICBwdXNoZCAke05YU19TUkNfTlBNX0RJUn0KICAgIGZvciBOUE1fTElTVCBpbiAiJHtOWFNfTlBNX0xJU1RTW0BdfSI7IGRvCiAgICAgICAgcGF0Y2hfbnBtICIke05QTV9MSVNUfSIKICAgICAgICBwdXNoX25wbSAiJHtOUE1fTElTVH0iCiAgICBkb25lCiAgICBwb3BkCiAgICAjIFJldHVybiBkZWZhdWx0IHNldHRpbmdzCiAgICBucG0gbG9nb3V0CiAgICBucG0gY29uZmlnIHNldCByZWdpc3RyeSAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmciCmZpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjICBQb3B1bGF0ZSBQeVBpIHJlcG9zaXRvcnkgICMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwppZiBbICRQWVBJX1BVU0ggPT0gInRydWUiIF07IHRoZW4KICAgIHB1c2hkICR7TlhTX1NSQ19QWVBJX0RJUn0KICAgIGZvciBQWVBJX0xJU1QgaW4gIiR7TlhTX1BZUElfTElTVFNbQF19IjsgZG8KICAgICAgICBwdXNoX3BpcCAiJHtQWVBJX0xJU1R9IgogICAgZG9uZQogICAgcG9wZApmaQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyBQb3B1bGF0ZSBEb2NrZXIgcmVwb3NpdG9yeSAjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgTG9naW4gdG8gZG9ja2VyIHJlZ2lzdHJ5IHNpbXVsYXRlZCBieSBOZXh1cyBjb250YWluZXIKIyBQdXNoIGltYWdlcyB0byBwcml2YXRlIG5leHVzIGJhc2VkIG9uIHRoZSBsaXN0cwojIEFsbCBpbWFnZXMgbmVlZCB0byBiZSB0YWdnZWQgdG8gc2ltdWxhdGVkIHJlZ2lzdHJ5CiMgYW5kIHRob3NlIHdpdGhvdXQgZGVmaW5lZCByZXBvc2l0b3J5IGluIHRhZyB1c2UgZGVmYXVsdCByZXBvc2l0b3J5ICdsaWJyYXJ5Jwpkb2NrZXJfbG9naW4KZm9yIERPQ0tFUl9JTUdfTElTVCBpbiAiJHtOWFNfRE9DS0VSX0lNR19MSVNUU1tAXX0iOyBkbwogICAgcHVzaF9kb2NrZXIgIiR7RE9DS0VSX0lNR19MSVNUfSIKZG9uZQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgU3RvcCB0aGUgTmV4dXMgYW5kIGNsZWFudXAgIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmVjaG8gIlN0b3BwaW5nIE5leHVzIgoKIyBTdG9wIHRoZSBOZXh1cwpkb2NrZXIgc3RvcCAke05FWFVTX0NPTlRfSUR9ID4gL2Rldi9udWxsCgojIERyb3AgdGVtcG9yYXJ5IERvY2tlciBjbGllbnQgY29uZmlnIGRpcgpybSAtcmYgJHtET0NLRVJfQ09ORklHX0RJUn0KCmVjaG8gIk5leHVzIGJsb2IgaXMgYnVpbHQiCmV4aXQgMAo=