IyEvYmluL3NoCiMKIyAkSWQ6IGxhbi5zaAojCnBhdGhfc2g9YG52IGdldCBwYXRoX3NoYAouICRwYXRoX3NoL2dsb2JhbC5zaAoKYnJfc2V0KCkKewogICAgYnJfbmFtZT0kbGFuX2lmCgogICAgI8no1sPN+MfFCiAgICBraWxsYWxsIC05IHVkaGNwZAogICAgZWNobyAiaWZjb25maWcgJGJyX25hbWUgZG93bi4uLi4uLi4uLi4uLi4uLi4uLi4uIgogICAgaWZjb25maWcgJGJyX25hbWUgZG93bgoKICAgIGVjaG8gImJyY3RsIGRlbGJyICRicl9uYW1lLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIKICAgIGJyY3RsIGRlbGJyICRicl9uYW1lCgogICAgZWNobyAiYnJjdGwgYWRkYnIgJGJyX25hbWUuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIgogICAgYnJjdGwgYWRkYnIgJGJyX25hbWUgMj4+JHRlc3RfbG9nCiAgICBpZiBbICQ/IC1uZSAwIF07dGhlbgogICAgICAgIGVjaG8gIkVycm9yOiBicmN0bCBhZGRiciAkYnJfbmFtZSBmYWlsZWQuIiA+PiAkdGVzdF9sb2cKICAgIGZpCiAgICBlY2hvICJicmN0bCBzZXRmZCAkYnJfbmFtZSAwLjEuLi4uLi4uLi4uLi4uLi4uLi4iCiAgICBicmN0bCBzZXRmZCAkYnJfbmFtZSAwLjEgMj4+JHRlc3RfbG9nCiAgICBpZiBbICQ/IC1uZSAwIF07dGhlbgogICAgICAgIGVjaG8gIkVycm9yOiBicmN0bCBzZXRmZCAkYnJfbmFtZSAwLjEgZmFpbGVkLiIgPj4gJHRlc3RfbG9nCiAgICBmaQogICAgZWNobyAiaWZjb25maWcgbG8gdXAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIKICAgIGlmY29uZmlnIGxvIHVwIDI+PiR0ZXN0X2xvZwogICAgaWYgWyAkPyAtbmUgMCBdO3RoZW4KICAgICAgICBlY2hvICJFcnJvcjogaWZjb25maWcgbG8gdXAgZmFpbGVkLiIgPj4gJHRlc3RfbG9nCiAgICBmaQogICAgZWNobyAiaWZjb25maWcgJGJyX25hbWUgdXAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIgogICAgaWZjb25maWcgJGJyX25hbWUgdXAgMj4+JHRlc3RfbG9nCiAgICBpZiBbICQ/IC1uZSAwIF07dGhlbgogICAgICAgIGVjaG8gIkVycm9yOiBpZmNvbmZpZyAkYnJfbmFtZSB1cCBmYWlsZWQuIiA+PiAkdGVzdF9sb2cKICAgIGZpCgogICAgI7Tyv6rN+MfFtdjWt7jEseTNqNaqtcS/qrnYCiAgICBlY2hvIDEgPiAvcHJvYy9zeXMvbmV0L2lwdjQvY29uZi8kYnJfbmFtZS9hcnBfbm90aWZ5CiAgICAKICAgIGJyX25vZGU9YG52IGdldCBicl9ub2RlYAoKICAgICNhbmFseXNpcyBicl9ub2RlIGV4OiB1c2IwK3dpZmkwK6GtCiAgICBJRlNfT0xEPSRJRlMKICAgIElGUz0iKyIKICAgIGZvciBkZXZpY2UgaW4gJGJyX25vZGUKICAgIGRvCiAgICAgICAgaWZjb25maWcgJGRldmljZSB1cAogICAgICAgIAogICAgICAgIGJyY3RsIGFkZGlmICRicl9uYW1lICRkZXZpY2UgMj4+JHRlc3RfbG9nCiAgICAgICAgaWYgWyAkPyAtbmUgMCBdO3RoZW4KICAgICAgICAgICAgZWNobyAiRXJyb3I6IGJyY3RsIGFkZGlmICRicl9uYW1lICRkZXZpY2UgZmFpbGVkLiIgPj4gJHRlc3RfbG9nCiAgICAgICAgZmkKICAgIGRvbmUKICAgIGJyX25vZGVfbnVtPWBudiBnZXQgYnJfbm9kZV9udW1gCiAgICB3aGlsZSBbICRicl9ub2RlX251bSAtZ3QgMCBdCiAgICBkbwogICAgICAgIGJyX25vZGVfbnVtPWBleHByICRicl9ub2RlX251bSAtIDFgCgkJYnJfbm9kZT1gbnYgZ2V0IGJyX25vZGUkYnJfbm9kZV9udW1gCgkJaWYgWyAieCRicl9ub2RlIiAhPSAieCIgXTsgdGhlbgoJCQlicm5hbWU9ImJyaWRnZSIkYnJfbm9kZV9udW0KCQkJYnJjdGwgYWRkYnIgJGJybmFtZSAyPj4kdGVzdF9sb2cKCQkJYnJjdGwgc2V0ZmQgJGJybmFtZSAwLjEgMj4+JHRlc3RfbG9nCgkJCWlmY29uZmlnICRicm5hbWUgdXAgMj4+JHRlc3RfbG9nCgkJCWVjaG8gMSA+IC9wcm9jL3N5cy9uZXQvaXB2NC9jb25mLyRicm5hbWUvYXJwX25vdGlmeQoJCQlmb3IgZGV2aWNlIGluICRicl9ub2RlCgkJCWRvCgkJCQlpZmNvbmZpZyAkZGV2aWNlIHVwIDI+PiR0ZXN0X2xvZwoJCQkJYnJjdGwgYWRkaWYgJGJybmFtZSAkZGV2aWNlIDI+PiR0ZXN0X2xvZwoJCQkJbnYgc2V0IGxhbl9uYW1lXyRkZXZpY2U9JGJybmFtZQoJCQlkb25lCgkJZmkKICAgIGRvbmUKICAgIElGUz0kSUZTX09MRAogICAgCn0KCmxhbl9zZXQoKQp7CiAgICBpcD1gbnYgZ2V0IGxhbl9pcGFkZHJgCiAgICBubT1gbnYgZ2V0IGxhbl9uZXRtYXNrYAogICAgaWZjb25maWcgJGxhbl9pZiAkaXAgbmV0bWFzayAkbm0gMj4+JHRlc3RfbG9nCiAgICBpZiBbICQ/IC1uZSAwIF07dGhlbgogICAgICAgIGVjaG8gIkVycm9yOiBpZmNvbmZpZyAkbGFuX2lmICRpcCBuZXRtYXNrICRubSBmYWlsZWQuIiA+PiAkdGVzdF9sb2cKICAgIGZpCgogICAgd2VidjZfZW5hYmxlPWBudiBnZXQgd2VidjZfZW5hYmxlYAogICAgaXB2Nj1gbnYgZ2V0IGxhbl9pcHY2YWRkcmAKICAgIGlmIFsgIngkd2VidjZfZW5hYmxlIiA9PSAieDEiIF07IHRoZW4KICAgICAgICBpZmNvbmZpZyAkbGFuX2lmICRpcHY2LzY0CiAgICBpZiBbICQ/IC1uZSAwIF07dGhlbgogICAgICAgIGVjaG8gIkVycm9yOiBpZmNvbmZpZyAkbGFuX2lmICRpcHY2IGZhaWxlZC4iID4+ICR0ZXN0X2xvZwogICAgZmkKICAgIGZpCn0KCiO94s72xNrN+LXY1rehos34udi12Na3zai5/XByb2O7+tbGtq/MrLSrtd24+MTausujrNLUsePE2rrLyrXP1rfA1rnE2s34tdjWt9C5wra5psTcCmxhbmlwX3Byb2MoKQp7CiAgICAjaXC12Na3u7vL47PJNNfWvdrV+9DNysfN+MLn19a92tDyo6zSqrXftbnPwgogICAgI3VjbGludXiyu9ans9bX89LG19a3+woJaXBfdmFsdWU9YGVjaG8gIiRpcCIgfCBhd2sgLUYgJy4nICd7cHJpbnRmICQxICsgMjU2KiAkMiArIDI1NioyNTYqICQzICsgMjU2KjI1NioyNTYqICQ0fSdgCglubV92YWx1ZT1gZWNobyAiJG5tIiB8IGF3ayAtRiAnLicgJ3twcmludGYgJDEgKyAyNTYqICQyICsgMjU2KjI1NiogJDMgKyAyNTYqMjU2KjI1NiogJDR9J2AKCiAgICBlY2hvICRpcF92YWx1ZSA+IC9zeXMvbW9kdWxlL2xhbmlwX2ZpbHRlcl9pcHY0L3BhcmFtZXRlcnMvbGFuX2lwYWRkcgogICAgZWNobyAkbm1fdmFsdWUgPiAvc3lzL21vZHVsZS9sYW5pcF9maWx0ZXJfaXB2NC9wYXJhbWV0ZXJzL2xhbl9uZXRtYXNrCn0KCm1haW4oKQp7CiAgICBsYW5fZW5hYmxlPWBudiBnZXQgTGFuRW5hYmxlYAogICAgaWYgWyAieCRsYW5fZW5hYmxlIiA9PSAieDAiIF07IHRoZW4KICAgICAgICBleGl0IDAKICAgIGZpCgogICAgZWNobyAiSW5mbzogbGFuLnNoIHN0YXJ0IiA+PiAkdGVzdF9sb2cKCiAgICBpZiBbICJ4JGxhbl9lbmFibGUiID09ICJ4MSIgXTsgdGhlbgogICAgICAgIGJyX3NldAogICAgZmkKCQoJaWYgWyAieCRsYW5faWYiICE9ICJ4IiBdOyB0aGVuCiAgICAgICAgbGFuX3NldAogICAgZmkKICAgIAogICAgI3ZsYW7F5NbDo6zU3cqxt8XT2rTLtKajrDEgv6q7+rXEyrG68rK70OjSqr2rc3e808jrtb3N+MfFz8IgCiAgICAjMiC0y7SmsdjQ672rc3cgdXDG8MC0o6zI57n7srt1cLXEu7C9q7K7u+HT0HJqNDXIyLLlsM7Kwrz+CiAgICBzd19uYW1lPWBudiBnZXQgc3d2bGFuYAogICAgaWZjb25maWcgJHN3X25hbWUgdXAKICAgIG5hdGVuYWJsZT1gbnYgZ2V0IG5hdGVuYWJsZWAKICAgIGRvc2VuYWJsZT1gbnYgZ2V0IGRvc2VuYWJsZWAKICAgIGlmIFtbICJ4JG5hdGVuYWJsZSIgIT0gIngwIiB8fCAieCRkb3NlbmFibGUiICE9ICJ4MCIgXV07IHRoZW4KICAgICAgICBsYW5pcF9wcm9jCiAgICBmaQogICAgaWYgWyAieCRkb3NlbmFibGUiICE9ICJ4MCIgXTsgdGhlbgogICAgICAgIGVjaG8gMSA+IC9zeXMvbW9kdWxlL2Zhc3RfY29tbW9uL3BhcmFtZXRlcnMvbGFuX2Rvc19lbmFibGUKICAgIGZpCgoJZGhjcHNfaW5fY2FwPWBudiBnZXQgZGhjcHNfaW5fY2FwYAoKCWlmIFsgIngkZGhjcHNfaW5fY2FwIiAhPSAieDEiIF07IHRoZW4KICAgIGVjaG8gIiIgPiAkcGF0aF9jb25mL3VkaGNwZC5sZWFzZXMKCiAgICAuICRwYXRoX3NoL3VzZXItY29uZmlnLXVkaGNwZC5zaAogICAgICAgIAogICAgZGhjcD1gbnYgZ2V0IGRoY3BFbmFibGVkYAogICAgaWYgWyAiJGRoY3AiID09ICIxIiBdOyB0aGVuCiAgICAgICAgZWNobyAiSW5mbzogY29uZmlnLXVkaGNwZC5zaCBsYW4gLXIgMSBzdGFydCIgPj4gJHRlc3RfbG9nCiAgICAgICAgLiAkcGF0aF9zaC9jb25maWctdWRoY3BkLnNoICJsYW4iIC1yIDEKICAgIGZpCglmaQogICAgZG5zbWFzcSAtaSAkbGFuX2lmIC1yICRwYXRoX2NvbmYvcmVzb2x2LmNvbmYgJgogICAgLiAkcGF0aF9zaC91cG5wLnNoCiAgICAKCSO78cihYnIwtcRpcHY2tdjWtwogICAgaXB2NmxhbmlwYWRkcmNtZD0iaWZjb25maWcgJGJyX25hbWUgfCBncmVwIFNjb3BlOkxpbmsgfCBzZWQgJ3MvXi4qYWRkcjogLy9nJyB8IHNlZCAncy9cLy4qJC8vZyciCiAgICBpcHY2bGFuaXBhZGRyPWBldmFsICRpcHY2bGFuaXBhZGRyY21kYAogICAgbnYgc2V0IGlwdjZfbGFuX2lwYWRkcj0kaXB2NmxhbmlwYWRkcgoJZ3dfaW5fY2FwPWBudiBnZXQgZ3dfaW5fY2FwYAoJaWYgWyAieCRnd19pbl9jYXAiID09ICJ4MSIgXTsgdGhlbgoJCWxhbl9pZl9jYXA9YG52IGdldCBsYW5fbmFtZV9jYXBgCgkJYXBfaXA9YG52IGdldCBsYW5faXBhZGRyX2NhcGAKCQlhcF9pcHY2PWBudiBnZXQgbGFuX2lwdjZhZGRyX2NhcGAKCQkKCQlpcCByb3V0ZSBhZGQgZGVmYXVsdCB2aWEgJGFwX2lwCgkJaXAgLTYgcm91dGUgYWRkIGRlZmF1bHQgdmlhICRhcF9pcHY2IGRldiAkbGFuX2lmX2NhcAoJCWVjaG8gIm5hbWVzZXJ2ZXIgJGFwX2lwIiA+PiAvZXRjL3Jlc29sdi5jb25mCglmaQp9CgptYWluCg==