IyEvdXNyL2Jpbi9wZXJsIC13CgojIEdlbmVyYXRlIGEgc2hvcnQgbWFuIHBhZ2UgZnJvbSAtLWhlbHAgYW5kIC0tdmVyc2lvbiBvdXRwdXQuCiMgQ29weXJpZ2h0IKkgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKIyBhbnkgbGF0ZXIgdmVyc2lvbi4KCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAojIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCgojIFdyaXR0ZW4gYnkgQnJlbmRhbiBPJ0RlYSA8Ym9kQGNvbXB1c29sLmNvbS5hdT4KIyBBdmFpbGFibGUgZnJvbSBmdHA6Ly9mdHAuZ251Lm9yZy9nbnUvaGVscDJtYW4vCgp1c2UgNS4wMDQ7CnVzZSBzdHJpY3Q7CnVzZSBHZXRvcHQ6Okxvbmc7CnVzZSBUZXh0OjpUYWJzIHF3KGV4cGFuZCk7CnVzZSBQT1NJWCBxdyhzdHJmdGltZSBzZXRsb2NhbGUgTENfVElNRSk7CgpteSAkdGhpc19wcm9ncmFtID0gJ2hlbHAybWFuJzsKbXkgJHRoaXNfdmVyc2lvbiA9ICcxLjIzJzsKbXkgJHZlcnNpb25faW5mbyA9IDw8RU9UOwpHTlUgJHRoaXNfcHJvZ3JhbSAkdGhpc192ZXJzaW9uCgpDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuClRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCndhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgoKV3JpdHRlbiBieSBCcmVuZGFuIE8nRGVhIDxib2RcQGNvbXB1c29sLmNvbS5hdT4KRU9UCgpteSAkaGVscF9pbmZvID0gPDxFT1Q7CmAkdGhpc19wcm9ncmFtJyBnZW5lcmF0ZXMgYSBtYW4gcGFnZSBvdXQgb2YgYC0taGVscCcgYW5kIGAtLXZlcnNpb24nIG91dHB1dC4KClVzYWdlOiAkdGhpc19wcm9ncmFtIFtPUFRJT05dLi4uIEVYRUNVVEFCTEUKCiAtbiwgLS1uYW1lPVNUUklORyAgICAgICB1c2UgYFNUUklORycgYXMgdGhlIGRlc2NyaXB0aW9uIGZvciB0aGUgTkFNRSBwYXJhZ3JhcGgKIC1zLCAtLXNlY3Rpb249U0VDVElPTiAgIHVzZSBgU0VDVElPTicgYXMgdGhlIHNlY3Rpb24gZm9yIHRoZSBtYW4gcGFnZQogLWksIC0taW5jbHVkZT1GSUxFICAgICAgaW5jbHVkZSBtYXRlcmlhbCBmcm9tIGBGSUxFJwogLUksIC0tb3B0LWluY2x1ZGU9RklMRSAgaW5jbHVkZSBtYXRlcmlhbCBmcm9tIGBGSUxFJyBpZiBpdCBleGlzdHMKIC1vLCAtLW91dHB1dD1GSUxFICAgICAgIHNlbmQgb3V0cHV0IHRvIGBGSUxFJwogLU4sIC0tbm8taW5mbyAgICAgICAgICAgc3VwcHJlc3MgcG9pbnRlciB0byBUZXhpbmZvIG1hbnVhbAogICAgIC0taGVscCAgICAgICAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKICAgICAtLXZlcnNpb24gICAgICAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKCkVYRUNVVEFCTEUgc2hvdWxkIGFjY2VwdCBgLS1oZWxwJyBhbmQgYC0tdmVyc2lvbicgb3B0aW9ucy4KClJlcG9ydCBidWdzIHRvIDxidWctaGVscDJtYW5cQGdudS5vcmc+LgpFT1QKCm15ICRzZWN0aW9uID0gMTsKbXkgKCRvcHRfbmFtZSwgQG9wdF9pbmNsdWRlLCAkb3B0X291dHB1dCwgJG9wdF9ub19pbmZvKTsKCiMgUGFyc2Ugb3B0aW9ucy4KR2V0b3B0OjpMb25nOjpjb25maWcoJ2J1bmRsaW5nJyk7CkdldE9wdGlvbnMgKAogICAgJ258bmFtZT1zJwkJPT4gXCRvcHRfbmFtZSwKICAgICdzfHNlY3Rpb249cycJPT4gXCRzZWN0aW9uLAogICAgJ2l8aW5jbHVkZT1zJwk9PiBzdWIgeyBwdXNoIEBvcHRfaW5jbHVkZSwgWyBwb3AsIDEgXSB9LAogICAgJ0l8b3B0LWluY2x1ZGU9cycJPT4gc3ViIHsgcHVzaCBAb3B0X2luY2x1ZGUsIFsgcG9wLCAwIF0gfSwKICAgICdvfG91dHB1dD1zJwk9PiBcJG9wdF9vdXRwdXQsCiAgICAnTnxuby1pbmZvJwkJPT4gXCRvcHRfbm9faW5mbywKICAgIGhlbHAJCT0+IHN1YiB7IHByaW50ICRoZWxwX2luZm87IGV4aXQgfSwKICAgIHZlcnNpb24JCT0+IHN1YiB7IHByaW50ICR2ZXJzaW9uX2luZm87IGV4aXQgfSwKKSBvciBkaWUgJGhlbHBfaW5mbzsKCmRpZSAkaGVscF9pbmZvIHVubGVzcyBAQVJHViA9PSAxOwoKbXkgJWluY2x1ZGUgPSAoKTsKbXkgJWFwcGVuZCA9ICgpOwpteSBAaW5jbHVkZSA9ICgpOyAjIHJldGFpbiBvcmRlciBnaXZlbiBpbiBpbmNsdWRlIGZpbGUKCiMgUHJvdmlkZSByZXBsYWNlbWVudCBgcXVvdGUtcmVnZXgnIG9wZXJhdG9yIGZvciBwcmUtNS4wMDUuCkJFR0lOIHsgZXZhbCBxKHN1YiBxciB7ICcnID1+ICRfWzBdOyAkX1swXSB9KSBpZiAkXSA8IDUuMDA1IH0KCiMgUHJvY2VzcyBpbmNsdWRlIGZpbGUgKGlmIGdpdmVuKS4gIEZvcm1hdCBpczoKIwojICAgW3NlY3Rpb24gbmFtZV0KIyAgIHZlcmJhdGltIHRleHQKIwojIG9yCiMKIyAgIC9wYXR0ZXJuLwojICAgdmVyYmF0aW0gdGV4dAojCgpmb3IgKEBvcHRfaW5jbHVkZSkKewogICAgbXkgKCRpbmMsICRyZXF1aXJlZCkgPSBAJF87CgogICAgbmV4dCB1bmxlc3MgLWYgJGluYyBvciAkcmVxdWlyZWQ7CiAgICBkaWUgIiR0aGlzX3Byb2dyYW06IGNhbid0IG9wZW4gYCRpbmMnICgkISlcbiIKCXVubGVzcyBvcGVuIElOQywgJGluYzsKCiAgICBteSAka2V5OwogICAgbXkgJGhhc2ggPSBcJWluY2x1ZGU7CgogICAgd2hpbGUgKDxJTkM+KQogICAgewoJIyBbc2VjdGlvbl0KCWlmICgvXlxbKFteXV0rKVxdLykKCXsKCSAgICAka2V5ID0gdWMgJDE7CgkgICAgJGtleSA9fiBzL15ccysvLzsKCSAgICAka2V5ID1+IHMvXHMrJC8vOwoJICAgICRoYXNoID0gXCVpbmNsdWRlOwoJICAgIHB1c2ggQGluY2x1ZGUsICRrZXkgdW5sZXNzICRpbmNsdWRleyRrZXl9OwoJICAgIG5leHQ7Cgl9CgoJIyAvcGF0dGVybi8KCWlmIChtIV4vKC4qKS8oW2ltc10qKSEpCgl7CgkgICAgbXkgJHBhdCA9ICQyID8gIig/JDIpJDEiIDogJDE7CgoJICAgICMgQ2hlY2sgcGF0dGVybi4KCSAgICBldmFsIHsgJGtleSA9IHFyKCRwYXQpIH07CgkgICAgaWYgKCRAKQoJICAgIHsKCQkkQCA9fiBzLyBhdCAuKj8gbGluZSBcZC4qLy87CgkJZGllICIkaW5jOiQuOiRAIjsKCSAgICB9CgoJICAgICRoYXNoID0gXCVhcHBlbmQ7CgkgICAgbmV4dDsKCX0KCgkjIFNpbGVudGx5IGlnbm9yZSBhbnl0aGluZyBiZWZvcmUgdGhlIGZpcnN0CgkjIHNlY3Rpb24tLWFsbG93cyBmb3IgY29tbWVudHMgYW5kIHJldmlzaW9uIGluZm8uCgluZXh0IHVubGVzcyAka2V5OwoKCSRoYXNoLT57JGtleX0gfHw9ICcnOwoJJGhhc2gtPnska2V5fSAuPSAkXzsKICAgIH0KCiAgICBjbG9zZSBJTkM7CgogICAgZGllICIkdGhpc19wcm9ncmFtOiBubyB2YWxpZCBpbmZvcm1hdGlvbiBmb3VuZCBpbiBgJGluYydcbiIKCXVubGVzcyAka2V5Owp9CgojIENvbXByZXNzIHRyYWlsaW5nIGJsYW5rIGxpbmVzLgpmb3IgbXkgJGhhc2ggKFwoJWluY2x1ZGUsICVhcHBlbmQpKQp7CiAgICBmb3IgKGtleXMgJSRoYXNoKSB7ICRoYXNoLT57JF99ID1+IHMvXG4rJC9cbi8gfQp9CgojIFR1cm4gb2ZmIGxvY2FsaXNhdGlvbiBvZiBleGVjdXRhYmxlJ3Mgb3VwdXQuCkBFTlZ7cXcoTEFOR1VBR0UgTEFORyBMQ19BTEwpfSA9ICgnQycpIHggMzsKCiMgVHVybiBvZmYgbG9jYWxpc2F0aW9uIG9mIGRhdGUgKGZvciBzdHJmdGltZSkuCnNldGxvY2FsZSBMQ19USU1FLCAnQyc7CgojIEdyYWIgaGVscCBhbmQgdmVyc2lvbiBpbmZvIGZyb20gZXhlY3V0YWJsZS4KbXkgKCRoZWxwX3RleHQsICR2ZXJzaW9uX3RleHQpID0gbWFwIHsKICAgIGpvaW4gJycsIG1hcCB7IHMvICskLy87IGV4cGFuZCAkXyB9IGAkQVJHVlswXSAtLSRfIDI+L2Rldi9udWxsYAoJb3IgZGllICIkdGhpc19wcm9ncmFtOiBjYW4ndCBnZXQgYC0tJF8nIGluZm8gZnJvbSAkQVJHVlswXVxuIgp9IHF3KGhlbHAgdmVyc2lvbik7CgpteSAkZGF0ZSA9IHN0cmZ0aW1lICIlQiAlWSIsIGxvY2FsdGltZTsKKG15ICRwcm9ncmFtID0gJEFSR1ZbMF0pID1+IHMhLiovISE7Cm15ICRwYWNrYWdlID0gJHByb2dyYW07Cm15ICR2ZXJzaW9uOwoKaWYgKCRvcHRfb3V0cHV0KQp7CiAgICB1bmxpbmsgJG9wdF9vdXRwdXQKCW9yIGRpZSAiJHRoaXNfcHJvZ3JhbTogY2FuJ3QgdW5saW5rICRvcHRfb3V0cHV0ICgkISlcbiIKCWlmIC1lICRvcHRfb3V0cHV0OwoKICAgIG9wZW4gU1RET1VULCAiPiRvcHRfb3V0cHV0IgoJb3IgZGllICIkdGhpc19wcm9ncmFtOiBjYW4ndCBjcmVhdGUgJG9wdF9vdXRwdXQgKCQhKVxuIjsKfQoKIyBUaGUgZmlyc3QgbGluZSBvZiB0aGUgLS12ZXJzaW9uIGluZm9ybWF0aW9uIGlzIGFzc3VtZWQgdG8gYmUgaW4gb25lCiMgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXRzOgojCiMgICA8dmVyc2lvbj4KIyAgIDxwcm9ncmFtPiA8dmVyc2lvbj4KIyAgIHtHTlUsRnJlZX0gPHByb2dyYW0+IDx2ZXJzaW9uPgojICAgPHByb2dyYW0+ICh7R05VLEZyZWV9IDxwYWNrYWdlPikgPHZlcnNpb24+CiMgICA8cHJvZ3JhbT4gLSB7R05VLEZyZWV9IDxwYWNrYWdlPiA8dmVyc2lvbj4KIwojIGFuZCBzZXBlcmF0ZWQgZnJvbSBhbnkgY29weXJpZ2h0L2F1dGhvciBkZXRhaWxzIGJ5IGEgYmxhbmsgbGluZS4KCigkXywgJHZlcnNpb25fdGV4dCkgPSBzcGxpdCAvXG4rLywgJHZlcnNpb25fdGV4dCwgMjsKCmlmICgvXihcUyspICtcKCgoPzpHTlV8RnJlZSkgK1teKV0rKVwpICsoLiopLyBvcgogICAgL14oXFMrKSArLSAqKCg/OkdOVXxGcmVlKSArXFMrKSArKC4qKS8pCnsKICAgICRwcm9ncmFtID0gJDE7CiAgICAkcGFja2FnZSA9ICQyOwogICAgJHZlcnNpb24gPSAkMzsKfQplbHNpZiAoL14oKD86R05VfEZyZWUpICspPyhcUyspICsoLiopLykKewogICAgJHByb2dyYW0gPSAkMjsKICAgICRwYWNrYWdlID0gJDEgPyAiJDEkMiIgOiAkMjsKICAgICR2ZXJzaW9uID0gJDM7Cn0KZWxzZQp7CiAgICAkdmVyc2lvbiA9ICRfOwp9CgokcHJvZ3JhbSA9fiBzIS4qLyEhOwoKIyBObyBpbmZvIGZvciBgaW5mbycgaXRzZWxmLgokb3B0X25vX2luZm8gPSAxIGlmICRwcm9ncmFtIGVxICdpbmZvJzsKCiMgLS1uYW1lIG92ZXJyaWRlcyAtLWluY2x1ZGUgY29udGVudHMuCiRpbmNsdWRle05BTUV9ID0gIiRwcm9ncmFtIFxcLSAkb3B0X25hbWVcbiIgaWYgJG9wdF9uYW1lOwoKIyBEZWZhdWx0ICh1c2VsZXNzKSBOQU1FIHBhcmFncmFwaC4KJGluY2x1ZGV7TkFNRX0gfHw9ICIkcHJvZ3JhbSBcXC0gbWFudWFsIHBhZ2UgZm9yICRwcm9ncmFtICR2ZXJzaW9uXG4iOwoKIyBNYW4gcGFnZXMgdHJhZGl0aW9uYWxseSBoYXZlIHRoZSBwYWdlIHRpdGxlIGluIGNhcHMuCm15ICRQUk9HUkFNID0gdWMgJHByb2dyYW07CgojIEV4dHJhY3QgdXNhZ2UgY2xhdXNlKHMpIFtpZiBhbnldIGZvciBTWU5PUFNJUy4KaWYgKCRoZWxwX3RleHQgPX4gcy9eVXNhZ2U6KCArKFxTKykpKC4qKSgoPzpcbig/OiB7Nn1cMXwgKm9yOiArXFMpLiopKikvL20pCnsKICAgIG15IEBzeW4gPSAkMiAuICQzOwoKICAgIGlmICgkXyA9ICQ0KQogICAgewoJcy9eXG4vLzsKCWZvciAoc3BsaXQgL1xuLykgeyBzL14gKihvcjogKyk/Ly87IHB1c2ggQHN5biwgJF8gfQogICAgfQoKICAgIG15ICRzeW5vcHNpcyA9ICcnOwogICAgZm9yIChAc3luKQogICAgewoJJHN5bm9wc2lzIC49ICIuYnJcbiIgaWYgJHN5bm9wc2lzOwoJcyFeXFMqLyEhOwoJcy9eKFxTKykgKi8vOwoJJHN5bm9wc2lzIC49ICIuQiAkMVxuIjsKCXMvXHMrJC8vOwoJcy8oKFtdW118XC5cLispKykvXFxmUiQxXFxmSS9nOwoJcy9eL1xcZkkvIHVubGVzcyBzL15cXGZSLy87CgkkXyAuPSAnXGZSJzsKCXMvKFxcZkkpKCAqKS8kMiQxL2c7CglzL1xcZklcXGZSLy9nOwoJcy9eXFxmUi8vOwoJcy9cXGZJJC8vOwoJcy9eXC4vXFwmLi87CgoJJHN5bm9wc2lzIC49ICIkX1xuIjsKICAgIH0KCiAgICAkaW5jbHVkZXtTWU5PUFNJU30gfHw9ICRzeW5vcHNpczsKfQoKIyBQcm9jZXNzIHRleHQsIGluaXRpYWwgc2VjdGlvbiBpcyBERVNDUklQVElPTi4KbXkgJHNlY3QgPSAnREVTQ1JJUFRJT04nOwokXyA9ICIkaGVscF90ZXh0XG5cbiR2ZXJzaW9uX3RleHQiOwoKIyBOb3JtYWxpc2UgcGFyYWdyYXBoIGJyZWFrcy4Kcy9eXG4rLy87CnMvXG4qJC9cbi87CnMvXG5cbisvXG5cbi9nOwoKIyBUZW1wb3JhcmlseSBleGNoYW5nZSBsZWFkaW5nIGRvdHMsIGFwb3N0cm9waGVzIGFuZCBiYWNrc2xhc2hlcyBmb3IKIyB0b2tlbnMuCnMvXlwuL1x4ODAvbWc7CnMvXicvXHg4MS9tZzsKcy9cXC9ceDgyL2c7CgojIFN0YXJ0IGEgbmV3IHBhcmFncmFwaCAoaWYgcmVxdWlyZWQpIGZvciB0aGVzZS4Kcy8oW15cbl0pXG4oUmVwb3J0ICtidWdzfEVtYWlsICtidWcgK3JlcG9ydHMgK3RvfFdyaXR0ZW4gK2J5KS8kMVxuXG4kMi9nOwoKc3ViIGNvbnZlcnRfb3B0aW9uOwoKd2hpbGUgKGxlbmd0aCkKewogICAgIyBDb252ZXJ0IHNvbWUgc3RhbmRhcmQgcGFyYWdyYXBoIG5hbWVzLgogICAgaWYgKHMvXihPcHRpb25zfEV4YW1wbGVzKTogKlxuLy8pCiAgICB7Cgkkc2VjdCA9IHVjICQxOwoJbmV4dDsKICAgIH0KCiAgICAjIENvcHlyaWdodCBzZWN0aW9uCiAgICBpZiAoL15Db3B5cmlnaHQgK1soXHhhOV0vKQogICAgewoJJHNlY3QgPSAnQ09QWVJJR0hUJzsKCSRpbmNsdWRleyRzZWN0fSB8fD0gJyc7CgkkaW5jbHVkZXskc2VjdH0gLj0gIi5QUFxuIiBpZiAkaW5jbHVkZXskc2VjdH07CgoJbXkgJGNvcHk7CgkoJGNvcHksICRfKSA9IHNwbGl0IC9cblxuLywgJF8sIDI7CgoJZm9yICgkY29weSkKCXsKCSAgICAjIEFkZCBiYWNrIG5ld2xpbmUKCSAgICBzL1xuKiQvXG4vOwoKCSAgICAjIENvbnZlcnQgaXNvOTk1OS0xIGNvcHlyaWdodCBzeW1ib2wgb3IgKGMpIHRvIG5yb2ZmCgkgICAgIyBjaGFyYWN0ZXIuCgkgICAgcy9eQ29weXJpZ2h0ICsoPzpceGE5fFwoW0NjXVwpKS9Db3B5cmlnaHQgXFwoY28vbWc7CgoJICAgICMgSW5zZXJ0IGxpbmUgYnJlYWtzIGJlZm9yZSBhZGRpdGlvbmFsIGNvcHlyaWdodCBtZXNzYWdlcwoJICAgICMgYW5kIHRoZSBkaXNjbGFpbWVyLgoJICAgIHMvKC4pXG4oQ29weXJpZ2h0IHxUaGlzICtpcyArZnJlZSArc29mdHdhcmUpLyQxXG4uYnJcbiQyL2c7CgoJICAgICMgSm9pbiBoeXBoZW5hdGVkIGxpbmVzLgoJICAgIHMvKFtBLVphLXpdKS1cbiAqLyQxL2c7Cgl9CgoJJGluY2x1ZGV7JHNlY3R9IC49ICRjb3B5OwoJJF8gfHw9ICcnOwoJbmV4dDsKICAgIH0KCiAgICAjIENhdGNoIGJ1ZyByZXBvcnQgdGV4dC4KICAgIGlmICgvXihSZXBvcnQgK2J1Z3N8RW1haWwgK2J1ZyArcmVwb3J0cyArdG8pIC8pCiAgICB7Cgkkc2VjdCA9ICdSRVBPUlRJTkcgQlVHUyc7CiAgICB9CgogICAgIyBBdXRob3Igc2VjdGlvbi4KICAgIGVsc2lmICgvXldyaXR0ZW4gK2J5LykKICAgIHsKCSRzZWN0ID0gJ0FVVEhPUic7CiAgICB9CgogICAgIyBFeGFtcGxlcywgaW5kaWNhdGVkIGJ5IGFuIGluZGVudGVkIGxlYWRpbmcgJCwgJSBvciA+IGFyZQogICAgIyByZW5kZXJlZCBpbiBhIGNvbnN0YW50IHdpZHRoIGZvbnQuCiAgICBpZiAoL14oICspKFtcJFwlPl0gKVxTLykKICAgIHsKCW15ICRpbmRlbnQgPSAkMTsKCW15ICRwcmVmaXggPSAkMjsKCW15ICRicmVhayA9ICcuSVAnOwoJJGluY2x1ZGV7JHNlY3R9IHx8PSAnJzsKCXdoaWxlIChzL14kaW5kZW50XFEkcHJlZml4XEUoXFMuKilcbiovLykKCXsKCSAgICAkaW5jbHVkZXskc2VjdH0gLj0gIiRicmVha1xuXFxmKENXJHByZWZpeCQxXFxmUlxuIjsKCSAgICAkYnJlYWsgPSAnLmJyJzsKCX0KCgluZXh0OwogICAgfQoKICAgIG15ICRtYXRjaGVkID0gJyc7CiAgICAkaW5jbHVkZXskc2VjdH0gfHw9ICcnOwoKICAgICMgU3ViLXNlY3Rpb25zIGhhdmUgYSB0cmFpbGluZyBjb2xvbiBhbmQgdGhlIHNlY29uZCBsaW5lIGluZGVudGVkLgogICAgaWYgKHMvXihcUy4qOikgKlxuIC8gLykKICAgIHsKCSRtYXRjaGVkIC49ICQmIGlmICVhcHBlbmQ7CgkkaW5jbHVkZXskc2VjdH0gLj0gcXEoLlNTICIkMSJcbik7CiAgICB9CgogICAgbXkgJGluZGVudCA9IDA7CiAgICBteSAkY29udGVudCA9ICcnOwoKICAgICMgT3B0aW9uIHdpdGggZGVzY3JpcHRpb24uCiAgICBpZiAocy9eKCB7MSwxMH0oWystXVxTLio/KSkoPzooICArKXxcbiggezIwLH0pKShcUy4qKVxuLy8pCiAgICB7CgkkbWF0Y2hlZCAuPSAkJiBpZiAlYXBwZW5kOwoJJGluZGVudCA9IGxlbmd0aCAoJDQgfHwgIiQxJDMiKTsKCSRjb250ZW50ID0gIi5UUFxuXHg4MyQyXG5ceDgzJDVcbiI7Cgl1bmxlc3MgKCQ0KQoJewoJICAgICMgSW5kZW50IG1heSBiZSBkaWZmZXJlbnQgb24gc2Vjb25kIGxpbmUuCgkgICAgJGluZGVudCA9IGxlbmd0aCAkJiBpZiAvXiB7MjAsfS87Cgl9CiAgICB9CgogICAgIyBPcHRpb24gd2l0aG91dCBkZXNjcmlwdGlvbi4KICAgIGVsc2lmIChzL14gezEsMTB9KFsrLV1cUy4qKVxuLy8pCiAgICB7CgkkbWF0Y2hlZCAuPSAkJiBpZiAlYXBwZW5kOwoJJGNvbnRlbnQgPSAiLkhQXG5ceDgzJDFcbiI7CgkkaW5kZW50ID0gODA7ICMgbm90IGNvbnRpbnVlZAogICAgfQoKICAgICMgSW5kZW50ZWQgcGFyYWdyYXBoIHdpdGggdGFnLgogICAgZWxzaWYgKHMvXiggKyhcUy4qPykgICspKFxTLiopXG4vLykKICAgIHsKCSRtYXRjaGVkIC49ICQmIGlmICVhcHBlbmQ7CgkkaW5kZW50ID0gbGVuZ3RoICQxOwoJJGNvbnRlbnQgPSAiLlRQXG5ceDgzJDJcblx4ODMkM1xuIjsKICAgIH0KCiAgICAjIEluZGVudGVkIHBhcmFncmFwaC4KICAgIGVsc2lmIChzL14oICspKFxTLiopXG4vLykKICAgIHsKCSRtYXRjaGVkIC49ICQmIGlmICVhcHBlbmQ7CgkkaW5kZW50ID0gbGVuZ3RoICQxOwoJJGNvbnRlbnQgPSAiLklQXG5ceDgzJDJcbiI7CiAgICB9CgogICAgIyBMZWZ0IGp1c3RpZmllZCBwYXJhZ3JhcGguCiAgICBlbHNlCiAgICB7CglzLyguKilcbi8vOwoJJG1hdGNoZWQgLj0gJCYgaWYgJWFwcGVuZDsKCSRjb250ZW50ID0gIi5QUFxuIiBpZiAkaW5jbHVkZXskc2VjdH07CgkkY29udGVudCAuPSAiJDFcbiI7CiAgICB9CgogICAgIyBBcHBlbmQgY29udGludWF0aW9ucy4KICAgIHdoaWxlIChzL14geyRpbmRlbnR9KFxTLiopXG4vLykKICAgIHsKCSRtYXRjaGVkIC49ICQmIGlmICVhcHBlbmQ7CgkkY29udGVudCAuPSAiXHg4MyQxXG4iCiAgICB9CgogICAgIyBNb3ZlIHRvIG5leHQgcGFyYWdyYXBoLgogICAgcy9eXG4rLy87CgogICAgZm9yICgkY29udGVudCkKICAgIHsKCSMgTGVhZGluZyBkb3QgYW5kIGFwb3N0cm9waGUgcHJvdGVjdGlvbi4KCXMvXHg4M1wuL1x4ODAvZzsKCXMvXHg4MycvXHg4MS9nOwoJcy9ceDgzLy9nOwoKCSMgQ29udmVydCBvcHRpb25zLgoJcy8oXnwgKSgtW11bXHc9LV0rKS8kMSAuIGNvbnZlcnRfb3B0aW9uICQyL21nZTsKICAgIH0KCiAgICAjIENoZWNrIGlmIG1hdGNoZWQgcGFyYWdyYXBoIGNvbnRhaW5zIC9wYXQvLgogICAgaWYgKCVhcHBlbmQpCiAgICB7Cglmb3IgbXkgJHBhdCAoa2V5cyAlYXBwZW5kKQoJewoJICAgIGlmICgkbWF0Y2hlZCA9fiAkcGF0KQoJICAgIHsKCQkkY29udGVudCAuPSAiLlBQXG4iIHVubGVzcyAkYXBwZW5keyRwYXR9ID1+IC9eXC4vOwoJCSRjb250ZW50IC49ICRhcHBlbmR7JHBhdH07CgkgICAgfQoJfQogICAgfQoKICAgICRpbmNsdWRleyRzZWN0fSAuPSAkY29udGVudDsKfQoKIyBSZWZlciB0byB0aGUgcmVhbCBkb2N1bWVudGF0aW9uLgp1bmxlc3MgKCRvcHRfbm9faW5mbykKewogICAgJHNlY3QgPSAnU0VFIEFMU08nOwogICAgJGluY2x1ZGV7JHNlY3R9IHx8PSAnJzsKICAgICRpbmNsdWRleyRzZWN0fSAuPSAiLlBQXG4iIGlmICRpbmNsdWRleyRzZWN0fTsKICAgICRpbmNsdWRleyRzZWN0fSAuPSA8PEVPVDsKVGhlIGZ1bGwgZG9jdW1lbnRhdGlvbiBmb3IKLkIgJHByb2dyYW0KaXMgbWFpbnRhaW5lZCBhcyBhIFRleGluZm8gbWFudWFsLiAgSWYgdGhlCi5CIGluZm8KYW5kCi5CICRwcm9ncmFtCnByb2dyYW1zIGFyZSBwcm9wZXJseSBpbnN0YWxsZWQgYXQgeW91ciBzaXRlLCB0aGUgY29tbWFuZAouSVAKLkIgaW5mbyAkcHJvZ3JhbQouUFAKc2hvdWxkIGdpdmUgeW91IGFjY2VzcyB0byB0aGUgY29tcGxldGUgbWFudWFsLgpFT1QKfQoKIyBPdXRwdXQgaGVhZGVyLgpwcmludCA8PEVPVDsKLlxcIiBETyBOT1QgTU9ESUZZIFRISVMgRklMRSEgIEl0IHdhcyBnZW5lcmF0ZWQgYnkgJHRoaXNfcHJvZ3JhbSAkdGhpc192ZXJzaW9uLgouVEggJFBST0dSQU0gIiRzZWN0aW9uIiAiJGRhdGUiICIkcGFja2FnZSAkdmVyc2lvbiIgRlNGCkVPVAoKIyBTZWN0aW9uIG9yZGVyaW5nLgpteSBAcHJlID0gcXcoTkFNRSBTWU5PUFNJUyBERVNDUklQVElPTiBPUFRJT05TIEVYQU1QTEVTKTsKbXkgQHBvc3QgPSAoJ0FVVEhPUicsICdSRVBPUlRJTkcgQlVHUycsICdDT1BZUklHSFQnLCAnU0VFIEFMU08nKTsKbXkgJGZpbHRlciA9IGpvaW4gJ3wnLCBAcHJlLCBAcG9zdDsKCiMgT3V0cHV0IGNvbnRlbnQuCmZvciAoQHByZSwgKGdyZXAgISAvXigkZmlsdGVyKSQvbywgQGluY2x1ZGUpLCBAcG9zdCkKewogICAgaWYgKCRpbmNsdWRleyRffSkKICAgIHsKCW15ICRxdW90ZSA9IC9cVy8gPyAnIicgOiAnJzsKCXByaW50ICIuU0ggJHF1b3RlJF8kcXVvdGVcbiI7CgkKCWZvciAoJGluY2x1ZGV7JF99KQoJewoJICAgICMgUmVwbGFjZSBsZWFkaW5nIGRvdCwgYXBvc3Ryb3BoZSBhbmQgYmFja3NsYXNoIHRva2Vucy4KCSAgICBzL1x4ODAvXFwmLi9nOwoJICAgIHMvXHg4MS9cXCYnL2c7CgkgICAgcy9ceDgyL1xcZS9nOwoJICAgIHByaW50OwoJfQogICAgfQp9CgpleGl0OwoKIyBDb252ZXJ0IG9wdGlvbiBkYXNoZXMgdG8gXC0gdG8gc3RvcCBucm9mZiBmcm9tIGh5cGhlbmF0aW5nICdlbSwgYW5kCiMgZW1ib2xkZW4uICBPcHRpb24gYXJndW1lbnRzIGdldCBpdGFsaWNpc2VkLgpzdWIgY29udmVydF9vcHRpb24KewogICAgbG9jYWwgJF8gPSAnXGZCJyAuIHNoaWZ0OwoKICAgIHMvLS9cXC0vZzsKICAgIHVubGVzcyAocy9cWz0oLiopXF0kL1xcZlJbPVxcZkkkMVxcZlJdLykKICAgIHsKCXMvPSguKS9cXGZSPVxcZkkkMS87CglzLyAoLikvIFxcZkkkMS87CgkkXyAuPSAnXGZSJzsKICAgIH0KCiAgICAkXzsKfQo=