IyEvYmluL3NoCiMgVGNsIGlnbm9yZXMgdGhlIG5leHQgbGluZSAtKi0gdGNsIC0qLSBcCmV4ZWMgd2lzaCAiJDAiIC0tICIkezErJEB9IgoKIyBDb3B5cmlnaHQgKEMpIDIwMDUgUGF1bCBNYWNrZXJyYXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyBpdCBtYXkgYmUgdXNlZCwgY29waWVkLCBtb2RpZmllZAojIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlLAojIGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgpwcm9jIGdpdGRpciB7fSB7CiAgICBnbG9iYWwgZW52CiAgICBpZiB7W2luZm8gZXhpc3RzIGVudihHSVRfRElSKV19IHsKCXJldHVybiAkZW52KEdJVF9ESVIpCiAgICB9IGVsc2UgewoJcmV0dXJuICIuZ2l0IgogICAgfQp9Cgpwcm9jIGdldGNvbW1pdHMge3JhcmdzfSB7CiAgICBnbG9iYWwgY29tbWl0cyBjb21tZmQgcGhhc2UgY2FudiBtYWluZm9udCBlbnYKICAgIGdsb2JhbCBzdGFydG1zZWNzIG5leHR1cGRhdGUKICAgIGdsb2JhbCBjdGV4dCBtYWluY3Vyc29yIHRleHRjdXJzb3IgbGVmdG92ZXIKCiAgICAjIGNoZWNrIHRoYXQgd2UgY2FuIGZpbmQgYSAuZ2l0IGRpcmVjdG9yeSBzb21ld2hlcmUuLi4KICAgIHNldCBnaXRkaXIgW2dpdGRpcl0KICAgIGlmIHshW2ZpbGUgaXNkaXJlY3RvcnkgJGdpdGRpcl19IHsKCWVycm9yX3BvcHVwICJDYW5ub3QgZmluZCB0aGUgZ2l0IGRpcmVjdG9yeSBcIiRnaXRkaXJcIi4iCglleGl0IDEKICAgIH0KICAgIHNldCBjb21taXRzIHt9CiAgICBzZXQgcGhhc2UgZ2V0Y29tbWl0cwogICAgc2V0IHN0YXJ0bXNlY3MgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQogICAgc2V0IG5leHR1cGRhdGUgW2V4cHIgJHN0YXJ0bXNlY3MgKyAxMDBdCiAgICBpZiBbY2F0Y2ggewoJc2V0IHBhcnNlX2FyZ3MgW2NvbmNhdCAtLWRlZmF1bHQgSEVBRCAkcmFyZ3NdCglzZXQgcGFyc2VkX2FyZ3MgW3NwbGl0IFtldmFsIGV4ZWMgZ2l0LXJldi1wYXJzZSAkcGFyc2VfYXJnc10gIlxuIl0KICAgIH1dIHsKCSMgaWYgZ2l0LXJldi1wYXJzZSBmYWlsZWQgZm9yIHNvbWUgcmVhc29uLi4uCglpZiB7JHJhcmdzID09IHt9fSB7CgkgICAgc2V0IHJhcmdzIEhFQUQKCX0KCXNldCBwYXJzZWRfYXJncyAkcmFyZ3MKICAgIH0KICAgIGlmIFtjYXRjaCB7CglzZXQgY29tbWZkIFtvcGVuICJ8Z2l0LXJldi1saXN0IC0taGVhZGVyIC0tdG9wby1vcmRlciAkcGFyc2VkX2FyZ3MiIHJdCiAgICB9IGVycl0gewoJcHV0cyBzdGRlcnIgIkVycm9yIGV4ZWN1dGluZyBnaXQtcmV2LWxpc3Q6ICRlcnIiCglleGl0IDEKICAgIH0KICAgIHNldCBsZWZ0b3ZlciB7fQogICAgZmNvbmZpZ3VyZSAkY29tbWZkIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBiaW5hcnkKICAgIGZpbGVldmVudCAkY29tbWZkIHJlYWRhYmxlICJnZXRjb21taXRsaW5lcyAkY29tbWZkIgogICAgJGNhbnYgZGVsZXRlIGFsbAogICAgJGNhbnYgY3JlYXRlIHRleHQgMyAzIC1hbmNob3IgbncgLXRleHQgIlJlYWRpbmcgY29tbWl0cy4uLiIgXAoJLWZvbnQgJG1haW5mb250IC10YWdzIHRleHRpdGVtcwogICAgLiBjb25maWcgLWN1cnNvciB3YXRjaAogICAgJGN0ZXh0IGNvbmZpZyAtY3Vyc29yIHdhdGNoCn0KCnByb2MgZ2V0Y29tbWl0bGluZXMge2NvbW1mZH0gIHsKICAgIGdsb2JhbCBjb21taXRzIHBhcmVudHMgY2RhdGUgY2hpbGRyZW4gbmNoaWxkcmVuCiAgICBnbG9iYWwgY29tbWl0bGlzdGVkIHBoYXNlIGNvbW1pdGluZm8gbmV4dHVwZGF0ZQogICAgZ2xvYmFsIHN0b3BwZWQgcmVkaXNwbGF5aW5nIGxlZnRvdmVyCgogICAgc2V0IHN0dWZmIFtyZWFkICRjb21tZmRdCiAgICBpZiB7JHN0dWZmID09IHt9fSB7CglpZiB7IVtlb2YgJGNvbW1mZF19IHJldHVybgoJIyBzZXQgaXQgYmxvY2tpbmcgc28gd2Ugd2FpdCBmb3IgdGhlIHByb2Nlc3MgdG8gdGVybWluYXRlCglmY29uZmlndXJlICRjb21tZmQgLWJsb2NraW5nIDEKCWlmIHshW2NhdGNoIHtjbG9zZSAkY29tbWZkfSBlcnJdfSB7CgkgICAgYWZ0ZXIgaWRsZSBmaW5pc2hjb21taXRzCgkgICAgcmV0dXJuCgl9CglpZiB7W3N0cmluZyByYW5nZSAkZXJyIDAgNF0gPT0gInVzYWdlIn0gewoJICAgIHNldCBlcnIgXAp7R2l0azogZXJyb3IgcmVhZGluZyBjb21taXRzOiBiYWQgYXJndW1lbnRzIHRvIGdpdC1yZXYtbGlzdC4KKE5vdGU6IGFyZ3VtZW50cyB0byBnaXRrIGFyZSBwYXNzZWQgdG8gZ2l0LXJldi1saXN0CnRvIGFsbG93IHNlbGVjdGlvbiBvZiBjb21taXRzIHRvIGJlIGRpc3BsYXllZC4pfQoJfSBlbHNlIHsKCSAgICBzZXQgZXJyICJFcnJvciByZWFkaW5nIGNvbW1pdHM6ICRlcnIiCgl9CgllcnJvcl9wb3B1cCAkZXJyCglleGl0IDEKICAgIH0KICAgIHNldCBzdGFydCAwCiAgICB3aGlsZSAxIHsKCXNldCBpIFtzdHJpbmcgZmlyc3QgIlwwIiAkc3R1ZmYgJHN0YXJ0XQoJaWYgeyRpIDwgMH0gewoJICAgIGFwcGVuZCBsZWZ0b3ZlciBbc3RyaW5nIHJhbmdlICRzdHVmZiAkc3RhcnQgZW5kXQoJICAgIHJldHVybgoJfQoJc2V0IGNtaXQgW3N0cmluZyByYW5nZSAkc3R1ZmYgJHN0YXJ0IFtleHByIHskaSAtIDF9XV0KCWlmIHskc3RhcnQgPT0gMH0gewoJICAgIHNldCBjbWl0ICIkbGVmdG92ZXIkY21pdCIKCSAgICBzZXQgbGVmdG92ZXIge30KCX0KCXNldCBzdGFydCBbZXhwciB7JGkgKyAxfV0KCWlmIHshW3JlZ2V4cCB7XihbMC05YS1mXXs0MH0pXG59ICRjbWl0IG1hdGNoIGlkXX0gewoJICAgIHNldCBzaG9ydGNtaXQgJGNtaXQKCSAgICBpZiB7W3N0cmluZyBsZW5ndGggJHNob3J0Y21pdF0gPiA4MH0gewoJCXNldCBzaG9ydGNtaXQgIltzdHJpbmcgcmFuZ2UgJHNob3J0Y21pdCAwIDgwXS4uLiIKCSAgICB9CgkgICAgZXJyb3JfcG9wdXAgIkNhbid0IHBhcnNlIGdpdC1yZXYtbGlzdCBvdXRwdXQ6IHskc2hvcnRjbWl0fSIKCSAgICBleGl0IDEKCX0KCXNldCBjbWl0IFtzdHJpbmcgcmFuZ2UgJGNtaXQgNDEgZW5kXQoJbGFwcGVuZCBjb21taXRzICRpZAoJc2V0IGNvbW1pdGxpc3RlZCgkaWQpIDEKCXBhcnNlY29tbWl0ICRpZCAkY21pdCAxCglkcmF3Y29tbWl0ICRpZAoJaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJG5leHR1cGRhdGV9IHsKCSAgICBkb3VwZGF0ZQoJfQoJd2hpbGUgeyRyZWRpc3BsYXlpbmd9IHsKCSAgICBzZXQgcmVkaXNwbGF5aW5nIDAKCSAgICBpZiB7JHN0b3BwZWQgPT0gMX0gewoJCXNldCBzdG9wcGVkIDAKCQlzZXQgcGhhc2UgImdldGNvbW1pdHMiCgkJZm9yZWFjaCBpZCAkY29tbWl0cyB7CgkJICAgIGRyYXdjb21taXQgJGlkCgkJICAgIGlmIHskc3RvcHBlZH0gYnJlYWsKCQkgICAgaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJG5leHR1cGRhdGV9IHsKCQkJZG91cGRhdGUKCQkgICAgfQoJCX0KCSAgICB9Cgl9CiAgICB9Cn0KCnByb2MgZG91cGRhdGUge30gewogICAgZ2xvYmFsIGNvbW1mZCBuZXh0dXBkYXRlCgogICAgaW5jciBuZXh0dXBkYXRlIDEwMAogICAgZmlsZWV2ZW50ICRjb21tZmQgcmVhZGFibGUge30KICAgIHVwZGF0ZQogICAgZmlsZWV2ZW50ICRjb21tZmQgcmVhZGFibGUgImdldGNvbW1pdGxpbmVzICRjb21tZmQiCn0KCnByb2MgcmVhZGNvbW1pdCB7aWR9IHsKICAgIGlmIFtjYXRjaCB7c2V0IGNvbnRlbnRzIFtleGVjIGdpdC1jYXQtZmlsZSBjb21taXQgJGlkXX1dIHJldHVybgogICAgcGFyc2Vjb21taXQgJGlkICRjb250ZW50cyAwCn0KCnByb2MgcGFyc2Vjb21taXQge2lkIGNvbnRlbnRzIGxpc3RlZH0gewogICAgZ2xvYmFsIGNvbW1pdGluZm8gY2hpbGRyZW4gbmNoaWxkcmVuIHBhcmVudHMgbnBhcmVudHMgY2RhdGUgbmNsZWZ0CgogICAgc2V0IGluaGRyIDEKICAgIHNldCBjb21tZW50IHt9CiAgICBzZXQgaGVhZGxpbmUge30KICAgIHNldCBhdW5hbWUge30KICAgIHNldCBhdWRhdGUge30KICAgIHNldCBjb21uYW1lIHt9CiAgICBzZXQgY29tZGF0ZSB7fQogICAgaWYgeyFbaW5mbyBleGlzdHMgbmNoaWxkcmVuKCRpZCldfSB7CglzZXQgY2hpbGRyZW4oJGlkKSB7fQoJc2V0IG5jaGlsZHJlbigkaWQpIDAKCXNldCBuY2xlZnQoJGlkKSAwCiAgICB9CiAgICBzZXQgcGFyZW50cygkaWQpIHt9CiAgICBzZXQgbnBhcmVudHMoJGlkKSAwCiAgICBmb3JlYWNoIGxpbmUgW3NwbGl0ICRjb250ZW50cyAiXG4iXSB7CglpZiB7JGluaGRyfSB7CgkgICAgaWYgeyRsaW5lID09IHt9fSB7CgkJc2V0IGluaGRyIDAKCSAgICB9IGVsc2UgewoJCXNldCB0YWcgW2xpbmRleCAkbGluZSAwXQoJCWlmIHskdGFnID09ICJwYXJlbnQifSB7CgkJICAgIHNldCBwIFtsaW5kZXggJGxpbmUgMV0KCQkgICAgaWYgeyFbaW5mbyBleGlzdHMgbmNoaWxkcmVuKCRwKV19IHsKCQkJc2V0IGNoaWxkcmVuKCRwKSB7fQoJCQlzZXQgbmNoaWxkcmVuKCRwKSAwCgkJCXNldCBuY2xlZnQoJHApIDAKCQkgICAgfQoJCSAgICBsYXBwZW5kIHBhcmVudHMoJGlkKSAkcAoJCSAgICBpbmNyIG5wYXJlbnRzKCRpZCkKCQkgICAgIyBzb21ldGltZXMgd2UgZ2V0IGEgY29tbWl0IHRoYXQgbGlzdHMgYSBwYXJlbnQgdHdpY2UuLi4KCQkgICAgaWYgeyRsaXN0ZWQgJiYgW2xzZWFyY2ggLWV4YWN0ICRjaGlsZHJlbigkcCkgJGlkXSA8IDB9IHsKCQkJbGFwcGVuZCBjaGlsZHJlbigkcCkgJGlkCgkJCWluY3IgbmNoaWxkcmVuKCRwKQoJCQlpbmNyIG5jbGVmdCgkcCkKCQkgICAgfQoJCX0gZWxzZWlmIHskdGFnID09ICJhdXRob3IifSB7CgkJICAgIHNldCB4IFtleHByIHtbbGxlbmd0aCAkbGluZV0gLSAyfV0KCQkgICAgc2V0IGF1ZGF0ZSBbbGluZGV4ICRsaW5lICR4XQoJCSAgICBzZXQgYXVuYW1lIFtscmFuZ2UgJGxpbmUgMSBbZXhwciB7JHggLSAxfV1dCgkJfSBlbHNlaWYgeyR0YWcgPT0gImNvbW1pdHRlciJ9IHsKCQkgICAgc2V0IHggW2V4cHIge1tsbGVuZ3RoICRsaW5lXSAtIDJ9XQoJCSAgICBzZXQgY29tZGF0ZSBbbGluZGV4ICRsaW5lICR4XQoJCSAgICBzZXQgY29tbmFtZSBbbHJhbmdlICRsaW5lIDEgW2V4cHIgeyR4IC0gMX1dXQoJCX0KCSAgICB9Cgl9IGVsc2UgewoJICAgIGlmIHskY29tbWVudCA9PSB7fX0gewoJCXNldCBoZWFkbGluZSBbc3RyaW5nIHRyaW0gJGxpbmVdCgkgICAgfSBlbHNlIHsKCQlhcHBlbmQgY29tbWVudCAiXG4iCgkgICAgfQoJICAgIGlmIHshJGxpc3RlZH0gewoJCSMgZ2l0LXJldi1saXN0IGluZGVudHMgdGhlIGNvbW1lbnQgYnkgNCBzcGFjZXM7CgkJIyBpZiB3ZSBnb3QgdGhpcyB2aWEgZ2l0LWNhdC1maWxlLCBhZGQgdGhlIGluZGVudGF0aW9uCgkJYXBwZW5kIGNvbW1lbnQgIiAgICAiCgkgICAgfQoJICAgIGFwcGVuZCBjb21tZW50ICRsaW5lCgl9CiAgICB9CiAgICBpZiB7JGF1ZGF0ZSAhPSB7fX0gewoJc2V0IGF1ZGF0ZSBbY2xvY2sgZm9ybWF0ICRhdWRhdGUgLWZvcm1hdCAiJVktJW0tJWQgJUg6JU06JVMiXQogICAgfQogICAgaWYgeyRjb21kYXRlICE9IHt9fSB7CglzZXQgY2RhdGUoJGlkKSAkY29tZGF0ZQoJc2V0IGNvbWRhdGUgW2Nsb2NrIGZvcm1hdCAkY29tZGF0ZSAtZm9ybWF0ICIlWS0lbS0lZCAlSDolTTolUyJdCiAgICB9CiAgICBzZXQgY29tbWl0aW5mbygkaWQpIFtsaXN0ICRoZWFkbGluZSAkYXVuYW1lICRhdWRhdGUgXAoJCQkgICAgICRjb21uYW1lICRjb21kYXRlICRjb21tZW50XQp9Cgpwcm9jIHJlYWRyZWZzIHt9IHsKICAgIGdsb2JhbCB0YWdpZHMgaWR0YWdzIGhlYWRpZHMgaWRoZWFkcwogICAgc2V0IHRhZ3MgW2dsb2IgLW5vY29tcGxhaW4gLXR5cGVzIGYgW2dpdGRpcl0vcmVmcy90YWdzLypdCiAgICBmb3JlYWNoIGYgJHRhZ3MgewoJY2F0Y2ggewoJICAgIHNldCBmZCBbb3BlbiAkZiByXQoJICAgIHNldCBsaW5lIFtyZWFkICRmZF0KCSAgICBpZiB7W3JlZ2V4cCB7XlswLTlhLWZdezQwfX0gJGxpbmUgaWRdfSB7CgkJc2V0IGRpcmVjdCBbZmlsZSB0YWlsICRmXQoJCXNldCB0YWdpZHMoJGRpcmVjdCkgJGlkCgkJbGFwcGVuZCBpZHRhZ3MoJGlkKSAkZGlyZWN0CgkJc2V0IGNvbnRlbnRzIFtzcGxpdCBbZXhlYyBnaXQtY2F0LWZpbGUgdGFnICRpZF0gIlxuIl0KCQlzZXQgb2JqIHt9CgkJc2V0IHR5cGUge30KCQlzZXQgdGFnIHt9CgkJZm9yZWFjaCBsICRjb250ZW50cyB7CgkJICAgIGlmIHskbCA9PSB7fX0gYnJlYWsKCQkgICAgc3dpdGNoIC0tIFtsaW5kZXggJGwgMF0gewoJCQkib2JqZWN0IiB7c2V0IG9iaiBbbGluZGV4ICRsIDFdfQoJCQkidHlwZSIge3NldCB0eXBlIFtsaW5kZXggJGwgMV19CgkJCSJ0YWciIHtzZXQgdGFnIFtzdHJpbmcgcmFuZ2UgJGwgNCBlbmRdfQoJCSAgICB9CgkJfQoJCWlmIHskb2JqICE9IHt9ICYmICR0eXBlID09ICJjb21taXQiICYmICR0YWcgIT0ge319IHsKCQkgICAgc2V0IHRhZ2lkcygkdGFnKSAkb2JqCgkJICAgIGxhcHBlbmQgaWR0YWdzKCRvYmopICR0YWcKCQl9CgkgICAgfQoJICAgIGNsb3NlICRmZAoJfQogICAgfQogICAgc2V0IGhlYWRzIFtnbG9iIC1ub2NvbXBsYWluIC10eXBlcyBmIFtnaXRkaXJdL3JlZnMvaGVhZHMvKl0KICAgIGZvcmVhY2ggZiAkaGVhZHMgewoJY2F0Y2ggewoJICAgIHNldCBmZCBbb3BlbiAkZiByXQoJICAgIHNldCBsaW5lIFtyZWFkICRmZCA0MF0KCSAgICBpZiB7W3JlZ2V4cCB7XlswLTlhLWZdezQwfX0gJGxpbmUgaWRdfSB7CgkJc2V0IGhlYWQgW2ZpbGUgdGFpbCAkZl0KCQlzZXQgaGVhZGlkcygkaGVhZCkgJGxpbmUKCQlsYXBwZW5kIGlkaGVhZHMoJGxpbmUpICRoZWFkCgkgICAgfQoJICAgIGNsb3NlICRmZAoJfQogICAgfQp9Cgpwcm9jIGVycm9yX3BvcHVwIG1zZyB7CiAgICBzZXQgdyAuZXJyb3IKICAgIHRvcGxldmVsICR3CiAgICB3bSB0cmFuc2llbnQgJHcgLgogICAgbWVzc2FnZSAkdy5tIC10ZXh0ICRtc2cgLWp1c3RpZnkgY2VudGVyIC1hc3BlY3QgNDAwCiAgICBwYWNrICR3Lm0gLXNpZGUgdG9wIC1maWxsIHggLXBhZHggMjAgLXBhZHkgMjAKICAgIGJ1dHRvbiAkdy5vayAtdGV4dCBPSyAtY29tbWFuZCAiZGVzdHJveSAkdyIKICAgIHBhY2sgJHcub2sgLXNpZGUgYm90dG9tIC1maWxsIHgKICAgIGJpbmQgJHcgPFZpc2liaWxpdHk+ICJncmFiICR3OyBmb2N1cyAkdyIKICAgIHRrd2FpdCB3aW5kb3cgJHcKfQoKcHJvYyBtYWtld2luZG93IHt9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIGxpbmVzcGMgY2hhcnNwYyBjdGV4dCBjZmxpc3QgdGV4dGZvbnQKICAgIGdsb2JhbCBmaW5kdHlwZSBmaW5kdHlwZW1lbnUgZmluZGxvYyBmaW5kc3RyaW5nIGZzdHJpbmcgZ2VvbWV0cnkKICAgIGdsb2JhbCBlbnRyaWVzIHNoYTFlbnRyeSBzaGExc3RyaW5nIHNoYTFidXQKICAgIGdsb2JhbCBtYWluY3Vyc29yIHRleHRjdXJzb3IKICAgIGdsb2JhbCByb3djdHhtZW51IGdhdWR5ZGlmZiBtZXJnZW1heAoKICAgIG1lbnUgLmJhcgogICAgLmJhciBhZGQgY2FzY2FkZSAtbGFiZWwgIkZpbGUiIC1tZW51IC5iYXIuZmlsZQogICAgbWVudSAuYmFyLmZpbGUKICAgIC5iYXIuZmlsZSBhZGQgY29tbWFuZCAtbGFiZWwgIlF1aXQiIC1jb21tYW5kIGRvcXVpdAogICAgbWVudSAuYmFyLmhlbHAKICAgIC5iYXIgYWRkIGNhc2NhZGUgLWxhYmVsICJIZWxwIiAtbWVudSAuYmFyLmhlbHAKICAgIC5iYXIuaGVscCBhZGQgY29tbWFuZCAtbGFiZWwgIkFib3V0IGdpdGsiIC1jb21tYW5kIGFib3V0CiAgICAuIGNvbmZpZ3VyZSAtbWVudSAuYmFyCgogICAgaWYgeyFbaW5mbyBleGlzdHMgZ2VvbWV0cnkoY2FudjEpXX0gewoJc2V0IGdlb21ldHJ5KGNhbnYxKSBbZXhwciA0NSAqICRjaGFyc3BjXQoJc2V0IGdlb21ldHJ5KGNhbnYyKSBbZXhwciAzMCAqICRjaGFyc3BjXQoJc2V0IGdlb21ldHJ5KGNhbnYzKSBbZXhwciAxNSAqICRjaGFyc3BjXQoJc2V0IGdlb21ldHJ5KGNhbnZoKSBbZXhwciAyNSAqICRsaW5lc3BjICsgNF0KCXNldCBnZW9tZXRyeShjdGV4dHcpIDgwCglzZXQgZ2VvbWV0cnkoY3RleHRoKSAzMAoJc2V0IGdlb21ldHJ5KGNmbGlzdHcpIDMwCiAgICB9CiAgICBwYW5lZHdpbmRvdyAuY3RvcCAtb3JpZW50IHZlcnRpY2FsCiAgICBpZiB7W2luZm8gZXhpc3RzIGdlb21ldHJ5KHdpZHRoKV19IHsKCS5jdG9wIGNvbmYgLXdpZHRoICRnZW9tZXRyeSh3aWR0aCkgLWhlaWdodCAkZ2VvbWV0cnkoaGVpZ2h0KQoJc2V0IHRleHRoIFtleHByIHskZ2VvbWV0cnkoaGVpZ2h0KSAtICRnZW9tZXRyeShjYW52aCkgLSA1Nn1dCglzZXQgZ2VvbWV0cnkoY3RleHRoKSBbZXhwciB7KCR0ZXh0aCAtIDgpIC8KCQkJCSAgICBbZm9udCBtZXRyaWNzICR0ZXh0Zm9udCAtbGluZXNwYWNlXX1dCiAgICB9CiAgICBmcmFtZSAuY3RvcC50b3AKICAgIGZyYW1lIC5jdG9wLnRvcC5iYXIKICAgIHBhY2sgLmN0b3AudG9wLmJhciAtc2lkZSBib3R0b20gLWZpbGwgeAogICAgc2V0IGNzY3JvbGwgLmN0b3AudG9wLmNzYgogICAgc2Nyb2xsYmFyICRjc2Nyb2xsIC1jb21tYW5kIHthbGxjYW52cyB5dmlld30gLWhpZ2hsaWdodHRoaWNrbmVzcyAwCiAgICBwYWNrICRjc2Nyb2xsIC1zaWRlIHJpZ2h0IC1maWxsIHkKICAgIHBhbmVkd2luZG93IC5jdG9wLnRvcC5jbGlzdCAtb3JpZW50IGhvcml6b250YWwgLXNhc2hwYWQgMCAtaGFuZGxlc2l6ZSA0CiAgICBwYWNrIC5jdG9wLnRvcC5jbGlzdCAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEKICAgIC5jdG9wIGFkZCAuY3RvcC50b3AKICAgIHNldCBjYW52IC5jdG9wLnRvcC5jbGlzdC5jYW52CiAgICBjYW52YXMgJGNhbnYgLWhlaWdodCAkZ2VvbWV0cnkoY2FudmgpIC13aWR0aCAkZ2VvbWV0cnkoY2FudjEpIFwKCS1iZyB3aGl0ZSAtYmQgMCBcCgkteXNjcm9sbGluY3IgJGxpbmVzcGMgLXlzY3JvbGxjb21tYW5kICIkY3Njcm9sbCBzZXQiCiAgICAuY3RvcC50b3AuY2xpc3QgYWRkICRjYW52CiAgICBzZXQgY2FudjIgLmN0b3AudG9wLmNsaXN0LmNhbnYyCiAgICBjYW52YXMgJGNhbnYyIC1oZWlnaHQgJGdlb21ldHJ5KGNhbnZoKSAtd2lkdGggJGdlb21ldHJ5KGNhbnYyKSBcCgktYmcgd2hpdGUgLWJkIDAgLXlzY3JvbGxpbmNyICRsaW5lc3BjCiAgICAuY3RvcC50b3AuY2xpc3QgYWRkICRjYW52MgogICAgc2V0IGNhbnYzIC5jdG9wLnRvcC5jbGlzdC5jYW52MwogICAgY2FudmFzICRjYW52MyAtaGVpZ2h0ICRnZW9tZXRyeShjYW52aCkgLXdpZHRoICRnZW9tZXRyeShjYW52MykgXAoJLWJnIHdoaXRlIC1iZCAwIC15c2Nyb2xsaW5jciAkbGluZXNwYwogICAgLmN0b3AudG9wLmNsaXN0IGFkZCAkY2FudjMKICAgIGJpbmQgLmN0b3AudG9wLmNsaXN0IDxDb25maWd1cmU+IHtyZXNpemVjbGlzdHBhbmVzICVXICV3fQoKICAgIHNldCBzaGExZW50cnkgLmN0b3AudG9wLmJhci5zaGExCiAgICBzZXQgZW50cmllcyAkc2hhMWVudHJ5CiAgICBzZXQgc2hhMWJ1dCAuY3RvcC50b3AuYmFyLnNoYTFsYWJlbAogICAgYnV0dG9uICRzaGExYnV0IC10ZXh0ICJTSEExIElEOiAiIC1zdGF0ZSBkaXNhYmxlZCAtcmVsaWVmIGZsYXQgXAoJLWNvbW1hbmQgZ290b2NvbW1pdCAtd2lkdGggOAogICAgJHNoYTFidXQgY29uZiAtZGlzYWJsZWRmb3JlZ3JvdW5kIFskc2hhMWJ1dCBjZ2V0IC1mb3JlZ3JvdW5kXQogICAgcGFjayAuY3RvcC50b3AuYmFyLnNoYTFsYWJlbCAtc2lkZSBsZWZ0CiAgICBlbnRyeSAkc2hhMWVudHJ5IC13aWR0aCA0MCAtZm9udCAkdGV4dGZvbnQgLXRleHR2YXJpYWJsZSBzaGExc3RyaW5nCiAgICB0cmFjZSBhZGQgdmFyaWFibGUgc2hhMXN0cmluZyB3cml0ZSBzaGExY2hhbmdlCiAgICBwYWNrICRzaGExZW50cnkgLXNpZGUgbGVmdCAtcGFkeSAyCiAgICBidXR0b24gLmN0b3AudG9wLmJhci5maW5kYnV0IC10ZXh0ICJGaW5kIiAtY29tbWFuZCBkb2ZpbmQKICAgIHBhY2sgLmN0b3AudG9wLmJhci5maW5kYnV0IC1zaWRlIGxlZnQKICAgIHNldCBmaW5kc3RyaW5nIHt9CiAgICBzZXQgZnN0cmluZyAuY3RvcC50b3AuYmFyLmZpbmRzdHJpbmcKICAgIGxhcHBlbmQgZW50cmllcyAkZnN0cmluZwogICAgZW50cnkgJGZzdHJpbmcgLXdpZHRoIDMwIC1mb250ICR0ZXh0Zm9udCAtdGV4dHZhcmlhYmxlIGZpbmRzdHJpbmcKICAgIHBhY2sgJGZzdHJpbmcgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLWZpbGwgeAogICAgc2V0IGZpbmR0eXBlIEV4YWN0CiAgICBzZXQgZmluZHR5cGVtZW51IFt0a19vcHRpb25NZW51IC5jdG9wLnRvcC5iYXIuZmluZHR5cGUgXAoJCQkgIGZpbmR0eXBlIEV4YWN0IElnbkNhc2UgUmVnZXhwXQogICAgc2V0IGZpbmRsb2MgIkFsbCBmaWVsZHMiCiAgICB0a19vcHRpb25NZW51IC5jdG9wLnRvcC5iYXIuZmluZGxvYyBmaW5kbG9jICJBbGwgZmllbGRzIiBIZWFkbGluZSBcCglDb21tZW50cyBBdXRob3IgQ29tbWl0dGVyIEZpbGVzIFBpY2theGUKICAgIHBhY2sgLmN0b3AudG9wLmJhci5maW5kbG9jIC1zaWRlIHJpZ2h0CiAgICBwYWNrIC5jdG9wLnRvcC5iYXIuZmluZHR5cGUgLXNpZGUgcmlnaHQKICAgICMgZm9yIG1ha2luZyBzdXJlIHR5cGU9PUV4YWN0IHdoZW5ldmVyIGxvYz09UGlja2F4ZQogICAgdHJhY2UgYWRkIHZhcmlhYmxlIGZpbmRsb2Mgd3JpdGUgZmluZGxvY2NoYW5nZQoKICAgIHBhbmVkd2luZG93IC5jdG9wLmNkZXQgLW9yaWVudCBob3Jpem9udGFsCiAgICAuY3RvcCBhZGQgLmN0b3AuY2RldAogICAgZnJhbWUgLmN0b3AuY2RldC5sZWZ0CiAgICBzZXQgY3RleHQgLmN0b3AuY2RldC5sZWZ0LmN0ZXh0CiAgICB0ZXh0ICRjdGV4dCAtYmcgd2hpdGUgLXN0YXRlIGRpc2FibGVkIC1mb250ICR0ZXh0Zm9udCBcCgktd2lkdGggJGdlb21ldHJ5KGN0ZXh0dykgLWhlaWdodCAkZ2VvbWV0cnkoY3RleHRoKSBcCgkteXNjcm9sbGNvbW1hbmQgIi5jdG9wLmNkZXQubGVmdC5zYiBzZXQiCiAgICBzY3JvbGxiYXIgLmN0b3AuY2RldC5sZWZ0LnNiIC1jb21tYW5kICIkY3RleHQgeXZpZXciCiAgICBwYWNrIC5jdG9wLmNkZXQubGVmdC5zYiAtc2lkZSByaWdodCAtZmlsbCB5CiAgICBwYWNrICRjdGV4dCAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCiAgICAuY3RvcC5jZGV0IGFkZCAuY3RvcC5jZGV0LmxlZnQKCiAgICAkY3RleHQgdGFnIGNvbmYgZmlsZXNlcCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXSAtYmFjayAiI2FhYWFhYSIKICAgIGlmIHskZ2F1ZHlkaWZmfSB7CgkkY3RleHQgdGFnIGNvbmYgaHVua3NlcCAtYmFjayBibHVlIC1mb3JlIHdoaXRlCgkkY3RleHQgdGFnIGNvbmYgZDAgLWJhY2sgIiNmZjgwODAiCgkkY3RleHQgdGFnIGNvbmYgZDEgLWJhY2sgZ3JlZW4KICAgIH0gZWxzZSB7CgkkY3RleHQgdGFnIGNvbmYgaHVua3NlcCAtZm9yZSBibHVlCgkkY3RleHQgdGFnIGNvbmYgZDAgLWZvcmUgcmVkCgkkY3RleHQgdGFnIGNvbmYgZDEgLWZvcmUgIiMwMGEwMDAiCgkkY3RleHQgdGFnIGNvbmYgbTAgLWZvcmUgcmVkCgkkY3RleHQgdGFnIGNvbmYgbTEgLWZvcmUgYmx1ZQoJJGN0ZXh0IHRhZyBjb25mIG0yIC1mb3JlIGdyZWVuCgkkY3RleHQgdGFnIGNvbmYgbTMgLWZvcmUgcHVycGxlCgkkY3RleHQgdGFnIGNvbmYgbTQgLWZvcmUgYnJvd24KCSRjdGV4dCB0YWcgY29uZiBtbWF4IC1mb3JlIGRhcmtncmV5CglzZXQgbWVyZ2VtYXggNQoJJGN0ZXh0IHRhZyBjb25mIG1yZXN1bHQgLWZvbnQgW2NvbmNhdCAkdGV4dGZvbnQgYm9sZF0KCSRjdGV4dCB0YWcgY29uZiBtc2VwIC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdCgkkY3RleHQgdGFnIGNvbmYgZm91bmQgLWJhY2sgeWVsbG93CiAgICB9CgogICAgZnJhbWUgLmN0b3AuY2RldC5yaWdodAogICAgc2V0IGNmbGlzdCAuY3RvcC5jZGV0LnJpZ2h0LmNmaWxlcwogICAgbGlzdGJveCAkY2ZsaXN0IC1iZyB3aGl0ZSAtc2VsZWN0bW9kZSBleHRlbmRlZCAtd2lkdGggJGdlb21ldHJ5KGNmbGlzdHcpIFwKCS15c2Nyb2xsY29tbWFuZCAiLmN0b3AuY2RldC5yaWdodC5zYiBzZXQiCiAgICBzY3JvbGxiYXIgLmN0b3AuY2RldC5yaWdodC5zYiAtY29tbWFuZCAiJGNmbGlzdCB5dmlldyIKICAgIHBhY2sgLmN0b3AuY2RldC5yaWdodC5zYiAtc2lkZSByaWdodCAtZmlsbCB5CiAgICBwYWNrICRjZmxpc3QgLXNpZGUgbGVmdCAtZmlsbCBib3RoIC1leHBhbmQgMQogICAgLmN0b3AuY2RldCBhZGQgLmN0b3AuY2RldC5yaWdodAogICAgYmluZCAuY3RvcC5jZGV0IDxDb25maWd1cmU+IHtyZXNpemVjZGV0cGFuZXMgJVcgJXd9CgogICAgcGFjayAuY3RvcCAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEKCiAgICBiaW5kYWxsIDwxPiB7c2VsY2FudmxpbmUgJVcgJXggJXl9CiAgICAjYmluZGFsbCA8QjEtTW90aW9uPiB7c2VsY2FudmxpbmUgJVcgJXggJXl9CiAgICBiaW5kYWxsIDxCdXR0b25SZWxlYXNlLTQ+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgLTUgdW5pdHMiCiAgICBiaW5kYWxsIDxCdXR0b25SZWxlYXNlLTU+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgNSB1bml0cyIKICAgIGJpbmRhbGwgPDI+ICJhbGxjYW52cyBzY2FuIG1hcmsgMCAleSIKICAgIGJpbmRhbGwgPEIyLU1vdGlvbj4gImFsbGNhbnZzIHNjYW4gZHJhZ3RvIDAgJXkiCiAgICBiaW5kIC4gPEtleS1VcD4gInNlbG5leHRsaW5lIC0xIgogICAgYmluZCAuIDxLZXktRG93bj4gInNlbG5leHRsaW5lIDEiCiAgICBiaW5kIC4gPEtleS1Qcmlvcj4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKICAgIGJpbmQgLiA8S2V5LU5leHQ+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgMSBwYWdlcyIKICAgIGJpbmRrZXkgPEtleS1EZWxldGU+ICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzIgogICAgYmluZGtleSA8S2V5LUJhY2tTcGFjZT4gIiRjdGV4dCB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5ka2V5IDxLZXktc3BhY2U+ICIkY3RleHQgeXZpZXcgc2Nyb2xsIDEgcGFnZXMiCiAgICBiaW5ka2V5IHAgInNlbG5leHRsaW5lIC0xIgogICAgYmluZGtleSBuICJzZWxuZXh0bGluZSAxIgogICAgYmluZGtleSBiICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xIHBhZ2VzIgogICAgYmluZGtleSBkICIkY3RleHQgeXZpZXcgc2Nyb2xsIDE4IHVuaXRzIgogICAgYmluZGtleSB1ICIkY3RleHQgeXZpZXcgc2Nyb2xsIC0xOCB1bml0cyIKICAgIGJpbmRrZXkgLyB7ZmluZG5leHQgMX0KICAgIGJpbmRrZXkgPEtleS1SZXR1cm4+IHtmaW5kbmV4dCAwfQogICAgYmluZGtleSA/IGZpbmRwcmV2CiAgICBiaW5ka2V5IGYgbmV4dGZpbGUKICAgIGJpbmQgLiA8Q29udHJvbC1xPiBkb3F1aXQKICAgIGJpbmQgLiA8Q29udHJvbC1mPiBkb2ZpbmQKICAgIGJpbmQgLiA8Q29udHJvbC1nPiB7ZmluZG5leHQgMH0KICAgIGJpbmQgLiA8Q29udHJvbC1yPiBmaW5kcHJldgogICAgYmluZCAuIDxDb250cm9sLWVxdWFsPiB7aW5jcmZvbnQgMX0KICAgIGJpbmQgLiA8Q29udHJvbC1LUF9BZGQ+IHtpbmNyZm9udCAxfQogICAgYmluZCAuIDxDb250cm9sLW1pbnVzPiB7aW5jcmZvbnQgLTF9CiAgICBiaW5kIC4gPENvbnRyb2wtS1BfU3VidHJhY3Q+IHtpbmNyZm9udCAtMX0KICAgIGJpbmQgJGNmbGlzdCA8PExpc3Rib3hTZWxlY3Q+PiBsaXN0Ym94c2VsCiAgICBiaW5kIC4gPERlc3Ryb3k+IHtzYXZlc3R1ZmYgJVd9CiAgICBiaW5kIC4gPEJ1dHRvbi0xPiAiY2xpY2sgJVciCiAgICBiaW5kICRmc3RyaW5nIDxLZXktUmV0dXJuPiBkb2ZpbmQKICAgIGJpbmQgJHNoYTFlbnRyeSA8S2V5LVJldHVybj4gZ290b2NvbW1pdAogICAgYmluZCAkc2hhMWVudHJ5IDw8UGFzdGVTZWxlY3Rpb24+PiBjbGVhcnNoYTEKCiAgICBzZXQgbWFpbmN1cnNvciBbLiBjZ2V0IC1jdXJzb3JdCiAgICBzZXQgdGV4dGN1cnNvciBbJGN0ZXh0IGNnZXQgLWN1cnNvcl0KCiAgICBzZXQgcm93Y3R4bWVudSAucm93Y3R4bWVudQogICAgbWVudSAkcm93Y3R4bWVudSAtdGVhcm9mZiAwCiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkRpZmYgdGhpcyAtPiBzZWxlY3RlZCIgXAoJLWNvbW1hbmQge2RpZmZ2c3NlbCAwfQogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJEaWZmIHNlbGVjdGVkIC0+IHRoaXMiIFwKCS1jb21tYW5kIHtkaWZmdnNzZWwgMX0KICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiTWFrZSBwYXRjaCIgLWNvbW1hbmQgbWtwYXRjaAogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJDcmVhdGUgdGFnIiAtY29tbWFuZCBta3RhZwogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJXcml0ZSBjb21taXQgdG8gZmlsZSIgLWNvbW1hbmQgd3JpdGVjb21taXQKfQoKIyB3aGVuIHdlIG1ha2UgYSBrZXkgYmluZGluZyBmb3IgdGhlIHRvcGxldmVsLCBtYWtlIHN1cmUKIyBpdCBkb2Vzbid0IGdldCB0cmlnZ2VyZWQgd2hlbiB0aGF0IGtleSBpcyBwcmVzc2VkIGluIHRoZQojIGZpbmQgc3RyaW5nIGVudHJ5IHdpZGdldC4KcHJvYyBiaW5ka2V5IHtldiBzY3JpcHR9IHsKICAgIGdsb2JhbCBlbnRyaWVzCiAgICBiaW5kIC4gJGV2ICRzY3JpcHQKICAgIHNldCBlc2NyaXB0IFtiaW5kIEVudHJ5ICRldl0KICAgIGlmIHskZXNjcmlwdCA9PSB7fX0gewoJc2V0IGVzY3JpcHQgW2JpbmQgRW50cnkgPEtleT5dCiAgICB9CiAgICBmb3JlYWNoIGUgJGVudHJpZXMgewoJYmluZCAkZSAkZXYgIiRlc2NyaXB0OyBicmVhayIKICAgIH0KfQoKIyBzZXQgdGhlIGZvY3VzIGJhY2sgdG8gdGhlIHRvcGxldmVsIGZvciBhbnkgY2xpY2sgb3V0c2lkZQojIHRoZSBlbnRyeSB3aWRnZXRzCnByb2MgY2xpY2sge3d9IHsKICAgIGdsb2JhbCBlbnRyaWVzCiAgICBmb3JlYWNoIGUgJGVudHJpZXMgewoJaWYgeyR3ID09ICRlfSByZXR1cm4KICAgIH0KICAgIGZvY3VzIC4KfQoKcHJvYyBzYXZlc3R1ZmYge3d9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIGN0ZXh0IGNmbGlzdCBtYWluZm9udCB0ZXh0Zm9udAogICAgZ2xvYmFsIHN0dWZmc2F2ZWQgZmluZG1lcmdlZmlsZXMgZ2F1ZHlkaWZmCgogICAgaWYgeyRzdHVmZnNhdmVkfSByZXR1cm4KICAgIGlmIHshW3dpbmZvIHZpZXdhYmxlIC5dfSByZXR1cm4KICAgIGNhdGNoIHsKCXNldCBmIFtvcGVuICJ+Ly5naXRrLW5ldyIgd10KCXB1dHMgJGYgW2xpc3Qgc2V0IG1haW5mb250ICRtYWluZm9udF0KCXB1dHMgJGYgW2xpc3Qgc2V0IHRleHRmb250ICR0ZXh0Zm9udF0KCXB1dHMgJGYgW2xpc3Qgc2V0IGZpbmRtZXJnZWZpbGVzICRmaW5kbWVyZ2VmaWxlc10KCXB1dHMgJGYgW2xpc3Qgc2V0IGdhdWR5ZGlmZiAkZ2F1ZHlkaWZmXQoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KHdpZHRoKSBbd2luZm8gd2lkdGggLmN0b3BdIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGhlaWdodCkgW3dpbmZvIGhlaWdodCAuY3RvcF0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudjEpIFtleHByIFt3aW5mbyB3aWR0aCAkY2Fudl0tMl0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudjIpIFtleHByIFt3aW5mbyB3aWR0aCAkY2FudjJdLTJdIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGNhbnYzKSBbZXhwciBbd2luZm8gd2lkdGggJGNhbnYzXS0yXSIKCXB1dHMgJGYgInNldCBnZW9tZXRyeShjYW52aCkgW2V4cHIgW3dpbmZvIGhlaWdodCAkY2Fudl0tMl0iCglzZXQgd2lkIFtleHByIHsoW3dpbmZvIHdpZHRoICRjdGV4dF0gLSA4KSBcCgkJCSAgIC8gW2ZvbnQgbWVhc3VyZSAkdGV4dGZvbnQgIjAiXX1dCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY3RleHR3KSAkd2lkIgoJc2V0IHdpZCBbZXhwciB7KFt3aW5mbyB3aWR0aCAkY2ZsaXN0XSAtIDExKSBcCgkJCSAgIC8gW2ZvbnQgbWVhc3VyZSBbJGNmbGlzdCBjZ2V0IC1mb250XSAiMCJdfV0KCXB1dHMgJGYgInNldCBnZW9tZXRyeShjZmxpc3R3KSAkd2lkIgoJY2xvc2UgJGYKCWZpbGUgcmVuYW1lIC1mb3JjZSAifi8uZ2l0ay1uZXciICJ+Ly5naXRrIgogICAgfQogICAgc2V0IHN0dWZmc2F2ZWQgMQp9Cgpwcm9jIHJlc2l6ZWNsaXN0cGFuZXMge3dpbiB3fSB7CiAgICBnbG9iYWwgb2xkd2lkdGgKICAgIGlmIFtpbmZvIGV4aXN0cyBvbGR3aWR0aCgkd2luKV0gewoJc2V0IHMwIFskd2luIHNhc2ggY29vcmQgMF0KCXNldCBzMSBbJHdpbiBzYXNoIGNvb3JkIDFdCglpZiB7JHcgPCA2MH0gewoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCR3LzIgLSAyKX1dCgkgICAgc2V0IHNhc2gxIFtleHByIHtpbnQoJHcqNS82IC0gMil9XQoJfSBlbHNlIHsKCSAgICBzZXQgZmFjdG9yIFtleHByIHsxLjAgKiAkdyAvICRvbGR3aWR0aCgkd2luKX1dCgkgICAgc2V0IHNhc2gwIFtleHByIHtpbnQoJGZhY3RvciAqIFtsaW5kZXggJHMwIDBdKX1dCgkgICAgc2V0IHNhc2gxIFtleHByIHtpbnQoJGZhY3RvciAqIFtsaW5kZXggJHMxIDBdKX1dCgkgICAgaWYgeyRzYXNoMCA8IDMwfSB7CgkJc2V0IHNhc2gwIDMwCgkgICAgfQoJICAgIGlmIHskc2FzaDEgPCAkc2FzaDAgKyAyMH0gewoJCXNldCBzYXNoMSBbZXhwciAkc2FzaDAgKyAyMF0KCSAgICB9CgkgICAgaWYgeyRzYXNoMSA+ICR3IC0gMTB9IHsKCQlzZXQgc2FzaDEgW2V4cHIgJHcgLSAxMF0KCQlpZiB7JHNhc2gwID4gJHNhc2gxIC0gMjB9IHsKCQkgICAgc2V0IHNhc2gwIFtleHByICRzYXNoMSAtIDIwXQoJCX0KCSAgICB9Cgl9Cgkkd2luIHNhc2ggcGxhY2UgMCAkc2FzaDAgW2xpbmRleCAkczAgMV0KCSR3aW4gc2FzaCBwbGFjZSAxICRzYXNoMSBbbGluZGV4ICRzMSAxXQogICAgfQogICAgc2V0IG9sZHdpZHRoKCR3aW4pICR3Cn0KCnByb2MgcmVzaXplY2RldHBhbmVzIHt3aW4gd30gewogICAgZ2xvYmFsIG9sZHdpZHRoCiAgICBpZiBbaW5mbyBleGlzdHMgb2xkd2lkdGgoJHdpbildIHsKCXNldCBzMCBbJHdpbiBzYXNoIGNvb3JkIDBdCglpZiB7JHcgPCA2MH0gewoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCR3KjMvNCAtIDIpfV0KCX0gZWxzZSB7CgkgICAgc2V0IGZhY3RvciBbZXhwciB7MS4wICogJHcgLyAkb2xkd2lkdGgoJHdpbil9XQoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCRmYWN0b3IgKiBbbGluZGV4ICRzMCAwXSl9XQoJICAgIGlmIHskc2FzaDAgPCA0NX0gewoJCXNldCBzYXNoMCA0NQoJICAgIH0KCSAgICBpZiB7JHNhc2gwID4gJHcgLSAxNX0gewoJCXNldCBzYXNoMCBbZXhwciAkdyAtIDE1XQoJICAgIH0KCX0KCSR3aW4gc2FzaCBwbGFjZSAwICRzYXNoMCBbbGluZGV4ICRzMCAxXQogICAgfQogICAgc2V0IG9sZHdpZHRoKCR3aW4pICR3Cn0KCnByb2MgYWxsY2FudnMgYXJncyB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MwogICAgZXZhbCAkY2FudiAkYXJncwogICAgZXZhbCAkY2FudjIgJGFyZ3MKICAgIGV2YWwgJGNhbnYzICRhcmdzCn0KCnByb2MgYmluZGFsbCB7ZXZlbnQgYWN0aW9ufSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MwogICAgYmluZCAkY2FudiAkZXZlbnQgJGFjdGlvbgogICAgYmluZCAkY2FudjIgJGV2ZW50ICRhY3Rpb24KICAgIGJpbmQgJGNhbnYzICRldmVudCAkYWN0aW9uCn0KCnByb2MgYWJvdXQge30gewogICAgc2V0IHcgLmFib3V0CiAgICBpZiB7W3dpbmZvIGV4aXN0cyAkd119IHsKCXJhaXNlICR3CglyZXR1cm4KICAgIH0KICAgIHRvcGxldmVsICR3CiAgICB3bSB0aXRsZSAkdyAiQWJvdXQgZ2l0ayIKICAgIG1lc3NhZ2UgJHcubSAtdGV4dCB7CkdpdGsgdmVyc2lvbiAxLjIKCkNvcHlyaWdodCCpIDIwMDUgUGF1bCBNYWNrZXJyYXMKClVzZSBhbmQgcmVkaXN0cmlidXRlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2V9IFwKCSAgICAtanVzdGlmeSBjZW50ZXIgLWFzcGVjdCA0MDAKICAgIHBhY2sgJHcubSAtc2lkZSB0b3AgLWZpbGwgeCAtcGFkeCAyMCAtcGFkeSAyMAogICAgYnV0dG9uICR3Lm9rIC10ZXh0IENsb3NlIC1jb21tYW5kICJkZXN0cm95ICR3IgogICAgcGFjayAkdy5vayAtc2lkZSBib3R0b20KfQoKcHJvYyBhc3NpZ25jb2xvciB7aWR9IHsKICAgIGdsb2JhbCBjb21taXRpbmZvIGNvbG9ybWFwIGNvbW1jb2xvcnMgY29sb3JzIG5leHRjb2xvcgogICAgZ2xvYmFsIHBhcmVudHMgbnBhcmVudHMgY2hpbGRyZW4gbmNoaWxkcmVuCiAgICBnbG9iYWwgY29ybmVyY3Jvc3NpbmdzIGNyb3NzaW5ncwoKICAgIGlmIFtpbmZvIGV4aXN0cyBjb2xvcm1hcCgkaWQpXSByZXR1cm4KICAgIHNldCBuY29sb3JzIFtsbGVuZ3RoICRjb2xvcnNdCiAgICBpZiB7JG5wYXJlbnRzKCRpZCkgPD0gMSAmJiAkbmNoaWxkcmVuKCRpZCkgPT0gMX0gewoJc2V0IGNoaWxkIFtsaW5kZXggJGNoaWxkcmVuKCRpZCkgMF0KCWlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJGNoaWxkKV0KCSAgICAmJiAkbnBhcmVudHMoJGNoaWxkKSA9PSAxfSB7CgkgICAgc2V0IGNvbG9ybWFwKCRpZCkgJGNvbG9ybWFwKCRjaGlsZCkKCSAgICByZXR1cm4KCX0KICAgIH0KICAgIHNldCBiYWRjb2xvcnMge30KICAgIGlmIHtbaW5mbyBleGlzdHMgY29ybmVyY3Jvc3NpbmdzKCRpZCldfSB7Cglmb3JlYWNoIHggJGNvcm5lcmNyb3NzaW5ncygkaWQpIHsKCSAgICBpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCR4KV0KCQkmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJHgpXSA8IDB9IHsKCQlsYXBwZW5kIGJhZGNvbG9ycyAkY29sb3JtYXAoJHgpCgkgICAgfQoJfQoJaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdID49ICRuY29sb3JzfSB7CgkgICAgc2V0IGJhZGNvbG9ycyB7fQoJfQogICAgfQogICAgc2V0IG9yaWdiYWQgJGJhZGNvbG9ycwogICAgaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdIDwgJG5jb2xvcnMgLSAxfSB7CglpZiB7W2luZm8gZXhpc3RzIGNyb3NzaW5ncygkaWQpXX0gewoJICAgIGZvcmVhY2ggeCAkY3Jvc3NpbmdzKCRpZCkgewoJCWlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJHgpXQoJCSAgICAmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJHgpXSA8IDB9IHsKCQkgICAgbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCR4KQoJCX0KCSAgICB9CgkgICAgaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdID49ICRuY29sb3JzfSB7CgkJc2V0IGJhZGNvbG9ycyAkb3JpZ2JhZAoJICAgIH0KCX0KCXNldCBvcmlnYmFkICRiYWRjb2xvcnMKICAgIH0KICAgIGlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA8ICRuY29sb3JzIC0gMX0gewoJZm9yZWFjaCBjaGlsZCAkY2hpbGRyZW4oJGlkKSB7CgkgICAgaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkY2hpbGQpXQoJCSYmIFtsc2VhcmNoIC1leGFjdCAkYmFkY29sb3JzICRjb2xvcm1hcCgkY2hpbGQpXSA8IDB9IHsKCQlsYXBwZW5kIGJhZGNvbG9ycyAkY29sb3JtYXAoJGNoaWxkKQoJICAgIH0KCSAgICBpZiB7W2luZm8gZXhpc3RzIHBhcmVudHMoJGNoaWxkKV19IHsKCQlmb3JlYWNoIHAgJHBhcmVudHMoJGNoaWxkKSB7CgkJICAgIGlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJHApXQoJCQkmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJHApXSA8IDB9IHsKCQkJbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCRwKQoJCSAgICB9CgkJfQoJICAgIH0KCX0KCWlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA+PSAkbmNvbG9yc30gewoJICAgIHNldCBiYWRjb2xvcnMgJG9yaWdiYWQKCX0KICAgIH0KICAgIGZvciB7c2V0IGkgMH0geyRpIDw9ICRuY29sb3JzfSB7aW5jciBpfSB7CglzZXQgYyBbbGluZGV4ICRjb2xvcnMgJG5leHRjb2xvcl0KCWlmIHtbaW5jciBuZXh0Y29sb3JdID49ICRuY29sb3JzfSB7CgkgICAgc2V0IG5leHRjb2xvciAwCgl9CglpZiB7W2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNdfSBicmVhawogICAgfQogICAgc2V0IGNvbG9ybWFwKCRpZCkgJGMKfQoKcHJvYyBpbml0Z3JhcGgge30gewogICAgZ2xvYmFsIGNhbnZ5IGNhbnZ5MCBsaW5lbm8gbnVtY29tbWl0cyBsdGhpY2tuZXNzIG5leHRjb2xvciBsaW5lc3BjCiAgICBnbG9iYWwgbWFpbmxpbmUgc2lkZWxpbmVzCiAgICBnbG9iYWwgbmNoaWxkcmVuIG5jbGVmdAoKICAgIGFsbGNhbnZzIGRlbGV0ZSBhbGwKICAgIHNldCBuZXh0Y29sb3IgMAogICAgc2V0IGNhbnZ5ICRjYW52eTAKICAgIHNldCBsaW5lbm8gLTEKICAgIHNldCBudW1jb21taXRzIDAKICAgIHNldCBsdGhpY2tuZXNzIFtleHByIHtpbnQoJGxpbmVzcGMgLyA5KSArIDF9XQogICAgY2F0Y2gge3Vuc2V0IG1haW5saW5lfQogICAgY2F0Y2gge3Vuc2V0IHNpZGVsaW5lc30KICAgIGZvcmVhY2ggaWQgW2FycmF5IG5hbWVzIG5jaGlsZHJlbl0gewoJc2V0IG5jbGVmdCgkaWQpICRuY2hpbGRyZW4oJGlkKQogICAgfQp9Cgpwcm9jIGJpbmRsaW5lIHt0IGlkfSB7CiAgICBnbG9iYWwgY2FudgoKICAgICRjYW52IGJpbmQgJHQgPEVudGVyPiAibGluZWVudGVyICV4ICV5ICRpZCIKICAgICRjYW52IGJpbmQgJHQgPE1vdGlvbj4gImxpbmVtb3Rpb24gJXggJXkgJGlkIgogICAgJGNhbnYgYmluZCAkdCA8TGVhdmU+ICJsaW5lbGVhdmUgJGlkIgogICAgJGNhbnYgYmluZCAkdCA8QnV0dG9uLTE+ICJsaW5lY2xpY2sgJXggJXkgJGlkIgp9Cgpwcm9jIGRyYXdjb21taXRsaW5lIHtsZXZlbH0gewogICAgZ2xvYmFsIHBhcmVudHMgY2hpbGRyZW4gbnBhcmVudHMgbmNoaWxkcmVuIHRvZG8KICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIG1haW5mb250IG5hbWVmb250IGNhbnZ4MCBjYW52eSBsaW5lc3BjCiAgICBnbG9iYWwgbGluZWlkIGxpbmVodGFnIGxpbmVudGFnIGxpbmVkdGFnIGNvbW1pdGluZm8KICAgIGdsb2JhbCBjb2xvcm1hcCBudW1jb21taXRzIGN1cnJlbnRwYXJlbnRzIGR1cHBhcmVudHMKICAgIGdsb2JhbCBvbGRsZXZlbCBvbGRubGluZXMgb2xkdG9kbwogICAgZ2xvYmFsIGlkdGFncyBpZGxpbmUgaWRoZWFkcwogICAgZ2xvYmFsIGxpbmVubyBsdGhpY2tuZXNzIG1haW5saW5lIHNpZGVsaW5lcwogICAgZ2xvYmFsIGNvbW1pdGxpc3RlZCByb3d0ZXh0eCBpZHBvcwoKICAgIGluY3IgbnVtY29tbWl0cwogICAgaW5jciBsaW5lbm8KICAgIHNldCBpZCBbbGluZGV4ICR0b2RvICRsZXZlbF0KICAgIHNldCBsaW5laWQoJGxpbmVubykgJGlkCiAgICBzZXQgaWRsaW5lKCRpZCkgJGxpbmVubwogICAgc2V0IG9maWxsIFtleHByIHtbaW5mbyBleGlzdHMgY29tbWl0bGlzdGVkKCRpZCldPyAiYmx1ZSI6ICJ3aGl0ZSJ9XQogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXX0gewoJcmVhZGNvbW1pdCAkaWQKCWlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV19IHsKCSAgICBzZXQgY29tbWl0aW5mbygkaWQpIHsiTm8gY29tbWl0IGluZm9ybWF0aW9uIGF2YWlsYWJsZSJ9CgkgICAgc2V0IG5wYXJlbnRzKCRpZCkgMAoJfQogICAgfQogICAgYXNzaWduY29sb3IgJGlkCiAgICBzZXQgY3VycmVudHBhcmVudHMge30KICAgIHNldCBkdXBwYXJlbnRzIHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdGxpc3RlZCgkaWQpXSAmJiBbaW5mbyBleGlzdHMgcGFyZW50cygkaWQpXX0gewoJZm9yZWFjaCBwICRwYXJlbnRzKCRpZCkgewoJICAgIGlmIHtbbHNlYXJjaCAtZXhhY3QgJGN1cnJlbnRwYXJlbnRzICRwXSA8IDB9IHsKCQlsYXBwZW5kIGN1cnJlbnRwYXJlbnRzICRwCgkgICAgfSBlbHNlIHsKCQkjIHJlbWVtYmVyIHRoYXQgdGhpcyBwYXJlbnQgd2FzIGxpc3RlZCB0d2ljZQoJCWxhcHBlbmQgZHVwcGFyZW50cyAkcAoJICAgIH0KCX0KICAgIH0KICAgIHNldCB4IFtleHByICRjYW52eDAgKyAkbGV2ZWwgKiAkbGluZXNwY10KICAgIHNldCB5MSAkY2FudnkKICAgIHNldCBjYW52eSBbZXhwciAkY2FudnkgKyAkbGluZXNwY10KICAgIGFsbGNhbnZzIGNvbmYgLXNjcm9sbHJlZ2lvbiBcCglbbGlzdCAwIDAgMCBbZXhwciAkeTEgKyAwLjUgKiAkbGluZXNwYyArIDJdXQogICAgaWYge1tpbmZvIGV4aXN0cyBtYWlubGluZSgkaWQpXX0gewoJbGFwcGVuZCBtYWlubGluZSgkaWQpICR4ICR5MQoJc2V0IHQgWyRjYW52IGNyZWF0ZSBsaW5lICRtYWlubGluZSgkaWQpIFwKCQkgICAtd2lkdGggJGx0aGlja25lc3MgLWZpbGwgJGNvbG9ybWFwKCRpZCldCgkkY2FudiBsb3dlciAkdAoJYmluZGxpbmUgJHQgJGlkCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHNpZGVsaW5lcygkaWQpXX0gewoJZm9yZWFjaCBscyAkc2lkZWxpbmVzKCRpZCkgewoJICAgIHNldCBjb29yZHMgW2xpbmRleCAkbHMgMF0KCSAgICBzZXQgdGhpY2sgW2xpbmRleCAkbHMgMV0KCSAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIGxpbmUgJGNvb3JkcyAtZmlsbCAkY29sb3JtYXAoJGlkKSBcCgkJICAgICAgIC13aWR0aCBbZXhwciB7JHRoaWNrICogJGx0aGlja25lc3N9XV0KCSAgICAkY2FudiBsb3dlciAkdAoJICAgIGJpbmRsaW5lICR0ICRpZAoJfQogICAgfQogICAgc2V0IG9yYWQgW2V4cHIgeyRsaW5lc3BjIC8gM31dCiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIG92YWwgW2V4cHIgJHggLSAkb3JhZF0gW2V4cHIgJHkxIC0gJG9yYWRdIFwKCSAgICAgICBbZXhwciAkeCArICRvcmFkIC0gMV0gW2V4cHIgJHkxICsgJG9yYWQgLSAxXSBcCgkgICAgICAgLWZpbGwgJG9maWxsIC1vdXRsaW5lIGJsYWNrIC13aWR0aCAxXQogICAgJGNhbnYgcmFpc2UgJHQKICAgICRjYW52IGJpbmQgJHQgPDE+IHtzZWxjYW52bGluZSB7fSAleCAleX0KICAgIHNldCB4dCBbZXhwciAkY2FudngwICsgW2xsZW5ndGggJHRvZG9dICogJGxpbmVzcGNdCiAgICBpZiB7W2xsZW5ndGggJGN1cnJlbnRwYXJlbnRzXSA+IDJ9IHsKCXNldCB4dCBbZXhwciB7JHh0ICsgKFtsbGVuZ3RoICRjdXJyZW50cGFyZW50c10gLSAyKSAqICRsaW5lc3BjfV0KICAgIH0KICAgIHNldCByb3d0ZXh0eCgkbGluZW5vKSAkeHQKICAgIHNldCBpZHBvcygkaWQpIFtsaXN0ICR4ICR4dCAkeTFdCiAgICBpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXSB8fCBbaW5mbyBleGlzdHMgaWRoZWFkcygkaWQpXX0gewoJc2V0IHh0IFtkcmF3dGFncyAkaWQgJHggJHh0ICR5MV0KICAgIH0KICAgIHNldCBoZWFkbGluZSBbbGluZGV4ICRjb21taXRpbmZvKCRpZCkgMF0KICAgIHNldCBuYW1lIFtsaW5kZXggJGNvbW1pdGluZm8oJGlkKSAxXQogICAgc2V0IGRhdGUgW2xpbmRleCAkY29tbWl0aW5mbygkaWQpIDJdCiAgICBzZXQgbGluZWh0YWcoJGxpbmVubykgWyRjYW52IGNyZWF0ZSB0ZXh0ICR4dCAkeTEgLWFuY2hvciB3IFwKCQkJICAgICAgIC10ZXh0ICRoZWFkbGluZSAtZm9udCAkbWFpbmZvbnQgXQogICAgJGNhbnYgYmluZCAkbGluZWh0YWcoJGxpbmVubykgPEJ1dHRvbi0zPiAicm93bWVudSAlWCAlWSAkaWQiCiAgICBzZXQgbGluZW50YWcoJGxpbmVubykgWyRjYW52MiBjcmVhdGUgdGV4dCAzICR5MSAtYW5jaG9yIHcgXAoJCQkgICAgICAgLXRleHQgJG5hbWUgLWZvbnQgJG5hbWVmb250XQogICAgc2V0IGxpbmVkdGFnKCRsaW5lbm8pIFskY2FudjMgY3JlYXRlIHRleHQgMyAkeTEgLWFuY2hvciB3IFwKCQkJICAgICAgIC10ZXh0ICRkYXRlIC1mb250ICRtYWluZm9udF0KfQoKcHJvYyBkcmF3dGFncyB7aWQgeCB4dCB5MX0gewogICAgZ2xvYmFsIGlkdGFncyBpZGhlYWRzCiAgICBnbG9iYWwgbGluZXNwYyBsdGhpY2tuZXNzCiAgICBnbG9iYWwgY2FudiBtYWluZm9udAoKICAgIHNldCBtYXJrcyB7fQogICAgc2V0IG50YWdzIDAKICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CglzZXQgbWFya3MgJGlkdGFncygkaWQpCglzZXQgbnRhZ3MgW2xsZW5ndGggJG1hcmtzXQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGhlYWRzKCRpZCldfSB7CglzZXQgbWFya3MgW2NvbmNhdCAkbWFya3MgJGlkaGVhZHMoJGlkKV0KICAgIH0KICAgIGlmIHskbWFya3MgZXEge319IHsKCXJldHVybiAkeHQKICAgIH0KCiAgICBzZXQgZGVsdGEgW2V4cHIge2ludCgwLjUgKiAoJGxpbmVzcGMgLSAkbHRoaWNrbmVzcykpfV0KICAgIHNldCB5dCBbZXhwciAkeTEgLSAwLjUgKiAkbGluZXNwY10KICAgIHNldCB5YiBbZXhwciAkeXQgKyAkbGluZXNwYyAtIDFdCiAgICBzZXQgeHZhbHMge30KICAgIHNldCB3dmFscyB7fQogICAgZm9yZWFjaCB0YWcgJG1hcmtzIHsKCXNldCB3aWQgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgJHRhZ10KCWxhcHBlbmQgeHZhbHMgJHh0CglsYXBwZW5kIHd2YWxzICR3aWQKCXNldCB4dCBbZXhwciB7JHh0ICsgJGRlbHRhICsgJHdpZCArICRsdGhpY2tuZXNzICsgJGxpbmVzcGN9XQogICAgfQogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSBsaW5lICR4ICR5MSBbbGluZGV4ICR4dmFscyBlbmRdICR5MSBcCgkgICAgICAgLXdpZHRoICRsdGhpY2tuZXNzIC1maWxsIGJsYWNrIC10YWdzIHRhZy4kaWRdCiAgICAkY2FudiBsb3dlciAkdAogICAgZm9yZWFjaCB0YWcgJG1hcmtzIHggJHh2YWxzIHdpZCAkd3ZhbHMgewoJc2V0IHhsIFtleHByICR4ICsgJGRlbHRhXQoJc2V0IHhyIFtleHByICR4ICsgJGRlbHRhICsgJHdpZCArICRsdGhpY2tuZXNzXQoJaWYge1tpbmNyIG50YWdzIC0xXSA+PSAwfSB7CgkgICAgIyBkcmF3IGEgdGFnCgkgICAgJGNhbnYgY3JlYXRlIHBvbHlnb24gJHggW2V4cHIgJHl0ICsgJGRlbHRhXSAkeGwgJHl0XAoJCSR4ciAkeXQgJHhyICR5YiAkeGwgJHliICR4IFtleHByICR5YiAtICRkZWx0YV0gXAoJCS13aWR0aCAxIC1vdXRsaW5lIGJsYWNrIC1maWxsIHllbGxvdyAtdGFncyB0YWcuJGlkCgl9IGVsc2UgewoJICAgICMgZHJhdyBhIGhlYWQKCSAgICBzZXQgeGwgW2V4cHIgJHhsIC0gJGRlbHRhLzJdCgkgICAgJGNhbnYgY3JlYXRlIHBvbHlnb24gJHggJHl0ICR4ciAkeXQgJHhyICR5YiAkeCAkeWIgXAoJCS13aWR0aCAxIC1vdXRsaW5lIGJsYWNrIC1maWxsIGdyZWVuIC10YWdzIHRhZy4kaWQKCX0KCSRjYW52IGNyZWF0ZSB0ZXh0ICR4bCAkeTEgLWFuY2hvciB3IC10ZXh0ICR0YWcgXAoJICAgIC1mb250ICRtYWluZm9udCAtdGFncyB0YWcuJGlkCiAgICB9CiAgICByZXR1cm4gJHh0Cn0KCnByb2MgdXBkYXRldG9kbyB7bGV2ZWwgbm9zaG9ydGN1dH0gewogICAgZ2xvYmFsIGN1cnJlbnRwYXJlbnRzIG5jbGVmdCB0b2RvCiAgICBnbG9iYWwgbWFpbmxpbmUgb2xkbGV2ZWwgb2xkdG9kbyBvbGRubGluZXMKICAgIGdsb2JhbCBjYW52eDAgY2FudnkgbGluZXNwYyBtYWlubGluZQogICAgZ2xvYmFsIGNvbW1pdGluZm8KCiAgICBzZXQgb2xkbGV2ZWwgJGxldmVsCiAgICBzZXQgb2xkdG9kbyAkdG9kbwogICAgc2V0IG9sZG5saW5lcyBbbGxlbmd0aCAkdG9kb10KICAgIGlmIHshJG5vc2hvcnRjdXQgJiYgW2xsZW5ndGggJGN1cnJlbnRwYXJlbnRzXSA9PSAxfSB7CglzZXQgcCBbbGluZGV4ICRjdXJyZW50cGFyZW50cyAwXQoJaWYgeyRuY2xlZnQoJHApID09IDEgJiYgW2xzZWFyY2ggLWV4YWN0ICR0b2RvICRwXSA8IDB9IHsKCSAgICBzZXQgbmNsZWZ0KCRwKSAwCgkgICAgc2V0IHggW2V4cHIgJGNhbnZ4MCArICRsZXZlbCAqICRsaW5lc3BjXQoJICAgIHNldCB5IFtleHByICRjYW52eSAtICRsaW5lc3BjXQoJICAgIHNldCBtYWlubGluZSgkcCkgW2xpc3QgJHggJHldCgkgICAgc2V0IHRvZG8gW2xyZXBsYWNlICR0b2RvICRsZXZlbCAkbGV2ZWwgJHBdCgkgICAgcmV0dXJuIDAKCX0KICAgIH0KCiAgICBzZXQgdG9kbyBbbHJlcGxhY2UgJHRvZG8gJGxldmVsICRsZXZlbF0KICAgIHNldCBpICRsZXZlbAogICAgZm9yZWFjaCBwICRjdXJyZW50cGFyZW50cyB7CglpbmNyIG5jbGVmdCgkcCkgLTEKCXNldCBrIFtsc2VhcmNoIC1leGFjdCAkdG9kbyAkcF0KCWlmIHskayA8IDB9IHsKCSAgICBzZXQgdG9kbyBbbGluc2VydCAkdG9kbyAkaSAkcF0KCSAgICBpbmNyIGkKCX0KICAgIH0KICAgIHJldHVybiAxCn0KCnByb2Mgbm90ZWNyb3NzaW5ncyB7aWQgbG8gaGkgY29ybmVyfSB7CiAgICBnbG9iYWwgb2xkdG9kbyBjcm9zc2luZ3MgY29ybmVyY3Jvc3NpbmdzCgogICAgZm9yIHtzZXQgaSAkbG99IHtbaW5jciBpXSA8ICRoaX0ge30gewoJc2V0IHAgW2xpbmRleCAkb2xkdG9kbyAkaV0KCWlmIHskcCA9PSB7fX0gY29udGludWUKCWlmIHskaSA9PSAkY29ybmVyfSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgY29ybmVyY3Jvc3NpbmdzKCRpZCldCgkJfHwgW2xzZWFyY2ggLWV4YWN0ICRjb3JuZXJjcm9zc2luZ3MoJGlkKSAkcF0gPCAwfSB7CgkJbGFwcGVuZCBjb3JuZXJjcm9zc2luZ3MoJGlkKSAkcAoJICAgIH0KCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb3JuZXJjcm9zc2luZ3MoJHApXQoJCXx8IFtsc2VhcmNoIC1leGFjdCAkY29ybmVyY3Jvc3NpbmdzKCRwKSAkaWRdIDwgMH0gewoJCWxhcHBlbmQgY29ybmVyY3Jvc3NpbmdzKCRwKSAkaWQKCSAgICB9Cgl9IGVsc2UgewoJICAgIGlmIHshW2luZm8gZXhpc3RzIGNyb3NzaW5ncygkaWQpXQoJCXx8IFtsc2VhcmNoIC1leGFjdCAkY3Jvc3NpbmdzKCRpZCkgJHBdIDwgMH0gewoJCWxhcHBlbmQgY3Jvc3NpbmdzKCRpZCkgJHAKCSAgICB9CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgY3Jvc3NpbmdzKCRwKV0KCQl8fCBbbHNlYXJjaCAtZXhhY3QgJGNyb3NzaW5ncygkcCkgJGlkXSA8IDB9IHsKCQlsYXBwZW5kIGNyb3NzaW5ncygkcCkgJGlkCgkgICAgfQoJfQogICAgfQp9Cgpwcm9jIGRyYXdzbGFudHMge30gewogICAgZ2xvYmFsIGNhbnYgbWFpbmxpbmUgc2lkZWxpbmVzIGNhbnZ4MCBjYW52eSBsaW5lc3BjCiAgICBnbG9iYWwgb2xkbGV2ZWwgb2xkdG9kbyB0b2RvIGN1cnJlbnRwYXJlbnRzIGR1cHBhcmVudHMKICAgIGdsb2JhbCBsdGhpY2tuZXNzIGxpbmVzcGMgY2FudnkgY29sb3JtYXAKCiAgICBzZXQgeTEgW2V4cHIgJGNhbnZ5IC0gJGxpbmVzcGNdCiAgICBzZXQgeTIgJGNhbnZ5CiAgICBzZXQgaSAtMQogICAgZm9yZWFjaCBpZCAkb2xkdG9kbyB7CglpbmNyIGkKCWlmIHskaWQgPT0ge319IGNvbnRpbnVlCglzZXQgeGkgW2V4cHIgeyRjYW52eDAgKyAkaSAqICRsaW5lc3BjfV0KCWlmIHskaSA9PSAkb2xkbGV2ZWx9IHsKCSAgICBmb3JlYWNoIHAgJGN1cnJlbnRwYXJlbnRzIHsKCQlzZXQgaiBbbHNlYXJjaCAtZXhhY3QgJHRvZG8gJHBdCgkJc2V0IGNvb3JkcyBbbGlzdCAkeGkgJHkxXQoJCXNldCB4aiBbZXhwciB7JGNhbnZ4MCArICRqICogJGxpbmVzcGN9XQoJCWlmIHskaiA8ICRpIC0gMX0gewoJCSAgICBsYXBwZW5kIGNvb3JkcyBbZXhwciAkeGogKyAkbGluZXNwY10gJHkxCgkJICAgIG5vdGVjcm9zc2luZ3MgJHAgJGogJGkgW2V4cHIgeyRqICsgMX1dCgkJfSBlbHNlaWYgeyRqID4gJGkgKyAxfSB7CgkJICAgIGxhcHBlbmQgY29vcmRzIFtleHByICR4aiAtICRsaW5lc3BjXSAkeTEKCQkgICAgbm90ZWNyb3NzaW5ncyAkcCAkaSAkaiBbZXhwciB7JGogLSAxfV0KCQl9CgkJaWYge1tsc2VhcmNoIC1leGFjdCAkZHVwcGFyZW50cyAkcF0gPj0gMH0gewoJCSAgICAjIGRyYXcgYSBkb3VibGUtd2lkdGggbGluZSB0byBpbmRpY2F0ZSB0aGUgZG91YmxlZCBwYXJlbnQKCQkgICAgbGFwcGVuZCBjb29yZHMgJHhqICR5MgoJCSAgICBsYXBwZW5kIHNpZGVsaW5lcygkcCkgW2xpc3QgJGNvb3JkcyAyXQoJCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBtYWlubGluZSgkcCldfSB7CgkJCXNldCBtYWlubGluZSgkcCkgW2xpc3QgJHhqICR5Ml0KCQkgICAgfQoJCX0gZWxzZSB7CgkJICAgICMgbm9ybWFsIGNhc2UsIG5vIHBhcmVudCBkdXBsaWNhdGVkCgkJICAgIGlmIHshW2luZm8gZXhpc3RzIG1haW5saW5lKCRwKV19IHsKCQkJaWYgeyRpICE9ICRqfSB7CgkJCSAgICBsYXBwZW5kIGNvb3JkcyAkeGogJHkyCgkJCX0KCQkJc2V0IG1haW5saW5lKCRwKSAkY29vcmRzCgkJICAgIH0gZWxzZSB7CgkJCWxhcHBlbmQgY29vcmRzICR4aiAkeTIKCQkJbGFwcGVuZCBzaWRlbGluZXMoJHApIFtsaXN0ICRjb29yZHMgMV0KCQkgICAgfQoJCX0KCSAgICB9Cgl9IGVsc2VpZiB7W2xpbmRleCAkdG9kbyAkaV0gIT0gJGlkfSB7CgkgICAgc2V0IGogW2xzZWFyY2ggLWV4YWN0ICR0b2RvICRpZF0KCSAgICBzZXQgeGogW2V4cHIgeyRjYW52eDAgKyAkaiAqICRsaW5lc3BjfV0KCSAgICBsYXBwZW5kIG1haW5saW5lKCRpZCkgJHhpICR5MSAkeGogJHkyCgl9CiAgICB9Cn0KCnByb2MgZGVjaWRlbmV4dCB7e25vcmVhZCAwfX0gewogICAgZ2xvYmFsIHBhcmVudHMgY2hpbGRyZW4gbmNoaWxkcmVuIG5jbGVmdCB0b2RvCiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBtYWluZm9udCBuYW1lZm9udCBjYW52eDAgY2FudnkgbGluZXNwYwogICAgZ2xvYmFsIGRhdGVtb2RlIGNkYXRlCiAgICBnbG9iYWwgY29tbWl0aW5mbwogICAgZ2xvYmFsIGN1cnJlbnRwYXJlbnRzIG9sZGxldmVsIG9sZG5saW5lcyBvbGR0b2RvCiAgICBnbG9iYWwgbGluZW5vIGx0aGlja25lc3MKCiAgICAjIHJlbW92ZSB0aGUgbnVsbCBlbnRyeSBpZiBwcmVzZW50CiAgICBzZXQgbnVsbGVudHJ5IFtsc2VhcmNoIC1leGFjdCAkdG9kbyB7fV0KICAgIGlmIHskbnVsbGVudHJ5ID49IDB9IHsKCXNldCB0b2RvIFtscmVwbGFjZSAkdG9kbyAkbnVsbGVudHJ5ICRudWxsZW50cnldCiAgICB9CgogICAgIyBjaG9vc2Ugd2hpY2ggb25lIHRvIGRvIG5leHQgdGltZSBhcm91bmQKICAgIHNldCB0b2RvbCBbbGxlbmd0aCAkdG9kb10KICAgIHNldCBsZXZlbCAtMQogICAgc2V0IGxhdGVzdCB7fQogICAgZm9yIHtzZXQgayAkdG9kb2x9IHtbaW5jciBrIC0xXSA+PSAwfSB7fSB7CglzZXQgcCBbbGluZGV4ICR0b2RvICRrXQoJaWYgeyRuY2xlZnQoJHApID09IDB9IHsKCSAgICBpZiB7JGRhdGVtb2RlfSB7CgkJaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkcCldfSB7CgkJICAgIGlmIHskbm9yZWFkfSB7CgkJCXJldHVybiB7fQoJCSAgICB9CgkJICAgIHJlYWRjb21taXQgJHAKCQl9CgkJaWYgeyRsYXRlc3QgPT0ge30gfHwgJGNkYXRlKCRwKSA+ICRsYXRlc3R9IHsKCQkgICAgc2V0IGxldmVsICRrCgkJICAgIHNldCBsYXRlc3QgJGNkYXRlKCRwKQoJCX0KCSAgICB9IGVsc2UgewoJCXNldCBsZXZlbCAkawoJCWJyZWFrCgkgICAgfQoJfQogICAgfQogICAgaWYgeyRsZXZlbCA8IDB9IHsKCWlmIHskdG9kbyAhPSB7fX0gewoJICAgIHB1dHMgIkVSUk9SOiBub25lIG9mIHRoZSBwZW5kaW5nIGNvbW1pdHMgY2FuIGJlIGRvbmUgeWV0OiIKCSAgICBmb3JlYWNoIHAgJHRvZG8gewoJCXB1dHMgIiAgJHAgKCRuY2xlZnQoJHApKSIKCSAgICB9Cgl9CglyZXR1cm4gLTEKICAgIH0KCiAgICAjIElmIHdlIGFyZSByZWR1Y2luZywgcHV0IGluIGEgbnVsbCBlbnRyeQogICAgaWYgeyR0b2RvbCA8ICRvbGRubGluZXN9IHsKCWlmIHskbnVsbGVudHJ5ID49IDB9IHsKCSAgICBzZXQgaSAkbnVsbGVudHJ5CgkgICAgd2hpbGUgeyRpIDwgJHRvZG9sCgkJICAgJiYgW2xpbmRleCAkb2xkdG9kbyAkaV0gPT0gW2xpbmRleCAkdG9kbyAkaV19IHsKCQlpbmNyIGkKCSAgICB9Cgl9IGVsc2UgewoJICAgIHNldCBpICRvbGRsZXZlbAoJICAgIGlmIHskbGV2ZWwgPj0gJGl9IHsKCQlpbmNyIGkKCSAgICB9Cgl9CglpZiB7JGkgPCAkdG9kb2x9IHsKCSAgICBzZXQgdG9kbyBbbGluc2VydCAkdG9kbyAkaSB7fV0KCSAgICBpZiB7JGxldmVsID49ICRpfSB7CgkJaW5jciBsZXZlbAoJICAgIH0KCX0KICAgIH0KICAgIHJldHVybiAkbGV2ZWwKfQoKcHJvYyBkcmF3Y29tbWl0IHtpZH0gewogICAgZ2xvYmFsIHBoYXNlIHRvZG8gbmNoaWxkcmVuIGRhdGVtb2RlIG5leHR1cGRhdGUKICAgIGdsb2JhbCBzdGFydGNvbW1pdHMKCiAgICBpZiB7JHBoYXNlICE9ICJpbmNyZHJhdyJ9IHsKCXNldCBwaGFzZSBpbmNyZHJhdwoJc2V0IHRvZG8gJGlkCglzZXQgc3RhcnRjb21taXRzICRpZAoJaW5pdGdyYXBoCglkcmF3Y29tbWl0bGluZSAwCgl1cGRhdGV0b2RvIDAgJGRhdGVtb2RlCiAgICB9IGVsc2UgewoJaWYgeyRuY2hpbGRyZW4oJGlkKSA9PSAwfSB7CgkgICAgbGFwcGVuZCB0b2RvICRpZAoJICAgIGxhcHBlbmQgc3RhcnRjb21taXRzICRpZAoJfQoJc2V0IGxldmVsIFtkZWNpZGVuZXh0IDFdCglpZiB7JGxldmVsID09IHt9IHx8ICRpZCAhPSBbbGluZGV4ICR0b2RvICRsZXZlbF19IHsKCSAgICByZXR1cm4KCX0KCXdoaWxlIDEgewoJICAgIGRyYXdzbGFudHMKCSAgICBkcmF3Y29tbWl0bGluZSAkbGV2ZWwKCSAgICBpZiB7W3VwZGF0ZXRvZG8gJGxldmVsICRkYXRlbW9kZV19IHsKCQlzZXQgbGV2ZWwgW2RlY2lkZW5leHQgMV0KCQlpZiB7JGxldmVsID09IHt9fSBicmVhawoJICAgIH0KCSAgICBzZXQgaWQgW2xpbmRleCAkdG9kbyAkbGV2ZWxdCgkgICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0bGlzdGVkKCRpZCldfSB7CgkJYnJlYWsKCSAgICB9CgkgICAgaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJG5leHR1cGRhdGV9IHsKCQlkb3VwZGF0ZQoJCWlmIHskc3RvcHBlZH0gYnJlYWsKCSAgICB9Cgl9CiAgICB9Cn0KCnByb2MgZmluaXNoY29tbWl0cyB7fSB7CiAgICBnbG9iYWwgcGhhc2UKICAgIGdsb2JhbCBzdGFydGNvbW1pdHMKICAgIGdsb2JhbCBjYW52IG1haW5mb250IGN0ZXh0IG1haW5jdXJzb3IgdGV4dGN1cnNvcgoKICAgIGlmIHskcGhhc2UgIT0gImluY3JkcmF3In0gewoJJGNhbnYgZGVsZXRlIGFsbAoJJGNhbnYgY3JlYXRlIHRleHQgMyAzIC1hbmNob3IgbncgLXRleHQgIk5vIGNvbW1pdHMgc2VsZWN0ZWQiIFwKCSAgICAtZm9udCAkbWFpbmZvbnQgLXRhZ3MgdGV4dGl0ZW1zCglzZXQgcGhhc2Uge30KICAgIH0gZWxzZSB7CglkcmF3c2xhbnRzCglzZXQgbGV2ZWwgW2RlY2lkZW5leHRdCglkcmF3cmVzdCAkbGV2ZWwgW2xsZW5ndGggJHN0YXJ0Y29tbWl0c10KICAgIH0KICAgIC4gY29uZmlnIC1jdXJzb3IgJG1haW5jdXJzb3IKICAgICRjdGV4dCBjb25maWcgLWN1cnNvciAkdGV4dGN1cnNvcgp9Cgpwcm9jIGRyYXdncmFwaCB7fSB7CiAgICBnbG9iYWwgbmV4dHVwZGF0ZSBzdGFydG1zZWNzIHN0YXJ0Y29tbWl0cyB0b2RvCgogICAgaWYgeyRzdGFydGNvbW1pdHMgPT0ge319IHJldHVybgogICAgc2V0IHN0YXJ0bXNlY3MgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQogICAgc2V0IG5leHR1cGRhdGUgW2V4cHIgJHN0YXJ0bXNlY3MgKyAxMDBdCiAgICBpbml0Z3JhcGgKICAgIHNldCB0b2RvIFtsaW5kZXggJHN0YXJ0Y29tbWl0cyAwXQogICAgZHJhd3Jlc3QgMCAxCn0KCnByb2MgZHJhd3Jlc3Qge2xldmVsIHN0YXJ0aXh9IHsKICAgIGdsb2JhbCBwaGFzZSBzdG9wcGVkIHJlZGlzcGxheWluZyBzZWxlY3RlZGxpbmUKICAgIGdsb2JhbCBkYXRlbW9kZSBjdXJyZW50cGFyZW50cyB0b2RvCiAgICBnbG9iYWwgbnVtY29tbWl0cwogICAgZ2xvYmFsIG5leHR1cGRhdGUgc3RhcnRtc2VjcyBzdGFydGNvbW1pdHMgaWRsaW5lCgogICAgaWYgeyRsZXZlbCA+PSAwfSB7CglzZXQgcGhhc2UgZHJhd2dyYXBoCglzZXQgc3RhcnRpZCBbbGluZGV4ICRzdGFydGNvbW1pdHMgJHN0YXJ0aXhdCglzZXQgc3RhcnRsaW5lIC0xCglpZiB7JHN0YXJ0aWQgIT0ge319IHsKCSAgICBzZXQgc3RhcnRsaW5lICRpZGxpbmUoJHN0YXJ0aWQpCgl9Cgl3aGlsZSAxIHsKCSAgICBpZiB7JHN0b3BwZWR9IGJyZWFrCgkgICAgZHJhd2NvbW1pdGxpbmUgJGxldmVsCgkgICAgc2V0IGhhcmQgW3VwZGF0ZXRvZG8gJGxldmVsICRkYXRlbW9kZV0KCSAgICBpZiB7JG51bWNvbW1pdHMgPT0gJHN0YXJ0bGluZX0gewoJCWxhcHBlbmQgdG9kbyAkc3RhcnRpZAoJCXNldCBoYXJkIDEKCQlpbmNyIHN0YXJ0aXgKCQlzZXQgc3RhcnRpZCBbbGluZGV4ICRzdGFydGNvbW1pdHMgJHN0YXJ0aXhdCgkJc2V0IHN0YXJ0bGluZSAtMQoJCWlmIHskc3RhcnRpZCAhPSB7fX0gewoJCSAgICBzZXQgc3RhcnRsaW5lICRpZGxpbmUoJHN0YXJ0aWQpCgkJfQoJICAgIH0KCSAgICBpZiB7JGhhcmR9IHsKCQlzZXQgbGV2ZWwgW2RlY2lkZW5leHRdCgkJaWYgeyRsZXZlbCA8IDB9IGJyZWFrCgkJZHJhd3NsYW50cwoJICAgIH0KCSAgICBpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSA+PSAkbmV4dHVwZGF0ZX0gewoJCXVwZGF0ZQoJCWluY3IgbmV4dHVwZGF0ZSAxMDAKCSAgICB9Cgl9CiAgICB9CiAgICBzZXQgcGhhc2Uge30KICAgIHNldCBkcmF3bXNlY3MgW2V4cHIgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSAtICRzdGFydG1zZWNzXQogICAgI3B1dHMgIm92ZXJhbGwgJGRyYXdtc2VjcyBtcyBmb3IgJG51bWNvbW1pdHMgY29tbWl0cyIKICAgIGlmIHskcmVkaXNwbGF5aW5nfSB7CglpZiB7JHN0b3BwZWQgPT0gMCAmJiBbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gewoJICAgIHNlbGVjdGxpbmUgJHNlbGVjdGVkbGluZQoJfQoJaWYgeyRzdG9wcGVkID09IDF9IHsKCSAgICBzZXQgc3RvcHBlZCAwCgkgICAgYWZ0ZXIgaWRsZSBkcmF3Z3JhcGgKCX0gZWxzZSB7CgkgICAgc2V0IHJlZGlzcGxheWluZyAwCgl9CiAgICB9Cn0KCnByb2MgZmluZG1hdGNoZXMge2Z9IHsKICAgIGdsb2JhbCBmaW5kdHlwZSBmb3VuZHN0cmluZyBmb3VuZHN0cmxlbgogICAgaWYgeyRmaW5kdHlwZSA9PSAiUmVnZXhwIn0gewoJc2V0IG1hdGNoZXMgW3JlZ2V4cCAtaW5kaWNlcyAtYWxsIC1pbmxpbmUgJGZvdW5kc3RyaW5nICRmXQogICAgfSBlbHNlIHsKCWlmIHskZmluZHR5cGUgPT0gIklnbkNhc2UifSB7CgkgICAgc2V0IHN0ciBbc3RyaW5nIHRvbG93ZXIgJGZdCgl9IGVsc2UgewoJICAgIHNldCBzdHIgJGYKCX0KCXNldCBtYXRjaGVzIHt9CglzZXQgaSAwCgl3aGlsZSB7W3NldCBqIFtzdHJpbmcgZmlyc3QgJGZvdW5kc3RyaW5nICRzdHIgJGldXSA+PSAwfSB7CgkgICAgbGFwcGVuZCBtYXRjaGVzIFtsaXN0ICRqIFtleHByICRqKyRmb3VuZHN0cmxlbi0xXV0KCSAgICBzZXQgaSBbZXhwciAkaiArICRmb3VuZHN0cmxlbl0KCX0KICAgIH0KICAgIHJldHVybiAkbWF0Y2hlcwp9Cgpwcm9jIGRvZmluZCB7fSB7CiAgICBnbG9iYWwgZmluZHR5cGUgZmluZGxvYyBmaW5kc3RyaW5nIG1hcmtlZG1hdGNoZXMgY29tbWl0aW5mbwogICAgZ2xvYmFsIG51bWNvbW1pdHMgbGluZWlkIGxpbmVodGFnIGxpbmVudGFnIGxpbmVkdGFnCiAgICBnbG9iYWwgbWFpbmZvbnQgbmFtZWZvbnQgY2FudiBjYW52MiBjYW52MyBzZWxlY3RlZGxpbmUKICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIGZvdW5kc3RyaW5nIGZvdW5kc3RybGVuCgogICAgc3RvcGZpbmRwcm9jCiAgICB1bm1hcmttYXRjaGVzCiAgICBmb2N1cyAuCiAgICBzZXQgbWF0Y2hpbmdsaW5lcyB7fQogICAgaWYgeyRmaW5kbG9jID09ICJQaWNrYXhlIn0gewoJZmluZHBhdGNoZXMKCXJldHVybgogICAgfQogICAgaWYgeyRmaW5kdHlwZSA9PSAiSWduQ2FzZSJ9IHsKCXNldCBmb3VuZHN0cmluZyBbc3RyaW5nIHRvbG93ZXIgJGZpbmRzdHJpbmddCiAgICB9IGVsc2UgewoJc2V0IGZvdW5kc3RyaW5nICRmaW5kc3RyaW5nCiAgICB9CiAgICBzZXQgZm91bmRzdHJsZW4gW3N0cmluZyBsZW5ndGggJGZpbmRzdHJpbmddCiAgICBpZiB7JGZvdW5kc3RybGVuID09IDB9IHJldHVybgogICAgaWYgeyRmaW5kbG9jID09ICJGaWxlcyJ9IHsKCWZpbmRmaWxlcwoJcmV0dXJuCiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CglzZXQgb2xkc2VsIC0xCiAgICB9IGVsc2UgewoJc2V0IG9sZHNlbCAkc2VsZWN0ZWRsaW5lCiAgICB9CiAgICBzZXQgZGlkc2VsIDAKICAgIHNldCBmbGR0eXBlcyB7SGVhZGxpbmUgQXV0aG9yIERhdGUgQ29tbWl0dGVyIENEYXRlIENvbW1lbnR9CiAgICBmb3Ige3NldCBsIDB9IHskbCA8ICRudW1jb21taXRzfSB7aW5jciBsfSB7CglzZXQgaWQgJGxpbmVpZCgkbCkKCXNldCBpbmZvICRjb21taXRpbmZvKCRpZCkKCXNldCBkb2VzbWF0Y2ggMAoJZm9yZWFjaCBmICRpbmZvIHR5ICRmbGR0eXBlcyB7CgkgICAgaWYgeyRmaW5kbG9jICE9ICJBbGwgZmllbGRzIiAmJiAkZmluZGxvYyAhPSAkdHl9IHsKCQljb250aW51ZQoJICAgIH0KCSAgICBzZXQgbWF0Y2hlcyBbZmluZG1hdGNoZXMgJGZdCgkgICAgaWYgeyRtYXRjaGVzID09IHt9fSBjb250aW51ZQoJICAgIHNldCBkb2VzbWF0Y2ggMQoJICAgIGlmIHskdHkgPT0gIkhlYWRsaW5lIn0gewoJCW1hcmttYXRjaGVzICRjYW52ICRsICRmICRsaW5laHRhZygkbCkgJG1hdGNoZXMgJG1haW5mb250CgkgICAgfSBlbHNlaWYgeyR0eSA9PSAiQXV0aG9yIn0gewoJCW1hcmttYXRjaGVzICRjYW52MiAkbCAkZiAkbGluZW50YWcoJGwpICRtYXRjaGVzICRuYW1lZm9udAoJICAgIH0gZWxzZWlmIHskdHkgPT0gIkRhdGUifSB7CgkJbWFya21hdGNoZXMgJGNhbnYzICRsICRmICRsaW5lZHRhZygkbCkgJG1hdGNoZXMgJG1haW5mb250CgkgICAgfQoJfQoJaWYgeyRkb2VzbWF0Y2h9IHsKCSAgICBsYXBwZW5kIG1hdGNoaW5nbGluZXMgJGwKCSAgICBpZiB7ISRkaWRzZWwgJiYgJGwgPiAkb2xkc2VsfSB7CgkJZmluZHNlbGVjdGxpbmUgJGwKCQlzZXQgZGlkc2VsIDEKCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7JG1hdGNoaW5nbGluZXMgPT0ge319IHsKCWJlbGwKICAgIH0gZWxzZWlmIHshJGRpZHNlbH0gewoJZmluZHNlbGVjdGxpbmUgW2xpbmRleCAkbWF0Y2hpbmdsaW5lcyAwXQogICAgfQp9Cgpwcm9jIGZpbmRzZWxlY3RsaW5lIHtsfSB7CiAgICBnbG9iYWwgZmluZGxvYyBjb21tZW50ZW5kIGN0ZXh0CiAgICBzZWxlY3RsaW5lICRsCiAgICBpZiB7JGZpbmRsb2MgPT0gIkFsbCBmaWVsZHMiIHx8ICRmaW5kbG9jID09ICJDb21tZW50cyJ9IHsKCSMgaGlnaGxpZ2h0IHRoZSBtYXRjaGVzIGluIHRoZSBjb21tZW50cwoJc2V0IGYgWyRjdGV4dCBnZXQgMS4wICRjb21tZW50ZW5kXQoJc2V0IG1hdGNoZXMgW2ZpbmRtYXRjaGVzICRmXQoJZm9yZWFjaCBtYXRjaCAkbWF0Y2hlcyB7CgkgICAgc2V0IHN0YXJ0IFtsaW5kZXggJG1hdGNoIDBdCgkgICAgc2V0IGVuZCBbZXhwciBbbGluZGV4ICRtYXRjaCAxXSArIDFdCgkgICAgJGN0ZXh0IHRhZyBhZGQgZm91bmQgIjEuMCArICRzdGFydCBjIiAiMS4wICsgJGVuZCBjIgoJfQogICAgfQp9Cgpwcm9jIGZpbmRuZXh0IHtyZXN0YXJ0fSB7CiAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyBzZWxlY3RlZGxpbmUKICAgIGlmIHshW2luZm8gZXhpc3RzIG1hdGNoaW5nbGluZXNdfSB7CglpZiB7JHJlc3RhcnR9IHsKCSAgICBkb2ZpbmQKCX0KCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBmb3JlYWNoIGwgJG1hdGNoaW5nbGluZXMgewoJaWYgeyRsID4gJHNlbGVjdGVkbGluZX0gewoJICAgIGZpbmRzZWxlY3RsaW5lICRsCgkgICAgcmV0dXJuCgl9CiAgICB9CiAgICBiZWxsCn0KCnByb2MgZmluZHByZXYge30gewogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgc2VsZWN0ZWRsaW5lCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBtYXRjaGluZ2xpbmVzXX0gewoJZG9maW5kCglyZXR1cm4KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgc2V0IHByZXYge30KICAgIGZvcmVhY2ggbCAkbWF0Y2hpbmdsaW5lcyB7CglpZiB7JGwgPj0gJHNlbGVjdGVkbGluZX0gYnJlYWsKCXNldCBwcmV2ICRsCiAgICB9CiAgICBpZiB7JHByZXYgIT0ge319IHsKCWZpbmRzZWxlY3RsaW5lICRwcmV2CiAgICB9IGVsc2UgewoJYmVsbAogICAgfQp9Cgpwcm9jIGZpbmRsb2NjaGFuZ2Uge25hbWUgaXggb3B9IHsKICAgIGdsb2JhbCBmaW5kbG9jIGZpbmR0eXBlIGZpbmR0eXBlbWVudQogICAgaWYgeyRmaW5kbG9jID09ICJQaWNrYXhlIn0gewoJc2V0IGZpbmR0eXBlIEV4YWN0CglzZXQgc3RhdGUgZGlzYWJsZWQKICAgIH0gZWxzZSB7CglzZXQgc3RhdGUgbm9ybWFsCiAgICB9CiAgICAkZmluZHR5cGVtZW51IGVudHJ5Y29uZiAxIC1zdGF0ZSAkc3RhdGUKICAgICRmaW5kdHlwZW1lbnUgZW50cnljb25mIDIgLXN0YXRlICRzdGF0ZQp9Cgpwcm9jIHN0b3BmaW5kcHJvYyB7e2RvbmUgMH19IHsKICAgIGdsb2JhbCBmaW5kcHJvY3BpZCBmaW5kcHJvY2ZpbGUgZmluZGlkcwogICAgZ2xvYmFsIGN0ZXh0IGZpbmRvbGRjdXJzb3IgcGhhc2UgbWFpbmN1cnNvciB0ZXh0Y3Vyc29yCiAgICBnbG9iYWwgZmluZGlucHJvZ3Jlc3MKCiAgICBjYXRjaCB7dW5zZXQgZmluZGlkc30KICAgIGlmIHtbaW5mbyBleGlzdHMgZmluZHByb2NwaWRdfSB7CglpZiB7ISRkb25lfSB7CgkgICAgY2F0Y2gge2V4ZWMga2lsbCAkZmluZHByb2NwaWR9Cgl9CgljYXRjaCB7Y2xvc2UgJGZpbmRwcm9jZmlsZX0KCXVuc2V0IGZpbmRwcm9jcGlkCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGZpbmRpbnByb2dyZXNzXX0gewoJdW5zZXQgZmluZGlucHJvZ3Jlc3MKCWlmIHskcGhhc2UgIT0gImluY3JkcmF3In0gewoJICAgIC4gY29uZmlnIC1jdXJzb3IgJG1haW5jdXJzb3IKCSAgICAkY3RleHQgY29uZmlnIC1jdXJzb3IgJHRleHRjdXJzb3IKCX0KICAgIH0KfQoKcHJvYyBmaW5kcGF0Y2hlcyB7fSB7CiAgICBnbG9iYWwgZmluZHN0cmluZyBzZWxlY3RlZGxpbmUgbnVtY29tbWl0cwogICAgZ2xvYmFsIGZpbmRwcm9jcGlkIGZpbmRwcm9jZmlsZQogICAgZ2xvYmFsIGZpbmRkaWRzZWwgY3RleHQgbGluZWlkIGZpbmRpbnByb2dyZXNzCiAgICBnbG9iYWwgZmluZGluc2VydHBvcwoKICAgIGlmIHskbnVtY29tbWl0cyA9PSAwfSByZXR1cm4KCiAgICAjIG1ha2UgYSBsaXN0IG9mIGFsbCB0aGUgaWRzIHRvIHNlYXJjaCwgc3RhcnRpbmcgYXQgdGhlIG9uZQogICAgIyBhZnRlciB0aGUgc2VsZWN0ZWQgbGluZSAoaWYgYW55KQogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CglzZXQgbCAkc2VsZWN0ZWRsaW5lCiAgICB9IGVsc2UgewoJc2V0IGwgLTEKICAgIH0KICAgIHNldCBpbnB1dGlkcyB7fQogICAgZm9yIHtzZXQgaSAwfSB7JGkgPCAkbnVtY29tbWl0c30ge2luY3IgaX0gewoJaWYge1tpbmNyIGxdID49ICRudW1jb21taXRzfSB7CgkgICAgc2V0IGwgMAoJfQoJYXBwZW5kIGlucHV0aWRzICRsaW5laWQoJGwpICJcbiIKICAgIH0KCiAgICBpZiB7W2NhdGNoIHsKCXNldCBmIFtvcGVuIFtsaXN0IHwgZ2l0LWRpZmYtdHJlZSAtLXN0ZGluIC1zIC1yIC1TJGZpbmRzdHJpbmcgXAoJCQkgPDwgJGlucHV0aWRzXSByXQogICAgfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3Igc3RhcnRpbmcgc2VhcmNoIHByb2Nlc3M6ICRlcnIiCglyZXR1cm4KICAgIH0KCiAgICBzZXQgZmluZGluc2VydHBvcyBlbmQKICAgIHNldCBmaW5kcHJvY2ZpbGUgJGYKICAgIHNldCBmaW5kcHJvY3BpZCBbcGlkICRmXQogICAgZmNvbmZpZ3VyZSAkZiAtYmxvY2tpbmcgMAogICAgZmlsZWV2ZW50ICRmIHJlYWRhYmxlIHJlYWRmaW5kcHJvYwogICAgc2V0IGZpbmRkaWRzZWwgMAogICAgLiBjb25maWcgLWN1cnNvciB3YXRjaAogICAgJGN0ZXh0IGNvbmZpZyAtY3Vyc29yIHdhdGNoCiAgICBzZXQgZmluZGlucHJvZ3Jlc3MgMQp9Cgpwcm9jIHJlYWRmaW5kcHJvYyB7fSB7CiAgICBnbG9iYWwgZmluZHByb2NmaWxlIGZpbmRkaWRzZWwKICAgIGdsb2JhbCBpZGxpbmUgbWF0Y2hpbmdsaW5lcyBmaW5kaW5zZXJ0cG9zCgogICAgc2V0IG4gW2dldHMgJGZpbmRwcm9jZmlsZSBsaW5lXQogICAgaWYgeyRuIDwgMH0gewoJaWYge1tlb2YgJGZpbmRwcm9jZmlsZV19IHsKCSAgICBzdG9wZmluZHByb2MgMQoJICAgIGlmIHshJGZpbmRkaWRzZWx9IHsKCQliZWxsCgkgICAgfQoJfQoJcmV0dXJuCiAgICB9CiAgICBpZiB7IVtyZWdleHAge15bMC05YS1mXXs0MH19ICRsaW5lIGlkXX0gewoJZXJyb3JfcG9wdXAgIkNhbid0IHBhcnNlIGdpdC1kaWZmLXRyZWUgb3V0cHV0OiAkbGluZSIKCXN0b3BmaW5kcHJvYwoJcmV0dXJuCiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBpZGxpbmUoJGlkKV19IHsKCXB1dHMgc3RkZXJyICJzcHVyaW91cyBpZDogJGlkIgoJcmV0dXJuCiAgICB9CiAgICBzZXQgbCAkaWRsaW5lKCRpZCkKICAgIGluc2VydG1hdGNoICRsICRpZAp9Cgpwcm9jIGluc2VydG1hdGNoIHtsIGlkfSB7CiAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyBmaW5kaW5zZXJ0cG9zIGZpbmRkaWRzZWwKCiAgICBpZiB7JGZpbmRpbnNlcnRwb3MgPT0gImVuZCJ9IHsKCWlmIHskbWF0Y2hpbmdsaW5lcyAhPSB7fSAmJiAkbCA8IFtsaW5kZXggJG1hdGNoaW5nbGluZXMgMF19IHsKCSAgICBzZXQgbWF0Y2hpbmdsaW5lcyBbbGluc2VydCAkbWF0Y2hpbmdsaW5lcyAwICRsXQoJICAgIHNldCBmaW5kaW5zZXJ0cG9zIDEKCX0gZWxzZSB7CgkgICAgbGFwcGVuZCBtYXRjaGluZ2xpbmVzICRsCgl9CiAgICB9IGVsc2UgewoJc2V0IG1hdGNoaW5nbGluZXMgW2xpbnNlcnQgJG1hdGNoaW5nbGluZXMgJGZpbmRpbnNlcnRwb3MgJGxdCglpbmNyIGZpbmRpbnNlcnRwb3MKICAgIH0KICAgIG1hcmtoZWFkbGluZSAkbCAkaWQKICAgIGlmIHshJGZpbmRkaWRzZWx9IHsKCWZpbmRzZWxlY3RsaW5lICRsCglzZXQgZmluZGRpZHNlbCAxCiAgICB9Cn0KCnByb2MgZmluZGZpbGVzIHt9IHsKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUgbnVtY29tbWl0cyBsaW5laWQgY3RleHQKICAgIGdsb2JhbCBmZmlsZWxpbmUgZmluZGRpZHNlbCBwYXJlbnRzIG5wYXJlbnRzCiAgICBnbG9iYWwgZmluZGlucHJvZ3Jlc3MgZmluZHN0YXJ0bGluZSBmaW5kaW5zZXJ0cG9zCiAgICBnbG9iYWwgdHJlZWRpZmZzIGZkaWZmaWRzIGZkaWZmc25lZWRlZCBmZGlmZnBvcwogICAgZ2xvYmFsIGZpbmRtZXJnZWZpbGVzCgogICAgaWYgeyRudW1jb21taXRzID09IDB9IHJldHVybgoKICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gewoJc2V0IGwgW2V4cHIgeyRzZWxlY3RlZGxpbmUgKyAxfV0KICAgIH0gZWxzZSB7CglzZXQgbCAwCiAgICB9CiAgICBzZXQgZmZpbGVsaW5lICRsCiAgICBzZXQgZmluZHN0YXJ0bGluZSAkbAogICAgc2V0IGRpZmZzbmVlZGVkIHt9CiAgICBzZXQgZmRpZmZzbmVlZGVkIHt9CiAgICB3aGlsZSAxIHsKCXNldCBpZCAkbGluZWlkKCRsKQoJaWYgeyRmaW5kbWVyZ2VmaWxlcyB8fCAkbnBhcmVudHMoJGlkKSA9PSAxfSB7CgkgICAgZm9yZWFjaCBwICRwYXJlbnRzKCRpZCkgewoJCWlmIHshW2luZm8gZXhpc3RzIHRyZWVkaWZmcyhbbGlzdCAkaWQgJHBdKV19IHsKCQkgICAgYXBwZW5kIGRpZmZzbmVlZGVkICIkaWQgJHBcbiIKCQkgICAgbGFwcGVuZCBmZGlmZnNuZWVkZWQgW2xpc3QgJGlkICRwXQoJCX0KCSAgICB9Cgl9CglpZiB7W2luY3IgbF0gPj0gJG51bWNvbW1pdHN9IHsKCSAgICBzZXQgbCAwCgl9CglpZiB7JGwgPT0gJGZpbmRzdGFydGxpbmV9IGJyZWFrCiAgICB9CgogICAgIyBzdGFydCBvZmYgYSBnaXQtZGlmZi10cmVlIHByb2Nlc3MgaWYgbmVlZGVkCiAgICBpZiB7JGRpZmZzbmVlZGVkIG5lIHt9fSB7CglpZiB7W2NhdGNoIHsKCSAgICBzZXQgZGYgW29wZW4gW2xpc3QgfCBnaXQtZGlmZi10cmVlIC1yIC0tc3RkaW4gPDwgJGRpZmZzbmVlZGVkXSByXQoJfSBlcnIgXX0gewoJICAgIGVycm9yX3BvcHVwICJFcnJvciBzdGFydGluZyBzZWFyY2ggcHJvY2VzczogJGVyciIKCSAgICByZXR1cm4KCX0KCWNhdGNoIHt1bnNldCBmZGlmZmlkc30KCXNldCBmZGlmZnBvcyAwCglmY29uZmlndXJlICRkZiAtYmxvY2tpbmcgMAoJZmlsZWV2ZW50ICRkZiByZWFkYWJsZSBbbGlzdCByZWFkZmlsZWRpZmZzICRkZl0KICAgIH0KCiAgICBzZXQgZmluZGRpZHNlbCAwCiAgICBzZXQgZmluZGluc2VydHBvcyBlbmQKICAgIHNldCBpZCAkbGluZWlkKCRsKQogICAgc2V0IHAgW2xpbmRleCAkcGFyZW50cygkaWQpIDBdCiAgICAuIGNvbmZpZyAtY3Vyc29yIHdhdGNoCiAgICAkY3RleHQgY29uZmlnIC1jdXJzb3Igd2F0Y2gKICAgIHNldCBmaW5kaW5wcm9ncmVzcyAxCiAgICBmaW5kY29udCBbbGlzdCAkaWQgJHBdCiAgICB1cGRhdGUKfQoKcHJvYyByZWFkZmlsZWRpZmZzIHtkZn0gewogICAgZ2xvYmFsIGZpbmRpZHMgZmRpZmZpZHMgZmRpZmZzCgogICAgc2V0IG4gW2dldHMgJGRmIGxpbmVdCiAgICBpZiB7JG4gPCAwfSB7CglpZiB7W2VvZiAkZGZdfSB7CgkgICAgZG9uZWZpbGVkaWZmCgkgICAgaWYge1tjYXRjaCB7Y2xvc2UgJGRmfSBlcnJdfSB7CgkJc3RvcGZpbmRwcm9jCgkJYmVsbAoJCWVycm9yX3BvcHVwICJFcnJvciBpbiBnaXQtZGlmZi10cmVlOiAkZXJyIgoJICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgZmluZGlkc119IHsKCQlzZXQgaWRzICRmaW5kaWRzCgkJc3RvcGZpbmRwcm9jCgkJYmVsbAoJCWVycm9yX3BvcHVwICJDb3VsZG4ndCBmaW5kIGRpZmZzIGZvciB7JGlkc30iCgkgICAgfQoJfQoJcmV0dXJuCiAgICB9CiAgICBpZiB7W3JlZ2V4cCB7XihbMC05YS1mXXs0MH0pIFwoZnJvbSAoWzAtOWEtZl17NDB9KVwpfSAkbGluZSBtYXRjaCBpZCBwXX0gewoJIyBzdGFydCBvZiBhIG5ldyBzdHJpbmcgb2YgZGlmZnMKCWRvbmVmaWxlZGlmZgoJc2V0IGZkaWZmaWRzIFtsaXN0ICRpZCAkcF0KCXNldCBmZGlmZnMge30KICAgIH0gZWxzZWlmIHtbc3RyaW5nIG1hdGNoICI6KiIgJGxpbmVdfSB7CglsYXBwZW5kIGZkaWZmcyBbbGluZGV4ICRsaW5lIDVdCiAgICB9Cn0KCnByb2MgZG9uZWZpbGVkaWZmIHt9IHsKICAgIGdsb2JhbCBmZGlmZmlkcyBmZGlmZnMgdHJlZWRpZmZzIGZpbmRpZHMKICAgIGdsb2JhbCBmZGlmZnNuZWVkZWQgZmRpZmZwb3MKCiAgICBpZiB7W2luZm8gZXhpc3RzIGZkaWZmaWRzXX0gewoJd2hpbGUge1tsaW5kZXggJGZkaWZmc25lZWRlZCAkZmRpZmZwb3NdIG5lICRmZGlmZmlkcwoJICAgICAgICYmICRmZGlmZnBvcyA8IFtsbGVuZ3RoICRmZGlmZnNuZWVkZWRdfSB7CgkgICAgIyBnaXQtZGlmZi10cmVlIGRvZXNuJ3Qgb3V0cHV0IGFueXRoaW5nIGZvciBhIGNvbW1pdAoJICAgICMgd2hpY2ggZG9lc24ndCBjaGFuZ2UgYW55dGhpbmcKCSAgICBzZXQgbnVsbGlkcyBbbGluZGV4ICRmZGlmZnNuZWVkZWQgJGZkaWZmcG9zXQoJICAgIHNldCB0cmVlZGlmZnMoJG51bGxpZHMpIHt9CgkgICAgaWYge1tpbmZvIGV4aXN0cyBmaW5kaWRzXSAmJiAkbnVsbGlkcyBlcSAkZmluZGlkc30gewoJCXVuc2V0IGZpbmRpZHMKCQlmaW5kY29udCAkbnVsbGlkcwoJICAgIH0KCSAgICBpbmNyIGZkaWZmcG9zCgl9CglpbmNyIGZkaWZmcG9zCgoJaWYgeyFbaW5mbyBleGlzdHMgdHJlZWRpZmZzKCRmZGlmZmlkcyldfSB7CgkgICAgc2V0IHRyZWVkaWZmcygkZmRpZmZpZHMpICRmZGlmZnMKCX0KCWlmIHtbaW5mbyBleGlzdHMgZmluZGlkc10gJiYgJGZkaWZmaWRzIGVxICRmaW5kaWRzfSB7CgkgICAgdW5zZXQgZmluZGlkcwoJICAgIGZpbmRjb250ICRmZGlmZmlkcwoJfQogICAgfQp9Cgpwcm9jIGZpbmRjb250IHtpZHN9IHsKICAgIGdsb2JhbCBmaW5kaWRzIHRyZWVkaWZmcyBwYXJlbnRzIG5wYXJlbnRzCiAgICBnbG9iYWwgZmZpbGVsaW5lIGZpbmRzdGFydGxpbmUgZmluZGRpZHNlbAogICAgZ2xvYmFsIGxpbmVpZCBudW1jb21taXRzIG1hdGNoaW5nbGluZXMgZmluZGlucHJvZ3Jlc3MKICAgIGdsb2JhbCBmaW5kbWVyZ2VmaWxlcwoKICAgIHNldCBpZCBbbGluZGV4ICRpZHMgMF0KICAgIHNldCBwIFtsaW5kZXggJGlkcyAxXQogICAgc2V0IHBpIFtsc2VhcmNoIC1leGFjdCAkcGFyZW50cygkaWQpICRwXQogICAgc2V0IGwgJGZmaWxlbGluZQogICAgd2hpbGUgMSB7CglpZiB7JGZpbmRtZXJnZWZpbGVzIHx8ICRucGFyZW50cygkaWQpID09IDF9IHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyB0cmVlZGlmZnMoJGlkcyldfSB7CgkJc2V0IGZpbmRpZHMgJGlkcwoJCXNldCBmZmlsZWxpbmUgJGwKCQlyZXR1cm4KCSAgICB9CgkgICAgc2V0IGRvZXNtYXRjaCAwCgkgICAgZm9yZWFjaCBmICR0cmVlZGlmZnMoJGlkcykgewoJCXNldCB4IFtmaW5kbWF0Y2hlcyAkZl0KCQlpZiB7JHggIT0ge319IHsKCQkgICAgc2V0IGRvZXNtYXRjaCAxCgkJICAgIGJyZWFrCgkJfQoJICAgIH0KCSAgICBpZiB7JGRvZXNtYXRjaH0gewoJCWluc2VydG1hdGNoICRsICRpZAoJCXNldCBwaSAkbnBhcmVudHMoJGlkKQoJICAgIH0KCX0gZWxzZSB7CgkgICAgc2V0IHBpICRucGFyZW50cygkaWQpCgl9CglpZiB7W2luY3IgcGldID49ICRucGFyZW50cygkaWQpfSB7CgkgICAgc2V0IHBpIDAKCSAgICBpZiB7W2luY3IgbF0gPj0gJG51bWNvbW1pdHN9IHsKCQlzZXQgbCAwCgkgICAgfQoJICAgIGlmIHskbCA9PSAkZmluZHN0YXJ0bGluZX0gYnJlYWsKCSAgICBzZXQgaWQgJGxpbmVpZCgkbCkKCX0KCXNldCBwIFtsaW5kZXggJHBhcmVudHMoJGlkKSAkcGldCglzZXQgaWRzIFtsaXN0ICRpZCAkcF0KICAgIH0KICAgIHN0b3BmaW5kcHJvYwogICAgaWYgeyEkZmluZGRpZHNlbH0gewoJYmVsbAogICAgfQp9CgojIG1hcmsgYSBjb21taXQgYXMgbWF0Y2hpbmcgYnkgcHV0dGluZyBhIHllbGxvdyBiYWNrZ3JvdW5kCiMgYmVoaW5kIHRoZSBoZWFkbGluZQpwcm9jIG1hcmtoZWFkbGluZSB7bCBpZH0gewogICAgZ2xvYmFsIGNhbnYgbWFpbmZvbnQgbGluZWh0YWcgY29tbWl0aW5mbwoKICAgIHNldCBiYm94IFskY2FudiBiYm94ICRsaW5laHRhZygkbCldCiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIHJlY3QgJGJib3ggLW91dGxpbmUge30gLXRhZ3MgbWF0Y2hlcyAtZmlsbCB5ZWxsb3ddCiAgICAkY2FudiBsb3dlciAkdAp9CgojIG1hcmsgdGhlIGJpdHMgb2YgYSBoZWFkbGluZSwgYXV0aG9yIG9yIGRhdGUgdGhhdCBtYXRjaCBhIGZpbmQgc3RyaW5nCnByb2MgbWFya21hdGNoZXMge2NhbnYgbCBzdHIgdGFnIG1hdGNoZXMgZm9udH0gewogICAgc2V0IGJib3ggWyRjYW52IGJib3ggJHRhZ10KICAgIHNldCB4MCBbbGluZGV4ICRiYm94IDBdCiAgICBzZXQgeTAgW2xpbmRleCAkYmJveCAxXQogICAgc2V0IHkxIFtsaW5kZXggJGJib3ggM10KICAgIGZvcmVhY2ggbWF0Y2ggJG1hdGNoZXMgewoJc2V0IHN0YXJ0IFtsaW5kZXggJG1hdGNoIDBdCglzZXQgZW5kIFtsaW5kZXggJG1hdGNoIDFdCglpZiB7JHN0YXJ0ID4gJGVuZH0gY29udGludWUKCXNldCB4b2ZmIFtmb250IG1lYXN1cmUgJGZvbnQgW3N0cmluZyByYW5nZSAkc3RyIDAgW2V4cHIgJHN0YXJ0LTFdXV0KCXNldCB4bGVuIFtmb250IG1lYXN1cmUgJGZvbnQgW3N0cmluZyByYW5nZSAkc3RyIDAgW2V4cHIgJGVuZF1dXQoJc2V0IHQgWyRjYW52IGNyZWF0ZSByZWN0IFtleHByICR4MCskeG9mZl0gJHkwIFtleHByICR4MCskeGxlbisyXSAkeTEgXAoJCSAgIC1vdXRsaW5lIHt9IC10YWdzIG1hdGNoZXMgLWZpbGwgeWVsbG93XQoJJGNhbnYgbG93ZXIgJHQKICAgIH0KfQoKcHJvYyB1bm1hcmttYXRjaGVzIHt9IHsKICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIGZpbmRpZHMKICAgIGFsbGNhbnZzIGRlbGV0ZSBtYXRjaGVzCiAgICBjYXRjaCB7dW5zZXQgbWF0Y2hpbmdsaW5lc30KICAgIGNhdGNoIHt1bnNldCBmaW5kaWRzfQp9Cgpwcm9jIHNlbGNhbnZsaW5lIHt3IHggeX0gewogICAgZ2xvYmFsIGNhbnYgY2FudnkwIGN0ZXh0IGxpbmVzcGMgc2VsZWN0ZWRsaW5lCiAgICBnbG9iYWwgbGluZWlkIGxpbmVodGFnIGxpbmVudGFnIGxpbmVkdGFnIHJvd3RleHR4CiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggPT0ge319IHJldHVybgogICAgc2V0IHlmcmFjIFtsaW5kZXggWyRjYW52IHl2aWV3XSAwXQogICAgc2V0IHkgW2V4cHIgeyR5ICsgJHlmcmFjICogJHltYXh9XQogICAgc2V0IGwgW2V4cHIge2ludCgoJHkgLSAkY2FudnkwKSAvICRsaW5lc3BjICsgMC41KX1dCiAgICBpZiB7JGwgPCAwfSB7CglzZXQgbCAwCiAgICB9CiAgICBpZiB7JHcgZXEgJGNhbnZ9IHsKCWlmIHshW2luZm8gZXhpc3RzIHJvd3RleHR4KCRsKV0gfHwgJHggPCAkcm93dGV4dHgoJGwpfSByZXR1cm4KICAgIH0KICAgIHVubWFya21hdGNoZXMKICAgIHNlbGVjdGxpbmUgJGwKfQoKcHJvYyBzZWxlY3RsaW5lIHtsfSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBjdGV4dCBjb21taXRpbmZvIHNlbGVjdGVkbGluZQogICAgZ2xvYmFsIGxpbmVpZCBsaW5laHRhZyBsaW5lbnRhZyBsaW5lZHRhZwogICAgZ2xvYmFsIGNhbnZ5MCBsaW5lc3BjIHBhcmVudHMgbnBhcmVudHMKICAgIGdsb2JhbCBjZmxpc3QgY3VycmVudGlkIHNoYTFlbnRyeQogICAgZ2xvYmFsIGNvbW1lbnRlbmQgaWR0YWdzCiAgICAkY2FudiBkZWxldGUgaG92ZXIKICAgIGlmIHshW2luZm8gZXhpc3RzIGxpbmVpZCgkbCldIHx8ICFbaW5mbyBleGlzdHMgbGluZWh0YWcoJGwpXX0gcmV0dXJuCiAgICAkY2FudiBkZWxldGUgc2Vjc2VsCiAgICBzZXQgdCBbZXZhbCAkY2FudiBjcmVhdGUgcmVjdCBbJGNhbnYgYmJveCAkbGluZWh0YWcoJGwpXSAtb3V0bGluZSB7e319IFwKCSAgICAgICAtdGFncyBzZWNzZWwgLWZpbGwgWyRjYW52IGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQogICAgJGNhbnYgbG93ZXIgJHQKICAgICRjYW52MiBkZWxldGUgc2Vjc2VsCiAgICBzZXQgdCBbZXZhbCAkY2FudjIgY3JlYXRlIHJlY3QgWyRjYW52MiBiYm94ICRsaW5lbnRhZygkbCldIC1vdXRsaW5lIHt7fX0gXAoJICAgICAgIC10YWdzIHNlY3NlbCAtZmlsbCBbJGNhbnYyIGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQogICAgJGNhbnYyIGxvd2VyICR0CiAgICAkY2FudjMgZGVsZXRlIHNlY3NlbAogICAgc2V0IHQgW2V2YWwgJGNhbnYzIGNyZWF0ZSByZWN0IFskY2FudjMgYmJveCAkbGluZWR0YWcoJGwpXSAtb3V0bGluZSB7e319IFwKCSAgICAgICAtdGFncyBzZWNzZWwgLWZpbGwgWyRjYW52MyBjZ2V0IC1zZWxlY3RiYWNrZ3JvdW5kXV0KICAgICRjYW52MyBsb3dlciAkdAogICAgc2V0IHkgW2V4cHIgeyRjYW52eTAgKyAkbCAqICRsaW5lc3BjfV0KICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIHNldCB5dG9wIFtleHByIHskeSAtICRsaW5lc3BjIC0gMX1dCiAgICBzZXQgeWJvdCBbZXhwciB7JHkgKyAkbGluZXNwYyArIDF9XQogICAgc2V0IHdub3cgWyRjYW52IHl2aWV3XQogICAgc2V0IHd0b3AgW2V4cHIgW2xpbmRleCAkd25vdyAwXSAqICR5bWF4XQogICAgc2V0IHdib3QgW2V4cHIgW2xpbmRleCAkd25vdyAxXSAqICR5bWF4XQogICAgc2V0IHdoIFtleHByIHskd2JvdCAtICR3dG9wfV0KICAgIHNldCBuZXd0b3AgJHd0b3AKICAgIGlmIHskeXRvcCA8ICR3dG9wfSB7CglpZiB7JHlib3QgPCAkd3RvcH0gewoJICAgIHNldCBuZXd0b3AgW2V4cHIgeyR5IC0gJHdoIC8gMi4wfV0KCX0gZWxzZSB7CgkgICAgc2V0IG5ld3RvcCAkeXRvcAoJICAgIGlmIHskbmV3dG9wID4gJHd0b3AgLSAkbGluZXNwY30gewoJCXNldCBuZXd0b3AgW2V4cHIgeyR3dG9wIC0gJGxpbmVzcGN9XQoJICAgIH0KCX0KICAgIH0gZWxzZWlmIHskeWJvdCA+ICR3Ym90fSB7CglpZiB7JHl0b3AgPiAkd2JvdH0gewoJICAgIHNldCBuZXd0b3AgW2V4cHIgeyR5IC0gJHdoIC8gMi4wfV0KCX0gZWxzZSB7CgkgICAgc2V0IG5ld3RvcCBbZXhwciB7JHlib3QgLSAkd2h9XQoJICAgIGlmIHskbmV3dG9wIDwgJHd0b3AgKyAkbGluZXNwY30gewoJCXNldCBuZXd0b3AgW2V4cHIgeyR3dG9wICsgJGxpbmVzcGN9XQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHskbmV3dG9wICE9ICR3dG9wfSB7CglpZiB7JG5ld3RvcCA8IDB9IHsKCSAgICBzZXQgbmV3dG9wIDAKCX0KCWFsbGNhbnZzIHl2aWV3IG1vdmV0byBbZXhwciAkbmV3dG9wICogMS4wIC8gJHltYXhdCiAgICB9CiAgICBzZXQgc2VsZWN0ZWRsaW5lICRsCgogICAgc2V0IGlkICRsaW5laWQoJGwpCiAgICBzZXQgY3VycmVudGlkICRpZAogICAgJHNoYTFlbnRyeSBkZWxldGUgMCBlbmQKICAgICRzaGExZW50cnkgaW5zZXJ0IDAgJGlkCiAgICAkc2hhMWVudHJ5IHNlbGVjdGlvbiBmcm9tIDAKICAgICRzaGExZW50cnkgc2VsZWN0aW9uIHRvIGVuZAoKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgICRjdGV4dCBkZWxldGUgMC4wIGVuZAogICAgJGN0ZXh0IG1hcmsgc2V0IGZtYXJrLjAgMC4wCiAgICAkY3RleHQgbWFyayBncmF2aXR5IGZtYXJrLjAgbGVmdAogICAgc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQogICAgJGN0ZXh0IGluc2VydCBlbmQgIkF1dGhvcjogW2xpbmRleCAkaW5mbyAxXSAgW2xpbmRleCAkaW5mbyAyXVxuIgogICAgJGN0ZXh0IGluc2VydCBlbmQgIkNvbW1pdHRlcjogW2xpbmRleCAkaW5mbyAzXSAgW2xpbmRleCAkaW5mbyA0XVxuIgogICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV19IHsKCSRjdGV4dCBpbnNlcnQgZW5kICJUYWdzOiIKCWZvcmVhY2ggdGFnICRpZHRhZ3MoJGlkKSB7CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiAkdGFnIgoJfQoJJGN0ZXh0IGluc2VydCBlbmQgIlxuIgogICAgfQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuIgogICAgJGN0ZXh0IGluc2VydCBlbmQgW2xpbmRleCAkaW5mbyA1XQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuIgogICAgJGN0ZXh0IHRhZyBkZWxldGUgQ29tbWVudHMKICAgICRjdGV4dCB0YWcgcmVtb3ZlIGZvdW5kIDEuMCBlbmQKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgc2V0IGNvbW1lbnRlbmQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoKICAgICRjZmxpc3QgZGVsZXRlIDAgZW5kCiAgICAkY2ZsaXN0IGluc2VydCBlbmQgIkNvbW1lbnRzIgogICAgaWYgeyRucGFyZW50cygkaWQpID09IDF9IHsKCXN0YXJ0ZGlmZiBbY29uY2F0ICRpZCAkcGFyZW50cygkaWQpXQogICAgfSBlbHNlaWYgeyRucGFyZW50cygkaWQpID4gMX0gewoJbWVyZ2VkaWZmICRpZAogICAgfQp9Cgpwcm9jIHNlbG5leHRsaW5lIHtkaXJ9IHsKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgc2V0IGwgW2V4cHIgJHNlbGVjdGVkbGluZSArICRkaXJdCiAgICB1bm1hcmttYXRjaGVzCiAgICBzZWxlY3RsaW5lICRsCn0KCnByb2MgbWVyZ2VkaWZmIHtpZH0gewogICAgZ2xvYmFsIHBhcmVudHMgZGlmZm1lcmdlaWQgZGlmZm1lcmdlZ2NhIG1lcmdlZmlsZWxpc3QgZGlmZnBpbmRleAoKICAgIHNldCBkaWZmbWVyZ2VpZCAkaWQKICAgIHNldCBkaWZmcGluZGV4IC0xCiAgICBzZXQgZGlmZm1lcmdlZ2NhIFtmaW5kZ2NhICRwYXJlbnRzKCRpZCldCiAgICBpZiB7W2luZm8gZXhpc3RzIG1lcmdlZmlsZWxpc3QoJGlkKV19IHsKCWlmIHskbWVyZ2VmaWxlbGlzdCgkaWQpIG5lIHt9fSB7CgkgICAgc2hvd21lcmdlZGlmZgoJfQogICAgfSBlbHNlIHsKCWNvbnRtZXJnZWRpZmYge30KICAgIH0KfQoKcHJvYyBmaW5kZ2NhIHtpZHN9IHsKICAgIHNldCBnY2Ege30KICAgIGZvcmVhY2ggaWQgJGlkcyB7CglpZiB7JGdjYSBlcSB7fX0gewoJICAgIHNldCBnY2EgJGlkCgl9IGVsc2UgewoJICAgIGlmIHtbY2F0Y2ggewoJCXNldCBnY2EgW2V4ZWMgZ2l0LW1lcmdlLWJhc2UgJGdjYSAkaWRdCgkgICAgfSBlcnJdfSB7CgkJcmV0dXJuIHt9CgkgICAgfQoJfQogICAgfQogICAgcmV0dXJuICRnY2EKfQoKcHJvYyBjb250bWVyZ2VkaWZmIHtpZHN9IHsKICAgIGdsb2JhbCBkaWZmbWVyZ2VpZCBkaWZmcGluZGV4IHBhcmVudHMgbnBhcmVudHMgZGlmZm1lcmdlZ2NhCiAgICBnbG9iYWwgdHJlZWRpZmZzIG1lcmdlZmlsZWxpc3QgZGlmZmlkcyB0cmVlcGVuZGluZwoKICAgICMgZGlmZiB0aGUgY2hpbGQgYWdhaW5zdCBlYWNoIG9mIHRoZSBwYXJlbnRzLCBhbmQgZGlmZgogICAgIyBlYWNoIG9mIHRoZSBwYXJlbnRzIGFnYWluc3QgdGhlIEdDQS4KICAgIHdoaWxlIDEgewoJaWYge1tsaW5kZXggJGlkcyAwXSA9PSAkZGlmZm1lcmdlaWQgJiYgJGRpZmZtZXJnZWdjYSBuZSB7fX0gewoJICAgIHNldCBpZHMgW2xpc3QgW2xpbmRleCAkaWRzIDFdICRkaWZmbWVyZ2VnY2FdCgl9IGVsc2UgewoJICAgIGlmIHtbaW5jciBkaWZmcGluZGV4XSA+PSAkbnBhcmVudHMoJGRpZmZtZXJnZWlkKX0gYnJlYWsKCSAgICBzZXQgcCBbbGluZGV4ICRwYXJlbnRzKCRkaWZmbWVyZ2VpZCkgJGRpZmZwaW5kZXhdCgkgICAgc2V0IGlkcyBbbGlzdCAkZGlmZm1lcmdlaWQgJHBdCgl9CglpZiB7IVtpbmZvIGV4aXN0cyB0cmVlZGlmZnMoJGlkcyldfSB7CgkgICAgc2V0IGRpZmZpZHMgJGlkcwoJICAgIGlmIHshW2luZm8gZXhpc3RzIHRyZWVwZW5kaW5nXX0gewoJCWdldHRyZWVkaWZmcyAkaWRzCgkgICAgfQoJICAgIHJldHVybgoJfQogICAgfQoKICAgICMgSWYgYSBmaWxlIGluIHNvbWUgcGFyZW50IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBjaGlsZCBhbmQgYWxzbwogICAgIyBkaWZmZXJlbnQgZnJvbSB0aGUgR0NBLCB0aGVuIGl0J3MgaW50ZXJlc3RpbmcuCiAgICAjIElmIHdlIGRvbid0IGhhdmUgYSBHQ0EsIHRoZW4gYSBmaWxlIGlzIGludGVyZXN0aW5nIGlmIGl0IGlzCiAgICAjIGRpZmZlcmVudCBmcm9tIHRoZSBjaGlsZCBpbiBhbGwgdGhlIHBhcmVudHMuCiAgICBpZiB7JGRpZmZtZXJnZWdjYSBuZSB7fX0gewoJc2V0IGZpbGVzIHt9Cglmb3JlYWNoIHAgJHBhcmVudHMoJGRpZmZtZXJnZWlkKSB7CgkgICAgc2V0IGdjYWRpZmZzICR0cmVlZGlmZnMoW2xpc3QgJHAgJGRpZmZtZXJnZWdjYV0pCgkgICAgZm9yZWFjaCBmICR0cmVlZGlmZnMoW2xpc3QgJGRpZmZtZXJnZWlkICRwXSkgewoJCWlmIHtbbHNlYXJjaCAtZXhhY3QgJGZpbGVzICRmXSA8IDAKCQkgICAgJiYgW2xzZWFyY2ggLWV4YWN0ICRnY2FkaWZmcyAkZl0gPj0gMH0gewoJCSAgICBsYXBwZW5kIGZpbGVzICRmCgkJfQoJICAgIH0KCX0KCXNldCBmaWxlcyBbbHNvcnQgJGZpbGVzXQogICAgfSBlbHNlIHsKCXNldCBwIFtsaW5kZXggJHBhcmVudHMoJGRpZmZtZXJnZWlkKSAwXQoJc2V0IGZpbGVzICR0cmVlZGlmZnMoW2xpc3QgJGRpZmZtZXJnZWlkICRwXSkKCWZvciB7c2V0IGkgMX0geyRpIDwgJG5wYXJlbnRzKCRkaWZmbWVyZ2VpZCkgJiYgJGZpbGVzIG5lIHt9fSB7aW5jciBpfSB7CgkgICAgc2V0IHAgW2xpbmRleCAkcGFyZW50cygkZGlmZm1lcmdlaWQpICRpXQoJICAgIHNldCBkZiAkdHJlZWRpZmZzKFtsaXN0ICRkaWZmbWVyZ2VpZCAkcF0pCgkgICAgc2V0IG5mIHt9CgkgICAgZm9yZWFjaCBmICRmaWxlcyB7CgkJaWYge1tsc2VhcmNoIC1leGFjdCAkZGYgJGZdID49IDB9IHsKCQkgICAgbGFwcGVuZCBuZiAkZgoJCX0KCSAgICB9CgkgICAgc2V0IGZpbGVzICRuZgoJfQogICAgfQoKICAgIHNldCBtZXJnZWZpbGVsaXN0KCRkaWZmbWVyZ2VpZCkgJGZpbGVzCiAgICBpZiB7JGZpbGVzIG5lIHt9fSB7CglzaG93bWVyZ2VkaWZmCiAgICB9Cn0KCnByb2Mgc2hvd21lcmdlZGlmZiB7fSB7CiAgICBnbG9iYWwgY2ZsaXN0IGRpZmZtZXJnZWlkIG1lcmdlZmlsZWxpc3QgcGFyZW50cwogICAgZ2xvYmFsIGRpZmZvcHRzIGRpZmZpbmh1bmsgY3VycmVudGZpbGUgY3VycmVudGh1bmsgZmlsZWxpbmVzCiAgICBnbG9iYWwgZGlmZmJsb2NrZWQgZ3JvdXBmaWxlbGFzdCBtZXJnZWZkcyBncm91cGZpbGVudW0gZ3JvdXBodW5rcwoKICAgIHNldCBmaWxlcyAkbWVyZ2VmaWxlbGlzdCgkZGlmZm1lcmdlaWQpCiAgICBmb3JlYWNoIGYgJGZpbGVzIHsKCSRjZmxpc3QgaW5zZXJ0IGVuZCAkZgogICAgfQogICAgc2V0IGVudihHSVRfRElGRl9PUFRTKSAkZGlmZm9wdHMKICAgIHNldCBmbGlzdCB7fQogICAgY2F0Y2gge3Vuc2V0IGN1cnJlbnRmaWxlfQogICAgY2F0Y2gge3Vuc2V0IGN1cnJlbnRodW5rfQogICAgY2F0Y2gge3Vuc2V0IGZpbGVsaW5lc30KICAgIGNhdGNoIHt1bnNldCBncm91cGZpbGVudW19CiAgICBjYXRjaCB7dW5zZXQgZ3JvdXBodW5rc30KICAgIHNldCBncm91cGZpbGVsYXN0IC0xCiAgICBmb3JlYWNoIHAgJHBhcmVudHMoJGRpZmZtZXJnZWlkKSB7CglzZXQgY21kIFtsaXN0IHwgZ2l0LWRpZmYtdHJlZSAtcCAkcCAkZGlmZm1lcmdlaWRdCglzZXQgY21kIFtjb25jYXQgJGNtZCAkbWVyZ2VmaWxlbGlzdCgkZGlmZm1lcmdlaWQpXQoJaWYge1tjYXRjaCB7c2V0IGYgW29wZW4gJGNtZCByXX0gZXJyXX0gewoJICAgIGVycm9yX3BvcHVwICJFcnJvciBnZXR0aW5nIGRpZmZzOiAkZXJyIgoJICAgIGZvcmVhY2ggZiAkZmxpc3QgewoJCWNhdGNoIHtjbG9zZSAkZn0KCSAgICB9CgkgICAgcmV0dXJuCgl9CglsYXBwZW5kIGZsaXN0ICRmCglzZXQgaWRzIFtsaXN0ICRkaWZmbWVyZ2VpZCAkcF0KCXNldCBtZXJnZWZkcygkaWRzKSAkZgoJc2V0IGRpZmZpbmh1bmsoJGlkcykgMAoJc2V0IGRpZmZibG9ja2VkKCRpZHMpIDAKCWZjb25maWd1cmUgJGYgLWJsb2NraW5nIDAKCWZpbGVldmVudCAkZiByZWFkYWJsZSBbbGlzdCBnZXRtZXJnZWRpZmZsaW5lICRmICRpZHMgJGRpZmZtZXJnZWlkXQogICAgfQp9Cgpwcm9jIGdldG1lcmdlZGlmZmxpbmUge2YgaWRzIGlkfSB7CiAgICBnbG9iYWwgZGlmZm1lcmdlaWQgZGlmZmluaHVuayBkaWZmb2xkbGluZXMgZGlmZm5ld2xpbmVzCiAgICBnbG9iYWwgY3VycmVudGZpbGUgY3VycmVudGh1bmsKICAgIGdsb2JhbCBkaWZmb2xkc3RhcnQgZGlmZm5ld3N0YXJ0IGRpZmZvbGRsbm8gZGlmZm5ld2xubwogICAgZ2xvYmFsIGRpZmZibG9ja2VkIG1lcmdlZmlsZWxpc3QKICAgIGdsb2JhbCBub2xkbGluZXMgbm5ld2xpbmVzIGRpZmZsY291bnRzIGZpbGVsaW5lcwoKICAgIHNldCBuIFtnZXRzICRmIGxpbmVdCiAgICBpZiB7JG4gPCAwfSB7CglpZiB7IVtlb2YgJGZdfSByZXR1cm4KICAgIH0KCiAgICBpZiB7IShbaW5mbyBleGlzdHMgZGlmZm1lcmdlaWRdICYmICRkaWZmbWVyZ2VpZCA9PSAkaWQpfSB7CglpZiB7JG4gPCAwfSB7CgkgICAgY2xvc2UgJGYKCX0KCXJldHVybgogICAgfQoKICAgIGlmIHskZGlmZmluaHVuaygkaWRzKSAhPSAwfSB7CglzZXQgZmkgJGN1cnJlbnRmaWxlKCRpZHMpCglpZiB7JG4gPiAwICYmIFtyZWdleHAge15bLSsgXFxdfSAkbGluZSBtYXRjaF19IHsKCSAgICAjIGNvbnRpbnVpbmcgYW4gZXhpc3RpbmcgaHVuawoJICAgIHNldCBsaW5lIFtzdHJpbmcgcmFuZ2UgJGxpbmUgMSBlbmRdCgkgICAgc2V0IHAgW2xpbmRleCAkaWRzIDFdCgkgICAgaWYgeyRtYXRjaCBlcSAiLSIgfHwgJG1hdGNoIGVxICIgIn0gewoJCXNldCBmaWxlbGluZXMoJHAsJGZpLCRkaWZmb2xkbG5vKCRpZHMpKSAkbGluZQoJCWluY3IgZGlmZm9sZGxubygkaWRzKQoJICAgIH0KCSAgICBpZiB7JG1hdGNoIGVxICIrIiB8fCAkbWF0Y2ggZXEgIiAifSB7CgkJc2V0IGZpbGVsaW5lcygkaWQsJGZpLCRkaWZmbmV3bG5vKCRpZHMpKSAkbGluZQoJCWluY3IgZGlmZm5ld2xubygkaWRzKQoJICAgIH0KCSAgICBpZiB7JG1hdGNoIGVxICIgIn0gewoJCWlmIHskZGlmZmluaHVuaygkaWRzKSA9PSAyfSB7CgkJICAgIGxhcHBlbmQgZGlmZmxjb3VudHMoJGlkcykgXAoJCQlbbGlzdCAkbm9sZGxpbmVzKCRpZHMpICRubmV3bGluZXMoJGlkcyldCgkJICAgIHNldCBub2xkbGluZXMoJGlkcykgMAoJCSAgICBzZXQgZGlmZmluaHVuaygkaWRzKSAxCgkJfQoJCWluY3Igbm9sZGxpbmVzKCRpZHMpCgkgICAgfSBlbHNlaWYgeyRtYXRjaCBlcSAiLSIgfHwgJG1hdGNoIGVxICIrIn0gewoJCWlmIHskZGlmZmluaHVuaygkaWRzKSA9PSAxfSB7CgkJICAgIGxhcHBlbmQgZGlmZmxjb3VudHMoJGlkcykgW2xpc3QgJG5vbGRsaW5lcygkaWRzKV0KCQkgICAgc2V0IG5vbGRsaW5lcygkaWRzKSAwCgkJICAgIHNldCBubmV3bGluZXMoJGlkcykgMAoJCSAgICBzZXQgZGlmZmluaHVuaygkaWRzKSAyCgkJfQoJCWlmIHskbWF0Y2ggZXEgIi0ifSB7CgkJICAgIGluY3Igbm9sZGxpbmVzKCRpZHMpCgkJfSBlbHNlIHsKCQkgICAgaW5jciBubmV3bGluZXMoJGlkcykKCQl9CgkgICAgfQoJICAgICMgYW5kIGlmIGl0J3MgXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBsaW5lLCB0aGVuIHdoYXQ/CgkgICAgcmV0dXJuCgl9CgkjIGVuZCBvZiBhIGh1bmsKCWlmIHskZGlmZmluaHVuaygkaWRzKSA9PSAxICYmICRub2xkbGluZXMoJGlkcykgIT0gMH0gewoJICAgIGxhcHBlbmQgZGlmZmxjb3VudHMoJGlkcykgW2xpc3QgJG5vbGRsaW5lcygkaWRzKV0KCX0gZWxzZWlmIHskZGlmZmluaHVuaygkaWRzKSA9PSAyCgkJICAmJiAoJG5vbGRsaW5lcygkaWRzKSAhPSAwIHx8ICRubmV3bGluZXMoJGlkcykgIT0gMCl9IHsKCSAgICBsYXBwZW5kIGRpZmZsY291bnRzKCRpZHMpIFtsaXN0ICRub2xkbGluZXMoJGlkcykgJG5uZXdsaW5lcygkaWRzKV0KCX0KCXNldCBjdXJyZW50aHVuaygkaWRzKSBbbGlzdCAkY3VycmVudGZpbGUoJGlkcykgXAoJCQkJICAgJGRpZmZvbGRzdGFydCgkaWRzKSAkZGlmZm5ld3N0YXJ0KCRpZHMpIFwKCQkJCSAgICRkaWZmb2xkbG5vKCRpZHMpICRkaWZmbmV3bG5vKCRpZHMpIFwKCQkJCSAgICRkaWZmbGNvdW50cygkaWRzKV0KCXNldCBkaWZmaW5odW5rKCRpZHMpIDAKCSMgLTEgPSBuZWVkIHRvIGJsb2NrLCAwID0gdW5ibG9ja2VkLCAxID0gaXMgYmxvY2tlZAoJc2V0IGRpZmZibG9ja2VkKCRpZHMpIC0xCglwcm9jZXNzaHVua3MKCWlmIHskZGlmZmJsb2NrZWQoJGlkcykgPT0gLTF9IHsKCSAgICBmaWxlZXZlbnQgJGYgcmVhZGFibGUge30KCSAgICBzZXQgZGlmZmJsb2NrZWQoJGlkcykgMQoJfQogICAgfQoKICAgIGlmIHskbiA8IDB9IHsKCSMgZW9mCglpZiB7ISRkaWZmYmxvY2tlZCgkaWRzKX0gewoJICAgIGNsb3NlICRmCgkgICAgc2V0IGN1cnJlbnRmaWxlKCRpZHMpIFtsbGVuZ3RoICRtZXJnZWZpbGVsaXN0KCRkaWZmbWVyZ2VpZCldCgkgICAgc2V0IGN1cnJlbnRodW5rKCRpZHMpIFtsaXN0ICRjdXJyZW50ZmlsZSgkaWRzKSAwIDAgMCAwIHt9XQoJICAgIHByb2Nlc3NodW5rcwoJfQogICAgfSBlbHNlaWYge1tyZWdleHAge15kaWZmIC0tZ2l0IGEvKC4qKSBiL30gJGxpbmUgbWF0Y2ggZm5hbWVdfSB7CgkjIHN0YXJ0IG9mIGEgbmV3IGZpbGUKCXNldCBjdXJyZW50ZmlsZSgkaWRzKSBcCgkgICAgW2xzZWFyY2ggLWV4YWN0ICRtZXJnZWZpbGVsaXN0KCRkaWZmbWVyZ2VpZCkgJGZuYW1lXQogICAgfSBlbHNlaWYge1tyZWdleHAge15AQCAtKFswLTldKyksKFswLTldKykgXCsoWzAtOV0rKSwoWzAtOV0rKSBAQCguKil9IFwKCQkgICAkbGluZSBtYXRjaCBmMWwgZjFjIGYybCBmMmMgcmVzdF19IHsKCWlmIHtbaW5mbyBleGlzdHMgY3VycmVudGZpbGUoJGlkcyldICYmICRjdXJyZW50ZmlsZSgkaWRzKSA+PSAwfSB7CgkgICAgIyBzdGFydCBvZiBhIG5ldyBodW5rCgkgICAgaWYgeyRmMWwgPT0gMCAmJiAkZjFjID09IDB9IHsKCQlzZXQgZjFsIDEKCSAgICB9CgkgICAgaWYgeyRmMmwgPT0gMCAmJiAkZjJjID09IDB9IHsKCQlzZXQgZjJsIDEKCSAgICB9CgkgICAgc2V0IGRpZmZpbmh1bmsoJGlkcykgMQoJICAgIHNldCBkaWZmb2xkc3RhcnQoJGlkcykgJGYxbAoJICAgIHNldCBkaWZmbmV3c3RhcnQoJGlkcykgJGYybAoJICAgIHNldCBkaWZmb2xkbG5vKCRpZHMpICRmMWwKCSAgICBzZXQgZGlmZm5ld2xubygkaWRzKSAkZjJsCgkgICAgc2V0IGRpZmZsY291bnRzKCRpZHMpIHt9CgkgICAgc2V0IG5vbGRsaW5lcygkaWRzKSAwCgkgICAgc2V0IG5uZXdsaW5lcygkaWRzKSAwCgl9CiAgICB9Cn0KCnByb2MgcHJvY2Vzc2h1bmtzIHt9IHsKICAgIGdsb2JhbCBkaWZmbWVyZ2VpZCBwYXJlbnRzIG5wYXJlbnRzIGN1cnJlbnRodW5rCiAgICBnbG9iYWwgbWVyZ2VmaWxlbGlzdCBkaWZmYmxvY2tlZCBtZXJnZWZkcwogICAgZ2xvYmFsIGdyb3VwaHVua3MgZ3JvdXBsaW5lc3RhcnQgZ3JvdXBsaW5lZW5kIGdyb3VwZmlsZW51bQoKICAgIHNldCBuZmlsZXMgW2xsZW5ndGggJG1lcmdlZmlsZWxpc3QoJGRpZmZtZXJnZWlkKV0KICAgIHdoaWxlIDEgewoJc2V0IGZpICRuZmlsZXMKCXNldCBsbm8gMAoJIyBsb29rIGZvciB0aGUgZWFybGllc3QgaHVuawoJZm9yZWFjaCBwICRwYXJlbnRzKCRkaWZmbWVyZ2VpZCkgewoJICAgIHNldCBpZHMgW2xpc3QgJGRpZmZtZXJnZWlkICRwXQoJICAgIGlmIHshW2luZm8gZXhpc3RzIGN1cnJlbnRodW5rKCRpZHMpXX0gcmV0dXJuCgkgICAgc2V0IGkgW2xpbmRleCAkY3VycmVudGh1bmsoJGlkcykgMF0KCSAgICBzZXQgbCBbbGluZGV4ICRjdXJyZW50aHVuaygkaWRzKSAyXQoJICAgIGlmIHskaSA8ICRmaSB8fCAoJGkgPT0gJGZpICYmICRsIDwgJGxubyl9IHsKCQlzZXQgZmkgJGkKCQlzZXQgbG5vICRsCgkJc2V0IHBpICRwCgkgICAgfQoJfQoKCWlmIHskZmkgPCAkbmZpbGVzfSB7CgkgICAgc2V0IGlkcyBbbGlzdCAkZGlmZm1lcmdlaWQgJHBpXQoJICAgIHNldCBodW5rICRjdXJyZW50aHVuaygkaWRzKQoJICAgIHVuc2V0IGN1cnJlbnRodW5rKCRpZHMpCgkgICAgaWYgeyRkaWZmYmxvY2tlZCgkaWRzKSA+IDB9IHsKCQlmaWxlZXZlbnQgJG1lcmdlZmRzKCRpZHMpIHJlYWRhYmxlIFwKCQkgICAgW2xpc3QgZ2V0bWVyZ2VkaWZmbGluZSAkbWVyZ2VmZHMoJGlkcykgJGlkcyAkZGlmZm1lcmdlaWRdCgkgICAgfQoJICAgIHNldCBkaWZmYmxvY2tlZCgkaWRzKSAwCgoJICAgIGlmIHtbaW5mbyBleGlzdHMgZ3JvdXBmaWxlbnVtXSAmJiAkZ3JvdXBmaWxlbnVtID09ICRmaQoJCSYmICRsbm8gPD0gJGdyb3VwbGluZWVuZH0gewoJCSMgYWRkIHRoaXMgaHVuayB0byB0aGUgcGVuZGluZyBncm91cAoJCWxhcHBlbmQgZ3JvdXBodW5rcygkcGkpICRodW5rCgkJc2V0IGVuZGxuIFtsaW5kZXggJGh1bmsgNF0KCQlpZiB7JGVuZGxuID4gJGdyb3VwbGluZWVuZH0gewoJCSAgICBzZXQgZ3JvdXBsaW5lZW5kICRlbmRsbgoJCX0KCQljb250aW51ZQoJICAgIH0KCX0KCgkjIHN1Y2NlZWRpbmcgc3R1ZmYgZG9lc24ndCBiZWxvbmcgaW4gdGhpcyBncm91cCwgc28KCSMgcHJvY2VzcyB0aGUgZ3JvdXAgbm93CglpZiB7W2luZm8gZXhpc3RzIGdyb3VwZmlsZW51bV19IHsKCSAgICBwcm9jZXNzZ3JvdXAKCSAgICB1bnNldCBncm91cGZpbGVudW0KCSAgICB1bnNldCBncm91cGh1bmtzCgl9CgoJaWYgeyRmaSA+PSAkbmZpbGVzfSBicmVhawoKCSMgc3RhcnQgYSBuZXcgZ3JvdXAKCXNldCBncm91cGZpbGVudW0gJGZpCglzZXQgZ3JvdXBodW5rcygkcGkpIFtsaXN0ICRodW5rXQoJc2V0IGdyb3VwbGluZXN0YXJ0ICRsbm8KCXNldCBncm91cGxpbmVlbmQgW2xpbmRleCAkaHVuayA0XQogICAgfQp9Cgpwcm9jIHByb2Nlc3Nncm91cCB7fSB7CiAgICBnbG9iYWwgZ3JvdXBmaWxlbGFzdCBncm91cGZpbGVudW0gZGlmZmZpbGVzdGFydAogICAgZ2xvYmFsIG1lcmdlZmlsZWxpc3QgZGlmZm1lcmdlaWQgY3RleHQgZmlsZWxpbmVzCiAgICBnbG9iYWwgcGFyZW50cyBkaWZmbWVyZ2VpZCBkaWZmb2Zmc2V0CiAgICBnbG9iYWwgZ3JvdXBodW5rcyBncm91cGxpbmVzdGFydCBncm91cGxpbmVlbmQgbnBhcmVudHMKICAgIGdsb2JhbCBtZXJnZW1heAoKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIHNldCBpZCAkZGlmZm1lcmdlaWQKICAgIHNldCBmICRncm91cGZpbGVudW0KICAgIGlmIHskZ3JvdXBmaWxlbGFzdCAhPSAkZn0gewoJJGN0ZXh0IGluc2VydCBlbmQgIlxuIgoJc2V0IGhlcmUgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJc2V0IGRpZmZmaWxlc3RhcnQoJGYpICRoZXJlCglzZXQgbWFyayBmbWFyay5bZXhwciB7JGYgKyAxfV0KCSRjdGV4dCBtYXJrIHNldCAkbWFyayAkaGVyZQoJJGN0ZXh0IG1hcmsgZ3Jhdml0eSAkbWFyayBsZWZ0CglzZXQgaGVhZGVyIFtsaW5kZXggJG1lcmdlZmlsZWxpc3QoJGlkKSAkZl0KCXNldCBsIFtleHByIHsoNzggLSBbc3RyaW5nIGxlbmd0aCAkaGVhZGVyXSkgLyAyfV0KCXNldCBwYWQgW3N0cmluZyByYW5nZSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgMSAkbF0KCSRjdGV4dCBpbnNlcnQgZW5kICIkcGFkICRoZWFkZXIgJHBhZFxuIiBmaWxlc2VwCglzZXQgZ3JvdXBmaWxlbGFzdCAkZgoJZm9yZWFjaCBwICRwYXJlbnRzKCRpZCkgewoJICAgIHNldCBkaWZmb2Zmc2V0KCRwKSAwCgl9CiAgICB9CgogICAgJGN0ZXh0IGluc2VydCBlbmQgIkBAIiBtc2VwCiAgICBzZXQgbmxpbmVzIFtleHByIHskZ3JvdXBsaW5lZW5kIC0gJGdyb3VwbGluZXN0YXJ0fV0KICAgIHNldCBldmVudHMge30KICAgIHNldCBwbnVtIDAKICAgIGZvcmVhY2ggcCAkcGFyZW50cygkaWQpIHsKCXNldCBzdGFydGxpbmUgW2V4cHIgeyRncm91cGxpbmVzdGFydCArICRkaWZmb2Zmc2V0KCRwKX1dCglzZXQgb2wgJHN0YXJ0bGluZQoJc2V0IG5sICRncm91cGxpbmVzdGFydAoJaWYge1tpbmZvIGV4aXN0cyBncm91cGh1bmtzKCRwKV19IHsKCSAgICBmb3JlYWNoIGggJGdyb3VwaHVua3MoJHApIHsKCQlzZXQgbCBbbGluZGV4ICRoIDJdCgkJaWYgeyRubCA8ICRsfSB7CgkJICAgIGZvciB7fSB7JG5sIDwgJGx9IHtpbmNyIG5sfSB7CgkJCXNldCBmaWxlbGluZXMoJHAsJGYsJG9sKSAkZmlsZWxpbmVzKCRpZCwkZiwkbmwpCgkJCWluY3Igb2wKCQkgICAgfQoJCX0KCQlmb3JlYWNoIGNodW5rIFtsaW5kZXggJGggNV0gewoJCSAgICBpZiB7W2xsZW5ndGggJGNodW5rXSA9PSAyfSB7CgkJCXNldCBvbGMgW2xpbmRleCAkY2h1bmsgMF0KCQkJc2V0IG5sYyBbbGluZGV4ICRjaHVuayAxXQoJCQlzZXQgbm5sIFtleHByIHskbmwgKyAkbmxjfV0KCQkJbGFwcGVuZCBldmVudHMgW2xpc3QgJG5sICRubmwgJHBudW0gJG9sYyAkbmxjXQoJCQlpbmNyIG9sICRvbGMKCQkJc2V0IG5sICRubmwKCQkgICAgfSBlbHNlIHsKCQkJaW5jciBvbCBbbGluZGV4ICRjaHVuayAwXQoJCQlpbmNyIG5sIFtsaW5kZXggJGNodW5rIDBdCgkJICAgIH0KCQl9CgkgICAgfQoJfQoJaWYgeyRubCA8ICRncm91cGxpbmVlbmR9IHsKCSAgICBmb3Ige30geyRubCA8ICRncm91cGxpbmVlbmR9IHtpbmNyIG5sfSB7CgkJc2V0IGZpbGVsaW5lcygkcCwkZiwkb2wpICRmaWxlbGluZXMoJGlkLCRmLCRubCkKCQlpbmNyIG9sCgkgICAgfQoJfQoJc2V0IG5saW5lcyBbZXhwciB7JG9sIC0gJHN0YXJ0bGluZX1dCgkkY3RleHQgaW5zZXJ0IGVuZCAiIC0kc3RhcnRsaW5lLCRubGluZXMiIG1zZXAKCWluY3IgcG51bQogICAgfQoKICAgIHNldCBubGluZXMgW2V4cHIgeyRncm91cGxpbmVlbmQgLSAkZ3JvdXBsaW5lc3RhcnR9XQogICAgJGN0ZXh0IGluc2VydCBlbmQgIiArJGdyb3VwbGluZXN0YXJ0LCRubGluZXMgQEBcbiIgbXNlcAoKICAgIHNldCBldmVudHMgW2xzb3J0IC1pbnRlZ2VyIC1pbmRleCAwICRldmVudHNdCiAgICBzZXQgbmV2ZW50cyBbbGxlbmd0aCAkZXZlbnRzXQogICAgc2V0IG5tZXJnZSAkbnBhcmVudHMoJGRpZmZtZXJnZWlkKQogICAgc2V0IGwgJGdyb3VwbGluZXN0YXJ0CiAgICBmb3Ige3NldCBpIDB9IHskaSA8ICRuZXZlbnRzfSB7c2V0IGkgJGp9IHsKCXNldCBubCBbbGluZGV4ICRldmVudHMgJGkgMF0KCXdoaWxlIHskbCA8ICRubH0gewoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIgJGZpbGVsaW5lcygkaWQsJGYsJGwpXG4iCgkgICAgaW5jciBsCgl9CglzZXQgZSBbbGluZGV4ICRldmVudHMgJGldCglzZXQgZW5sIFtsaW5kZXggJGUgMV0KCXNldCBqICRpCglzZXQgYWN0aXZlIHt9Cgl3aGlsZSAxIHsKCSAgICBzZXQgcG51bSBbbGluZGV4ICRlIDJdCgkgICAgc2V0IG9sYyBbbGluZGV4ICRlIDNdCgkgICAgc2V0IG5sYyBbbGluZGV4ICRlIDRdCgkgICAgaWYgeyFbaW5mbyBleGlzdHMgZGVsdGEoJHBudW0pXX0gewoJCXNldCBkZWx0YSgkcG51bSkgW2V4cHIgeyRvbGMgLSAkbmxjfV0KCQlsYXBwZW5kIGFjdGl2ZSAkcG51bQoJICAgIH0gZWxzZSB7CgkJaW5jciBkZWx0YSgkcG51bSkgW2V4cHIgeyRvbGMgLSAkbmxjfV0KCSAgICB9CgkgICAgaWYge1tpbmNyIGpdID49ICRuZXZlbnRzfSBicmVhawoJICAgIHNldCBlIFtsaW5kZXggJGV2ZW50cyAkal0KCSAgICBpZiB7W2xpbmRleCAkZSAwXSA+PSAkZW5sfSBicmVhawoJICAgIGlmIHtbbGluZGV4ICRlIDFdID4gJGVubH0gewoJCXNldCBlbmwgW2xpbmRleCAkZSAxXQoJICAgIH0KCX0KCXNldCBubGMgW2V4cHIgeyRlbmwgLSAkbH1dCglzZXQgbmNvbCBtcmVzdWx0CglzZXQgYmVzdHBuIC0xCglpZiB7W2xsZW5ndGggJGFjdGl2ZV0gPT0gJG5tZXJnZSAtIDF9IHsKCSAgICAjIG5vIGRpZmYgZm9yIG9uZSBvZiB0aGUgcGFyZW50cywgaS5lLiBpdCdzIGlkZW50aWNhbAoJICAgIGZvciB7c2V0IHBudW0gMH0geyRwbnVtIDwgJG5tZXJnZX0ge2luY3IgcG51bX0gewoJCWlmIHshW2luZm8gZXhpc3RzIGRlbHRhKCRwbnVtKV19IHsKCQkgICAgaWYgeyRwbnVtIDwgJG1lcmdlbWF4fSB7CgkJCWxhcHBlbmQgbmNvbCBtJHBudW0KCQkgICAgfSBlbHNlIHsKCQkJbGFwcGVuZCBuY29sIG1tYXgKCQkgICAgfQoJCSAgICBicmVhawoJCX0KCSAgICB9Cgl9IGVsc2VpZiB7W2xsZW5ndGggJGFjdGl2ZV0gPT0gJG5tZXJnZX0gewoJICAgICMgYWxsIHBhcmVudHMgYXJlIGRpZmZlcmVudCwgc2VlIGlmIG9uZSBpcyB2ZXJ5IHNpbWlsYXIKCSAgICBzZXQgYmVzdHNpbSAzMAoJICAgIGZvciB7c2V0IHBudW0gMH0geyRwbnVtIDwgJG5tZXJnZX0ge2luY3IgcG51bX0gewoJCXNldCBzaW0gW3NpbWlsYXJpdHkgJHBudW0gJGwgJG5sYyAkZiBcCgkJCSAgICAgW2xyYW5nZSAkZXZlbnRzICRpIFtleHByIHskai0xfV1dXQoJCWlmIHskc2ltID4gJGJlc3RzaW19IHsKCQkgICAgc2V0IGJlc3RzaW0gJHNpbQoJCSAgICBzZXQgYmVzdHBuICRwbnVtCgkJfQoJICAgIH0KCSAgICBpZiB7JGJlc3RwbiA+PSAwfSB7CgkJbGFwcGVuZCBuY29sIG0kYmVzdHBuCgkgICAgfQoJfQoJc2V0IHBudW0gLTEKCWZvcmVhY2ggcCAkcGFyZW50cygkaWQpIHsKCSAgICBpbmNyIHBudW0KCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBkZWx0YSgkcG51bSldIHx8ICRwbnVtID09ICRiZXN0cG59IGNvbnRpbnVlCgkgICAgc2V0IG9sYyBbZXhwciB7JG5sYyArICRkZWx0YSgkcG51bSl9XQoJICAgIHNldCBvbCBbZXhwciB7JGwgKyAkZGlmZm9mZnNldCgkcCl9XQoJICAgIGluY3IgZGlmZm9mZnNldCgkcCkgJGRlbHRhKCRwbnVtKQoJICAgIHVuc2V0IGRlbHRhKCRwbnVtKQoJICAgIGZvciB7fSB7JG9sYyA+IDB9IHtpbmNyIG9sYyAtMX0gewoJCSRjdGV4dCBpbnNlcnQgZW5kICItJGZpbGVsaW5lcygkcCwkZiwkb2wpXG4iIG0kcG51bQoJCWluY3Igb2wKCSAgICB9Cgl9CglzZXQgZW5kbCBbZXhwciB7JGwgKyAkbmxjfV0KCWlmIHskYmVzdHBuID49IDB9IHsKCSAgICAjIHNob3cgdGhpcyBwcmV0dHkgbXVjaCBhcyBhIG5vcm1hbCBkaWZmCgkgICAgc2V0IHAgW2xpbmRleCAkcGFyZW50cygkaWQpICRiZXN0cG5dCgkgICAgc2V0IG9sIFtleHByIHskbCArICRkaWZmb2Zmc2V0KCRwKX1dCgkgICAgaW5jciBkaWZmb2Zmc2V0KCRwKSAkZGVsdGEoJGJlc3RwbikKCSAgICB1bnNldCBkZWx0YSgkYmVzdHBuKQoJICAgIGZvciB7c2V0IGsgJGl9IHskayA8ICRqfSB7aW5jciBrfSB7CgkJc2V0IGUgW2xpbmRleCAkZXZlbnRzICRrXQoJCWlmIHtbbGluZGV4ICRlIDJdICE9ICRiZXN0cG59IGNvbnRpbnVlCgkJc2V0IG5sIFtsaW5kZXggJGUgMF0KCQlzZXQgb2wgW2V4cHIgeyRvbCArICRubCAtICRsfV0KCQlmb3Ige30geyRsIDwgJG5sfSB7aW5jciBsfSB7CgkJICAgICRjdGV4dCBpbnNlcnQgZW5kICIrJGZpbGVsaW5lcygkaWQsJGYsJGwpXG4iICRuY29sCgkJfQoJCXNldCBjIFtsaW5kZXggJGUgM10KCQlmb3Ige30geyRjID4gMH0ge2luY3IgYyAtMX0gewoJCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiLSRmaWxlbGluZXMoJHAsJGYsJG9sKVxuIiBtJGJlc3RwbgoJCSAgICBpbmNyIG9sCgkJfQoJCXNldCBubCBbbGluZGV4ICRlIDFdCgkJZm9yIHt9IHskbCA8ICRubH0ge2luY3IgbH0gewoJCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiKyRmaWxlbGluZXMoJGlkLCRmLCRsKVxuIiBtcmVzdWx0CgkJfQoJICAgIH0KCX0KCWZvciB7fSB7JGwgPCAkZW5kbH0ge2luY3IgbH0gewoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIrJGZpbGVsaW5lcygkaWQsJGYsJGwpXG4iICRuY29sCgl9CiAgICB9CiAgICB3aGlsZSB7JGwgPCAkZ3JvdXBsaW5lZW5kfSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiICRmaWxlbGluZXMoJGlkLCRmLCRsKVxuIgoJaW5jciBsCiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKfQoKcHJvYyBzaW1pbGFyaXR5IHtwbnVtIGwgbmxjIGYgZXZlbnRzfSB7CiAgICBnbG9iYWwgZGlmZm1lcmdlaWQgcGFyZW50cyBkaWZmb2Zmc2V0IGZpbGVsaW5lcwoKICAgIHNldCBpZCAkZGlmZm1lcmdlaWQKICAgIHNldCBwIFtsaW5kZXggJHBhcmVudHMoJGlkKSAkcG51bV0KICAgIHNldCBvbCBbZXhwciB7JGwgKyAkZGlmZm9mZnNldCgkcCl9XQogICAgc2V0IGVuZGwgW2V4cHIgeyRsICsgJG5sY31dCiAgICBzZXQgc2FtZSAwCiAgICBzZXQgZGlmZiAwCiAgICBmb3JlYWNoIGUgJGV2ZW50cyB7CglpZiB7W2xpbmRleCAkZSAyXSAhPSAkcG51bX0gY29udGludWUKCXNldCBubCBbbGluZGV4ICRlIDBdCglzZXQgb2wgW2V4cHIgeyRvbCArICRubCAtICRsfV0KCWZvciB7fSB7JGwgPCAkbmx9IHtpbmNyIGx9IHsKCSAgICBpbmNyIHNhbWUgW3N0cmluZyBsZW5ndGggJGZpbGVsaW5lcygkaWQsJGYsJGwpXQoJICAgIGluY3Igc2FtZQoJfQoJc2V0IG9jIFtsaW5kZXggJGUgM10KCWZvciB7fSB7JG9jID4gMH0ge2luY3Igb2MgLTF9IHsKCSAgICBpbmNyIGRpZmYgW3N0cmluZyBsZW5ndGggJGZpbGVsaW5lcygkcCwkZiwkb2wpXQoJICAgIGluY3IgZGlmZgoJICAgIGluY3Igb2wKCX0KCXNldCBubCBbbGluZGV4ICRlIDFdCglmb3Ige30geyRsIDwgJG5sfSB7aW5jciBsfSB7CgkgICAgaW5jciBkaWZmIFtzdHJpbmcgbGVuZ3RoICRmaWxlbGluZXMoJGlkLCRmLCRsKV0KCSAgICBpbmNyIGRpZmYKCX0KICAgIH0KICAgIGZvciB7fSB7JGwgPCAkZW5kbH0ge2luY3IgbH0gewoJaW5jciBzYW1lIFtzdHJpbmcgbGVuZ3RoICRmaWxlbGluZXMoJGlkLCRmLCRsKV0KCWluY3Igc2FtZQogICAgfQogICAgaWYgeyRzYW1lID09IDB9IHsKCXJldHVybiAwCiAgICB9CiAgICByZXR1cm4gW2V4cHIgezIwMCAqICRzYW1lIC8gKDIgKiAkc2FtZSArICRkaWZmKX1dCn0KCnByb2Mgc3RhcnRkaWZmIHtpZHN9IHsKICAgIGdsb2JhbCB0cmVlZGlmZnMgZGlmZmlkcyB0cmVlcGVuZGluZyBkaWZmbWVyZ2VpZAoKICAgIHNldCBkaWZmaWRzICRpZHMKICAgIGNhdGNoIHt1bnNldCBkaWZmbWVyZ2VpZH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHRyZWVkaWZmcygkaWRzKV19IHsKCWlmIHshW2luZm8gZXhpc3RzIHRyZWVwZW5kaW5nXX0gewoJICAgIGdldHRyZWVkaWZmcyAkaWRzCgl9CiAgICB9IGVsc2UgewoJYWRkdG9jZmxpc3QgJGlkcwogICAgfQp9Cgpwcm9jIGFkZHRvY2ZsaXN0IHtpZHN9IHsKICAgIGdsb2JhbCB0cmVlZGlmZnMgY2ZsaXN0CiAgICBmb3JlYWNoIGYgJHRyZWVkaWZmcygkaWRzKSB7CgkkY2ZsaXN0IGluc2VydCBlbmQgJGYKICAgIH0KICAgIGdldGJsb2JkaWZmcyAkaWRzCn0KCnByb2MgZ2V0dHJlZWRpZmZzIHtpZHN9IHsKICAgIGdsb2JhbCB0cmVlZGlmZiBwYXJlbnRzIHRyZWVwZW5kaW5nCiAgICBzZXQgdHJlZXBlbmRpbmcgJGlkcwogICAgc2V0IHRyZWVkaWZmIHt9CiAgICBzZXQgaWQgW2xpbmRleCAkaWRzIDBdCiAgICBzZXQgcCBbbGluZGV4ICRpZHMgMV0KICAgIGlmIFtjYXRjaCB7c2V0IGdkdGYgW29wZW4gInxnaXQtZGlmZi10cmVlIC1yICRwICRpZCIgcl19XSByZXR1cm4KICAgIGZjb25maWd1cmUgJGdkdGYgLWJsb2NraW5nIDAKICAgIGZpbGVldmVudCAkZ2R0ZiByZWFkYWJsZSBbbGlzdCBnZXR0cmVlZGlmZmxpbmUgJGdkdGYgJGlkc10KfQoKcHJvYyBnZXR0cmVlZGlmZmxpbmUge2dkdGYgaWRzfSB7CiAgICBnbG9iYWwgdHJlZWRpZmYgdHJlZWRpZmZzIHRyZWVwZW5kaW5nIGRpZmZpZHMgZGlmZm1lcmdlaWQKCiAgICBzZXQgbiBbZ2V0cyAkZ2R0ZiBsaW5lXQogICAgaWYgeyRuIDwgMH0gewoJaWYgeyFbZW9mICRnZHRmXX0gcmV0dXJuCgljbG9zZSAkZ2R0ZgoJc2V0IHRyZWVkaWZmcygkaWRzKSAkdHJlZWRpZmYKCXVuc2V0IHRyZWVwZW5kaW5nCglpZiB7JGlkcyAhPSAkZGlmZmlkc30gewoJICAgIGdldHRyZWVkaWZmcyAkZGlmZmlkcwoJfSBlbHNlIHsKCSAgICBpZiB7W2luZm8gZXhpc3RzIGRpZmZtZXJnZWlkXX0gewoJCWNvbnRtZXJnZWRpZmYgJGlkcwoJICAgIH0gZWxzZSB7CgkJYWRkdG9jZmxpc3QgJGlkcwoJICAgIH0KCX0KCXJldHVybgogICAgfQogICAgc2V0IGZpbGUgW2xpbmRleCAkbGluZSA1XQogICAgbGFwcGVuZCB0cmVlZGlmZiAkZmlsZQp9Cgpwcm9jIGdldGJsb2JkaWZmcyB7aWRzfSB7CiAgICBnbG9iYWwgZGlmZm9wdHMgYmxvYmRpZmZmZCBkaWZmaWRzIGVudiBjdXJkaWZmdGFnIGN1cnRhZ3N0YXJ0CiAgICBnbG9iYWwgZGlmZmZpbGVzdGFydCBuZXh0dXBkYXRlIGRpZmZpbmhkciB0cmVlZGlmZnMKCiAgICBzZXQgaWQgW2xpbmRleCAkaWRzIDBdCiAgICBzZXQgcCBbbGluZGV4ICRpZHMgMV0KICAgIHNldCBlbnYoR0lUX0RJRkZfT1BUUykgJGRpZmZvcHRzCiAgICBzZXQgY21kIFtsaXN0IHwgZ2l0LWRpZmYtdHJlZSAtciAtcCAtQyAkcCAkaWRdCiAgICBpZiB7W2NhdGNoIHtzZXQgYmRmIFtvcGVuICRjbWQgcl19IGVycl19IHsKCXB1dHMgImVycm9yIGdldHRpbmcgZGlmZnM6ICRlcnIiCglyZXR1cm4KICAgIH0KICAgIHNldCBkaWZmaW5oZHIgMAogICAgZmNvbmZpZ3VyZSAkYmRmIC1ibG9ja2luZyAwCiAgICBzZXQgYmxvYmRpZmZmZCgkaWRzKSAkYmRmCiAgICBzZXQgY3VyZGlmZnRhZyBDb21tZW50cwogICAgc2V0IGN1cnRhZ3N0YXJ0IDAuMAogICAgY2F0Y2gge3Vuc2V0IGRpZmZmaWxlc3RhcnR9CiAgICBmaWxlZXZlbnQgJGJkZiByZWFkYWJsZSBbbGlzdCBnZXRibG9iZGlmZmxpbmUgJGJkZiAkZGlmZmlkc10KICAgIHNldCBuZXh0dXBkYXRlIFtleHByIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdICsgMTAwfV0KfQoKcHJvYyBnZXRibG9iZGlmZmxpbmUge2JkZiBpZHN9IHsKICAgIGdsb2JhbCBkaWZmaWRzIGJsb2JkaWZmZmQgY3RleHQgY3VyZGlmZnRhZyBjdXJ0YWdzdGFydAogICAgZ2xvYmFsIGRpZmZuZXh0aGVhZCBkaWZmbmV4dG5vdGUgZGlmZmZpbGVzdGFydAogICAgZ2xvYmFsIG5leHR1cGRhdGUgZGlmZmluaGRyIHRyZWVkaWZmcwogICAgZ2xvYmFsIGdhdWR5ZGlmZgoKICAgIHNldCBuIFtnZXRzICRiZGYgbGluZV0KICAgIGlmIHskbiA8IDB9IHsKCWlmIHtbZW9mICRiZGZdfSB7CgkgICAgY2xvc2UgJGJkZgoJICAgIGlmIHskaWRzID09ICRkaWZmaWRzICYmICRiZGYgPT0gJGJsb2JkaWZmZmQoJGlkcyl9IHsKCQkkY3RleHQgdGFnIGFkZCAkY3VyZGlmZnRhZyAkY3VydGFnc3RhcnQgZW5kCgkgICAgfQoJfQoJcmV0dXJuCiAgICB9CiAgICBpZiB7JGlkcyAhPSAkZGlmZmlkcyB8fCAkYmRmICE9ICRibG9iZGlmZmZkKCRpZHMpfSB7CglyZXR1cm4KICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIGlmIHtbcmVnZXhwIHteZGlmZiAtLWdpdCBhLyguKikgYi8oLiopfSAkbGluZSBtYXRjaCBmbmFtZSBuZXduYW1lXX0gewoJIyBzdGFydCBvZiBhIG5ldyBmaWxlCgkkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCgkkY3RleHQgdGFnIGFkZCAkY3VyZGlmZnRhZyAkY3VydGFnc3RhcnQgZW5kCglzZXQgY3VydGFnc3RhcnQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJc2V0IGhlYWRlciAkbmV3bmFtZQoJc2V0IGhlcmUgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICR0cmVlZGlmZnMoJGRpZmZpZHMpICRmbmFtZV0KCWlmIHskaSA+PSAwfSB7CgkgICAgc2V0IGRpZmZmaWxlc3RhcnQoJGkpICRoZXJlCgkgICAgaW5jciBpCgkgICAgJGN0ZXh0IG1hcmsgc2V0IGZtYXJrLiRpICRoZXJlCgkgICAgJGN0ZXh0IG1hcmsgZ3Jhdml0eSBmbWFyay4kaSBsZWZ0Cgl9CglpZiB7JG5ld25hbWUgIT0gJGZuYW1lfSB7CgkgICAgc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICR0cmVlZGlmZnMoJGRpZmZpZHMpICRuZXduYW1lXQoJICAgIGlmIHskaSA+PSAwfSB7CgkJc2V0IGRpZmZmaWxlc3RhcnQoJGkpICRoZXJlCgkJaW5jciBpCgkJJGN0ZXh0IG1hcmsgc2V0IGZtYXJrLiRpICRoZXJlCgkJJGN0ZXh0IG1hcmsgZ3Jhdml0eSBmbWFyay4kaSBsZWZ0CgkgICAgfQoJfQoJc2V0IGN1cmRpZmZ0YWcgImY6JGZuYW1lIgoJJGN0ZXh0IHRhZyBkZWxldGUgJGN1cmRpZmZ0YWcKCXNldCBsIFtleHByIHsoNzggLSBbc3RyaW5nIGxlbmd0aCAkaGVhZGVyXSkgLyAyfV0KCXNldCBwYWQgW3N0cmluZyByYW5nZSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgMSAkbF0KCSRjdGV4dCBpbnNlcnQgZW5kICIkcGFkICRoZWFkZXIgJHBhZFxuIiBmaWxlc2VwCglzZXQgZGlmZmluaGRyIDEKICAgIH0gZWxzZWlmIHtbcmVnZXhwIHteKC0tLXxcK1wrXCspfSAkbGluZV19IHsKCXNldCBkaWZmaW5oZHIgMAogICAgfSBlbHNlaWYge1tyZWdleHAge15AQCAtKFswLTldKyksKFswLTldKykgXCsoWzAtOV0rKSwoWzAtOV0rKSBAQCguKil9IFwKCQkgICAkbGluZSBtYXRjaCBmMWwgZjFjIGYybCBmMmMgcmVzdF19IHsKCWlmIHskZ2F1ZHlkaWZmfSB7CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlx0IiBodW5rc2VwCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiAgICAkZjFsICAgICIgZDAgIiAgICAkZjJsICAgICIgZDEKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiICAgICRyZXN0IFxuIiBodW5rc2VwCgl9IGVsc2UgewoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBodW5rc2VwCgl9CglzZXQgZGlmZmluaGRyIDAKICAgIH0gZWxzZSB7CglzZXQgeCBbc3RyaW5nIHJhbmdlICRsaW5lIDAgMF0KCWlmIHskeCA9PSAiLSIgfHwgJHggPT0gIisifSB7CgkgICAgc2V0IHRhZyBbZXhwciB7JHggPT0gIisifV0KCSAgICBpZiB7JGdhdWR5ZGlmZn0gewoJCXNldCBsaW5lIFtzdHJpbmcgcmFuZ2UgJGxpbmUgMSBlbmRdCgkgICAgfQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBkJHRhZwoJfSBlbHNlaWYgeyR4ID09ICIgIn0gewoJICAgIGlmIHskZ2F1ZHlkaWZmfSB7CgkJc2V0IGxpbmUgW3N0cmluZyByYW5nZSAkbGluZSAxIGVuZF0KCSAgICB9CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iCgl9IGVsc2VpZiB7JGRpZmZpbmhkciB8fCAkeCA9PSAiXFwifSB7CgkgICAgIyBlLmcuICJcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUiCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iIGZpbGVzZXAKCX0gZWxzZSB7CgkgICAgIyBTb21ldGhpbmcgZWxzZSB3ZSBkb24ndCByZWNvZ25pemUKCSAgICBpZiB7JGN1cmRpZmZ0YWcgIT0gIkNvbW1lbnRzIn0gewoJCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKCQkkY3RleHQgdGFnIGFkZCAkY3VyZGlmZnRhZyAkY3VydGFnc3RhcnQgZW5kCgkJc2V0IGN1cnRhZ3N0YXJ0IFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KCQlzZXQgY3VyZGlmZnRhZyBDb21tZW50cwoJICAgIH0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgZmlsZXNlcAoJfQogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICBpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSA+PSAkbmV4dHVwZGF0ZX0gewoJaW5jciBuZXh0dXBkYXRlIDEwMAoJZmlsZWV2ZW50ICRiZGYgcmVhZGFibGUge30KCXVwZGF0ZQoJZmlsZWV2ZW50ICRiZGYgcmVhZGFibGUgImdldGJsb2JkaWZmbGluZSAkYmRmIHskaWRzfSIKICAgIH0KfQoKcHJvYyBuZXh0ZmlsZSB7fSB7CiAgICBnbG9iYWwgZGlmZmZpbGVzdGFydCBjdGV4dAogICAgc2V0IGhlcmUgWyRjdGV4dCBpbmRleCBAMCwwXQogICAgZm9yIHtzZXQgaSAwfSB7W2luZm8gZXhpc3RzIGRpZmZmaWxlc3RhcnQoJGkpXX0ge2luY3IgaX0gewoJaWYge1skY3RleHQgY29tcGFyZSAkZGlmZmZpbGVzdGFydCgkaSkgPiAkaGVyZV19IHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBwb3NdCgkJfHwgWyRjdGV4dCBjb21wYXJlICRkaWZmZmlsZXN0YXJ0KCRpKSA8ICRwb3NdfSB7CgkJc2V0IHBvcyAkZGlmZmZpbGVzdGFydCgkaSkKCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHBvc119IHsKCSRjdGV4dCB5dmlldyAkcG9zCiAgICB9Cn0KCnByb2MgbGlzdGJveHNlbCB7fSB7CiAgICBnbG9iYWwgY3RleHQgY2ZsaXN0IGN1cnJlbnRpZAogICAgaWYgeyFbaW5mbyBleGlzdHMgY3VycmVudGlkXX0gcmV0dXJuCiAgICBzZXQgc2VsIFtsc29ydCBbJGNmbGlzdCBjdXJzZWxlY3Rpb25dXQogICAgaWYgeyRzZWwgZXEge319IHJldHVybgogICAgc2V0IGZpcnN0IFtsaW5kZXggJHNlbCAwXQogICAgY2F0Y2ggeyRjdGV4dCB5dmlldyBmbWFyay4kZmlyc3R9Cn0KCnByb2Mgc2V0Y29vcmRzIHt9IHsKICAgIGdsb2JhbCBsaW5lc3BjIGNoYXJzcGMgY2FudngwIGNhbnZ5MCBtYWluZm9udAogICAgc2V0IGxpbmVzcGMgW2ZvbnQgbWV0cmljcyAkbWFpbmZvbnQgLWxpbmVzcGFjZV0KICAgIHNldCBjaGFyc3BjIFtmb250IG1lYXN1cmUgJG1haW5mb250ICJtIl0KICAgIHNldCBjYW52eTAgW2V4cHIgMyArIDAuNSAqICRsaW5lc3BjXQogICAgc2V0IGNhbnZ4MCBbZXhwciAzICsgMC41ICogJGxpbmVzcGNdCn0KCnByb2MgcmVkaXNwbGF5IHt9IHsKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUgc3RvcHBlZCByZWRpc3BsYXlpbmcgcGhhc2UKICAgIGlmIHskc3RvcHBlZCA+IDF9IHJldHVybgogICAgaWYgeyRwaGFzZSA9PSAiZ2V0Y29tbWl0cyJ9IHJldHVybgogICAgc2V0IHJlZGlzcGxheWluZyAxCiAgICBpZiB7JHBoYXNlID09ICJkcmF3Z3JhcGgiIHx8ICRwaGFzZSA9PSAiaW5jcmRyYXcifSB7CglzZXQgc3RvcHBlZCAxCiAgICB9IGVsc2UgewoJZHJhd2dyYXBoCiAgICB9Cn0KCnByb2MgaW5jcmZvbnQge2luY30gewogICAgZ2xvYmFsIG1haW5mb250IG5hbWVmb250IHRleHRmb250IHNlbGVjdGVkbGluZSBjdGV4dCBjYW52IHBoYXNlCiAgICBnbG9iYWwgc3RvcHBlZCBlbnRyaWVzCiAgICB1bm1hcmttYXRjaGVzCiAgICBzZXQgbWFpbmZvbnQgW2xyZXBsYWNlICRtYWluZm9udCAxIDEgW2V4cHIge1tsaW5kZXggJG1haW5mb250IDFdICsgJGluY31dXQogICAgc2V0IG5hbWVmb250IFtscmVwbGFjZSAkbmFtZWZvbnQgMSAxIFtleHByIHtbbGluZGV4ICRuYW1lZm9udCAxXSArICRpbmN9XV0KICAgIHNldCB0ZXh0Zm9udCBbbHJlcGxhY2UgJHRleHRmb250IDEgMSBbZXhwciB7W2xpbmRleCAkdGV4dGZvbnQgMV0gKyAkaW5jfV1dCiAgICBzZXRjb29yZHMKICAgICRjdGV4dCBjb25mIC1mb250ICR0ZXh0Zm9udAogICAgJGN0ZXh0IHRhZyBjb25mIGZpbGVzZXAgLWZvbnQgW2NvbmNhdCAkdGV4dGZvbnQgYm9sZF0KICAgIGZvcmVhY2ggZSAkZW50cmllcyB7CgkkZSBjb25mIC1mb250ICRtYWluZm9udAogICAgfQogICAgaWYgeyRwaGFzZSA9PSAiZ2V0Y29tbWl0cyJ9IHsKCSRjYW52IGl0ZW1jb25mIHRleHRpdGVtcyAtZm9udCAkbWFpbmZvbnQKICAgIH0KICAgIHJlZGlzcGxheQp9Cgpwcm9jIGNsZWFyc2hhMSB7fSB7CiAgICBnbG9iYWwgc2hhMWVudHJ5IHNoYTFzdHJpbmcKICAgIGlmIHtbc3RyaW5nIGxlbmd0aCAkc2hhMXN0cmluZ10gPT0gNDB9IHsKCSRzaGExZW50cnkgZGVsZXRlIDAgZW5kCiAgICB9Cn0KCnByb2Mgc2hhMWNoYW5nZSB7bjEgbjIgb3B9IHsKICAgIGdsb2JhbCBzaGExc3RyaW5nIGN1cnJlbnRpZCBzaGExYnV0CiAgICBpZiB7JHNoYTFzdHJpbmcgPT0ge30KCXx8IChbaW5mbyBleGlzdHMgY3VycmVudGlkXSAmJiAkc2hhMXN0cmluZyA9PSAkY3VycmVudGlkKX0gewoJc2V0IHN0YXRlIGRpc2FibGVkCiAgICB9IGVsc2UgewoJc2V0IHN0YXRlIG5vcm1hbAogICAgfQogICAgaWYge1skc2hhMWJ1dCBjZ2V0IC1zdGF0ZV0gPT0gJHN0YXRlfSByZXR1cm4KICAgIGlmIHskc3RhdGUgPT0gIm5vcm1hbCJ9IHsKCSRzaGExYnV0IGNvbmYgLXN0YXRlIG5vcm1hbCAtcmVsaWVmIHJhaXNlZCAtdGV4dCAiR290bzogIgogICAgfSBlbHNlIHsKCSRzaGExYnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkIC1yZWxpZWYgZmxhdCAtdGV4dCAiU0hBMSBJRDogIgogICAgfQp9Cgpwcm9jIGdvdG9jb21taXQge30gewogICAgZ2xvYmFsIHNoYTFzdHJpbmcgY3VycmVudGlkIGlkbGluZSB0YWdpZHMKICAgIGdsb2JhbCBsaW5laWQgbnVtY29tbWl0cwoKICAgIGlmIHskc2hhMXN0cmluZyA9PSB7fQoJfHwgKFtpbmZvIGV4aXN0cyBjdXJyZW50aWRdICYmICRzaGExc3RyaW5nID09ICRjdXJyZW50aWQpfSByZXR1cm4KICAgIGlmIHtbaW5mbyBleGlzdHMgdGFnaWRzKCRzaGExc3RyaW5nKV19IHsKCXNldCBpZCAkdGFnaWRzKCRzaGExc3RyaW5nKQogICAgfSBlbHNlIHsKCXNldCBpZCBbc3RyaW5nIHRvbG93ZXIgJHNoYTFzdHJpbmddCglpZiB7W3JlZ2V4cCB7XlswLTlhLWZdezQsMzl9JH0gJGlkXX0gewoJICAgIHNldCBtYXRjaGVzIHt9CgkgICAgZm9yIHtzZXQgbCAwfSB7JGwgPCAkbnVtY29tbWl0c30ge2luY3IgbH0gewoJCWlmIHtbc3RyaW5nIG1hdGNoICRpZCogJGxpbmVpZCgkbCldfSB7CgkJICAgIGxhcHBlbmQgbWF0Y2hlcyAkbGluZWlkKCRsKQoJCX0KCSAgICB9CgkgICAgaWYgeyRtYXRjaGVzIG5lIHt9fSB7CgkJaWYge1tsbGVuZ3RoICRtYXRjaGVzXSA+IDF9IHsKCQkgICAgZXJyb3JfcG9wdXAgIlNob3J0IFNIQTEgaWQgJGlkIGlzIGFtYmlndW91cyIKCQkgICAgcmV0dXJuCgkJfQoJCXNldCBpZCBbbGluZGV4ICRtYXRjaGVzIDBdCgkgICAgfQoJfQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGxpbmUoJGlkKV19IHsKCXNlbGVjdGxpbmUgJGlkbGluZSgkaWQpCglyZXR1cm4KICAgIH0KICAgIGlmIHtbcmVnZXhwIHteWzAtOWEtZkEtRl17NCx9JH0gJHNoYTFzdHJpbmddfSB7CglzZXQgdHlwZSAiU0hBMSBpZCIKICAgIH0gZWxzZSB7CglzZXQgdHlwZSAiVGFnIgogICAgfQogICAgZXJyb3JfcG9wdXAgIiR0eXBlICRzaGExc3RyaW5nIGlzIG5vdCBrbm93biIKfQoKcHJvYyBsaW5lZW50ZXIge3ggeSBpZH0gewogICAgZ2xvYmFsIGhvdmVyeCBob3ZlcnkgaG92ZXJpZCBob3ZlcnRpbWVyCiAgICBnbG9iYWwgY29tbWl0aW5mbyBjYW52CgogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXX0gcmV0dXJuCiAgICBzZXQgaG92ZXJ4ICR4CiAgICBzZXQgaG92ZXJ5ICR5CiAgICBzZXQgaG92ZXJpZCAkaWQKICAgIGlmIHtbaW5mbyBleGlzdHMgaG92ZXJ0aW1lcl19IHsKCWFmdGVyIGNhbmNlbCAkaG92ZXJ0aW1lcgogICAgfQogICAgc2V0IGhvdmVydGltZXIgW2FmdGVyIDUwMCBsaW5laG92ZXJdCiAgICAkY2FudiBkZWxldGUgaG92ZXIKfQoKcHJvYyBsaW5lbW90aW9uIHt4IHkgaWR9IHsKICAgIGdsb2JhbCBob3ZlcnggaG92ZXJ5IGhvdmVyaWQgaG92ZXJ0aW1lcgoKICAgIGlmIHtbaW5mbyBleGlzdHMgaG92ZXJpZF0gJiYgJGlkID09ICRob3ZlcmlkfSB7CglzZXQgaG92ZXJ4ICR4CglzZXQgaG92ZXJ5ICR5CglpZiB7W2luZm8gZXhpc3RzIGhvdmVydGltZXJdfSB7CgkgICAgYWZ0ZXIgY2FuY2VsICRob3ZlcnRpbWVyCgl9CglzZXQgaG92ZXJ0aW1lciBbYWZ0ZXIgNTAwIGxpbmVob3Zlcl0KICAgIH0KfQoKcHJvYyBsaW5lbGVhdmUge2lkfSB7CiAgICBnbG9iYWwgaG92ZXJpZCBob3ZlcnRpbWVyIGNhbnYKCiAgICBpZiB7W2luZm8gZXhpc3RzIGhvdmVyaWRdICYmICRpZCA9PSAkaG92ZXJpZH0gewoJJGNhbnYgZGVsZXRlIGhvdmVyCglpZiB7W2luZm8gZXhpc3RzIGhvdmVydGltZXJdfSB7CgkgICAgYWZ0ZXIgY2FuY2VsICRob3ZlcnRpbWVyCgkgICAgdW5zZXQgaG92ZXJ0aW1lcgoJfQoJdW5zZXQgaG92ZXJpZAogICAgfQp9Cgpwcm9jIGxpbmVob3ZlciB7fSB7CiAgICBnbG9iYWwgaG92ZXJ4IGhvdmVyeSBob3ZlcmlkIGhvdmVydGltZXIKICAgIGdsb2JhbCBjYW52IGxpbmVzcGMgbHRoaWNrbmVzcwogICAgZ2xvYmFsIGNvbW1pdGluZm8gbWFpbmZvbnQKCiAgICBzZXQgdGV4dCBbbGluZGV4ICRjb21taXRpbmZvKCRob3ZlcmlkKSAwXQogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgaWYgeyR5bWF4ID09IHt9fSByZXR1cm4KICAgIHNldCB5ZnJhYyBbbGluZGV4IFskY2FudiB5dmlld10gMF0KICAgIHNldCB4IFtleHByIHskaG92ZXJ4ICsgMiAqICRsaW5lc3BjfV0KICAgIHNldCB5IFtleHByIHskaG92ZXJ5ICsgJHlmcmFjICogJHltYXggLSAkbGluZXNwYyAvIDJ9XQogICAgc2V0IHgwIFtleHByIHskeCAtIDIgKiAkbHRoaWNrbmVzc31dCiAgICBzZXQgeTAgW2V4cHIgeyR5IC0gMiAqICRsdGhpY2tuZXNzfV0KICAgIHNldCB4MSBbZXhwciB7JHggKyBbZm9udCBtZWFzdXJlICRtYWluZm9udCAkdGV4dF0gKyAyICogJGx0aGlja25lc3N9XQogICAgc2V0IHkxIFtleHByIHskeSArICRsaW5lc3BjICsgMiAqICRsdGhpY2tuZXNzfV0KICAgIHNldCB0IFskY2FudiBjcmVhdGUgcmVjdGFuZ2xlICR4MCAkeTAgJHgxICR5MSBcCgkgICAgICAgLWZpbGwgXCNmZmZmODAgLW91dGxpbmUgYmxhY2sgLXdpZHRoIDEgLXRhZ3MgaG92ZXJdCiAgICAkY2FudiByYWlzZSAkdAogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSB0ZXh0ICR4ICR5IC1hbmNob3IgbncgLXRleHQgJHRleHQgLXRhZ3MgaG92ZXJdCiAgICAkY2FudiByYWlzZSAkdAp9Cgpwcm9jIGxpbmVjbGljayB7eCB5IGlkfSB7CiAgICBnbG9iYWwgY3RleHQgY29tbWl0aW5mbyBjaGlsZHJlbiBjZmxpc3QgY2FudgoKICAgIHVubWFya21hdGNoZXMKICAgICRjYW52IGRlbGV0ZSBob3ZlcgogICAgIyBmaWxsIHRoZSBkZXRhaWxzIHBhbmUgd2l0aCBpbmZvIGFib3V0IHRoaXMgbGluZQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJGN0ZXh0IGRlbGV0ZSAwLjAgZW5kCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiUGFyZW50OlxuICIKICAgIGNhdGNoIHtkZXN0cm95ICRjdGV4dC4kaWR9CiAgICBidXR0b24gJGN0ZXh0LiRpZCAtdGV4dCAiR286IiAtY29tbWFuZCAic2VsYnlpZCAkaWQiIFwKCS1wYWR4IDQgLXBhZHkgMAogICAgJGN0ZXh0IHdpbmRvdyBjcmVhdGUgZW5kIC13aW5kb3cgJGN0ZXh0LiRpZCAtYWxpZ24gY2VudGVyCiAgICBzZXQgaW5mbyAkY29tbWl0aW5mbygkaWQpCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXHRbbGluZGV4ICRpbmZvIDBdXG4iCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXHRBdXRob3I6XHRbbGluZGV4ICRpbmZvIDFdXG4iCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXHREYXRlOlx0W2xpbmRleCAkaW5mbyAyXVxuIgogICAgJGN0ZXh0IGluc2VydCBlbmQgIlx0SUQ6XHQkaWRcbiIKICAgIGlmIHtbaW5mbyBleGlzdHMgY2hpbGRyZW4oJGlkKV19IHsKCSRjdGV4dCBpbnNlcnQgZW5kICJcbkNoaWxkcmVuOiIKCWZvcmVhY2ggY2hpbGQgJGNoaWxkcmVuKCRpZCkgewoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiAiCgkgICAgY2F0Y2gge2Rlc3Ryb3kgJGN0ZXh0LiRjaGlsZH0KCSAgICBidXR0b24gJGN0ZXh0LiRjaGlsZCAtdGV4dCAiR286IiAtY29tbWFuZCAic2VsYnlpZCAkY2hpbGQiIFwKCQktcGFkeCA0IC1wYWR5IDAKCSAgICAkY3RleHQgd2luZG93IGNyZWF0ZSBlbmQgLXdpbmRvdyAkY3RleHQuJGNoaWxkIC1hbGlnbiBjZW50ZXIKCSAgICBzZXQgaW5mbyAkY29tbWl0aW5mbygkY2hpbGQpCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlx0W2xpbmRleCAkaW5mbyAwXSIKCX0KICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAoKICAgICRjZmxpc3QgZGVsZXRlIDAgZW5kCn0KCnByb2Mgc2VsYnlpZCB7aWR9IHsKICAgIGdsb2JhbCBpZGxpbmUKICAgIGlmIHtbaW5mbyBleGlzdHMgaWRsaW5lKCRpZCldfSB7CglzZWxlY3RsaW5lICRpZGxpbmUoJGlkKQogICAgfQp9Cgpwcm9jIG1zdGltZSB7fSB7CiAgICBnbG9iYWwgc3RhcnRtc3RpbWUKICAgIGlmIHshW2luZm8gZXhpc3RzIHN0YXJ0bXN0aW1lXX0gewoJc2V0IHN0YXJ0bXN0aW1lIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KICAgIH0KICAgIHJldHVybiBbZm9ybWF0ICIlLjNmIiBbZXhwciB7KFtjbG9jayBjbGljayAtbWlsbGlzZWNvbmRzXSAtICRzdGFydG1zdGltZSkgLyAxMDAwLjB9XV0KfQoKcHJvYyByb3dtZW51IHt4IHkgaWR9IHsKICAgIGdsb2JhbCByb3djdHhtZW51IGlkbGluZSBzZWxlY3RlZGxpbmUgcm93bWVudWlkCgogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXSB8fCAkaWRsaW5lKCRpZCkgZXEgJHNlbGVjdGVkbGluZX0gewoJc2V0IHN0YXRlIGRpc2FibGVkCiAgICB9IGVsc2UgewoJc2V0IHN0YXRlIG5vcm1hbAogICAgfQogICAgJHJvd2N0eG1lbnUgZW50cnljb25maWd1cmUgMCAtc3RhdGUgJHN0YXRlCiAgICAkcm93Y3R4bWVudSBlbnRyeWNvbmZpZ3VyZSAxIC1zdGF0ZSAkc3RhdGUKICAgICRyb3djdHhtZW51IGVudHJ5Y29uZmlndXJlIDIgLXN0YXRlICRzdGF0ZQogICAgc2V0IHJvd21lbnVpZCAkaWQKICAgIHRrX3BvcHVwICRyb3djdHhtZW51ICR4ICR5Cn0KCnByb2MgZGlmZnZzc2VsIHtkaXJufSB7CiAgICBnbG9iYWwgcm93bWVudWlkIHNlbGVjdGVkbGluZSBsaW5laWQKICAgIGdsb2JhbCBjdGV4dCBjZmxpc3QKICAgIGdsb2JhbCBjb21taXRpbmZvCgogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBpZiB7JGRpcm59IHsKCXNldCBvbGRpZCAkbGluZWlkKCRzZWxlY3RlZGxpbmUpCglzZXQgbmV3aWQgJHJvd21lbnVpZAogICAgfSBlbHNlIHsKCXNldCBvbGRpZCAkcm93bWVudWlkCglzZXQgbmV3aWQgJGxpbmVpZCgkc2VsZWN0ZWRsaW5lKQogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJGN0ZXh0IGRlbGV0ZSAwLjAgZW5kCiAgICAkY3RleHQgbWFyayBzZXQgZm1hcmsuMCAwLjAKICAgICRjdGV4dCBtYXJrIGdyYXZpdHkgZm1hcmsuMCBsZWZ0CiAgICAkY2ZsaXN0IGRlbGV0ZSAwIGVuZAogICAgJGNmbGlzdCBpbnNlcnQgZW5kICJUb3AiCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiRnJvbSAkb2xkaWRcbiAgICAgIgogICAgJGN0ZXh0IGluc2VydCBlbmQgW2xpbmRleCAkY29tbWl0aW5mbygkb2xkaWQpIDBdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cblRvICAgJG5ld2lkXG4gICAgICIKICAgICRjdGV4dCBpbnNlcnQgZW5kIFtsaW5kZXggJGNvbW1pdGluZm8oJG5ld2lkKSAwXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuIgogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICAkY3RleHQgdGFnIGRlbGV0ZSBDb21tZW50cwogICAgJGN0ZXh0IHRhZyByZW1vdmUgZm91bmQgMS4wIGVuZAogICAgc3RhcnRkaWZmIFtsaXN0ICRuZXdpZCAkb2xkaWRdCn0KCnByb2MgbWtwYXRjaCB7fSB7CiAgICBnbG9iYWwgcm93bWVudWlkIGN1cnJlbnRpZCBjb21taXRpbmZvIHBhdGNodG9wIHBhdGNobnVtCgogICAgaWYgeyFbaW5mbyBleGlzdHMgY3VycmVudGlkXX0gcmV0dXJuCiAgICBzZXQgb2xkaWQgJGN1cnJlbnRpZAogICAgc2V0IG9sZGhlYWQgW2xpbmRleCAkY29tbWl0aW5mbygkb2xkaWQpIDBdCiAgICBzZXQgbmV3aWQgJHJvd21lbnVpZAogICAgc2V0IG5ld2hlYWQgW2xpbmRleCAkY29tbWl0aW5mbygkbmV3aWQpIDBdCiAgICBzZXQgdG9wIC5wYXRjaAogICAgc2V0IHBhdGNodG9wICR0b3AKICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9CiAgICB0b3BsZXZlbCAkdG9wCiAgICBsYWJlbCAkdG9wLnRpdGxlIC10ZXh0ICJHZW5lcmF0ZSBwYXRjaCIKICAgIGdyaWQgJHRvcC50aXRsZSAtIC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmZyb20gLXRleHQgIkZyb206IgogICAgZW50cnkgJHRvcC5mcm9tc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CiAgICAkdG9wLmZyb21zaGExIGluc2VydCAwICRvbGRpZAogICAgJHRvcC5mcm9tc2hhMSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCAkdG9wLmZyb20gJHRvcC5mcm9tc2hhMSAtc3RpY2t5IHcKICAgIGVudHJ5ICR0b3AuZnJvbWhlYWQgLXdpZHRoIDYwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5mcm9taGVhZCBpbnNlcnQgMCAkb2xkaGVhZAogICAgJHRvcC5mcm9taGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCB4ICR0b3AuZnJvbWhlYWQgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLnRvIC10ZXh0ICJUbzoiCiAgICBlbnRyeSAkdG9wLnRvc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CiAgICAkdG9wLnRvc2hhMSBpbnNlcnQgMCAkbmV3aWQKICAgICR0b3AudG9zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AudG8gJHRvcC50b3NoYTEgLXN0aWNreSB3CiAgICBlbnRyeSAkdG9wLnRvaGVhZCAtd2lkdGggNjAgLXJlbGllZiBmbGF0CiAgICAkdG9wLnRvaGVhZCBpbnNlcnQgMCAkbmV3aGVhZAogICAgJHRvcC50b2hlYWQgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgeCAkdG9wLnRvaGVhZCAtc3RpY2t5IHcKICAgIGJ1dHRvbiAkdG9wLnJldiAtdGV4dCAiUmV2ZXJzZSIgLWNvbW1hbmQgbWtwYXRjaHJldiAtcGFkeCA1CiAgICBncmlkICR0b3AucmV2IHggLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuZmxhYiAtdGV4dCAiT3V0cHV0IGZpbGU6IgogICAgZW50cnkgJHRvcC5mbmFtZSAtd2lkdGggNjAKICAgICR0b3AuZm5hbWUgaW5zZXJ0IDAgW2ZpbGUgbm9ybWFsaXplICJwYXRjaCRwYXRjaG51bS5wYXRjaCJdCiAgICBpbmNyIHBhdGNobnVtCiAgICBncmlkICR0b3AuZmxhYiAkdG9wLmZuYW1lIC1zdGlja3kgdwogICAgZnJhbWUgJHRvcC5idXRzCiAgICBidXR0b24gJHRvcC5idXRzLmdlbiAtdGV4dCAiR2VuZXJhdGUiIC1jb21tYW5kIG1rcGF0Y2hnbwogICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgbWtwYXRjaGNhbgogICAgZ3JpZCAkdG9wLmJ1dHMuZ2VuICR0b3AuYnV0cy5jYW4KICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCAkdG9wLmJ1dHMgLSAtcGFkeSAxMCAtc3RpY2t5IGV3CiAgICBmb2N1cyAkdG9wLmZuYW1lCn0KCnByb2MgbWtwYXRjaHJldiB7fSB7CiAgICBnbG9iYWwgcGF0Y2h0b3AKCiAgICBzZXQgb2xkaWQgWyRwYXRjaHRvcC5mcm9tc2hhMSBnZXRdCiAgICBzZXQgb2xkaGVhZCBbJHBhdGNodG9wLmZyb21oZWFkIGdldF0KICAgIHNldCBuZXdpZCBbJHBhdGNodG9wLnRvc2hhMSBnZXRdCiAgICBzZXQgbmV3aGVhZCBbJHBhdGNodG9wLnRvaGVhZCBnZXRdCiAgICBmb3JlYWNoIGUgW2xpc3QgZnJvbXNoYTEgZnJvbWhlYWQgdG9zaGExIHRvaGVhZF0gXAoJICAgIHYgW2xpc3QgJG5ld2lkICRuZXdoZWFkICRvbGRpZCAkb2xkaGVhZF0gewoJJHBhdGNodG9wLiRlIGNvbmYgLXN0YXRlIG5vcm1hbAoJJHBhdGNodG9wLiRlIGRlbGV0ZSAwIGVuZAoJJHBhdGNodG9wLiRlIGluc2VydCAwICR2CgkkcGF0Y2h0b3AuJGUgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIH0KfQoKcHJvYyBta3BhdGNoZ28ge30gewogICAgZ2xvYmFsIHBhdGNodG9wCgogICAgc2V0IG9sZGlkIFskcGF0Y2h0b3AuZnJvbXNoYTEgZ2V0XQogICAgc2V0IG5ld2lkIFskcGF0Y2h0b3AudG9zaGExIGdldF0KICAgIHNldCBmbmFtZSBbJHBhdGNodG9wLmZuYW1lIGdldF0KICAgIGlmIHtbY2F0Y2gge2V4ZWMgZ2l0LWRpZmYtdHJlZSAtcCAkb2xkaWQgJG5ld2lkID4kZm5hbWUgJn0gZXJyXX0gewoJZXJyb3JfcG9wdXAgIkVycm9yIGNyZWF0aW5nIHBhdGNoOiAkZXJyIgogICAgfQogICAgY2F0Y2gge2Rlc3Ryb3kgJHBhdGNodG9wfQogICAgdW5zZXQgcGF0Y2h0b3AKfQoKcHJvYyBta3BhdGNoY2FuIHt9IHsKICAgIGdsb2JhbCBwYXRjaHRvcAoKICAgIGNhdGNoIHtkZXN0cm95ICRwYXRjaHRvcH0KICAgIHVuc2V0IHBhdGNodG9wCn0KCnByb2MgbWt0YWcge30gewogICAgZ2xvYmFsIHJvd21lbnVpZCBta3RhZ3RvcCBjb21taXRpbmZvCgogICAgc2V0IHRvcCAubWFrZXRhZwogICAgc2V0IG1rdGFndG9wICR0b3AKICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9CiAgICB0b3BsZXZlbCAkdG9wCiAgICBsYWJlbCAkdG9wLnRpdGxlIC10ZXh0ICJDcmVhdGUgdGFnIgogICAgZ3JpZCAkdG9wLnRpdGxlIC0gLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuaWQgLXRleHQgIklEOiIKICAgIGVudHJ5ICR0b3Auc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CiAgICAkdG9wLnNoYTEgaW5zZXJ0IDAgJHJvd21lbnVpZAogICAgJHRvcC5zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AuaWQgJHRvcC5zaGExIC1zdGlja3kgdwogICAgZW50cnkgJHRvcC5oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKICAgICR0b3AuaGVhZCBpbnNlcnQgMCBbbGluZGV4ICRjb21taXRpbmZvKCRyb3dtZW51aWQpIDBdCiAgICAkdG9wLmhlYWQgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgeCAkdG9wLmhlYWQgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLnRsYWIgLXRleHQgIlRhZyBuYW1lOiIKICAgIGVudHJ5ICR0b3AudGFnIC13aWR0aCA2MAogICAgZ3JpZCAkdG9wLnRsYWIgJHRvcC50YWcgLXN0aWNreSB3CiAgICBmcmFtZSAkdG9wLmJ1dHMKICAgIGJ1dHRvbiAkdG9wLmJ1dHMuZ2VuIC10ZXh0ICJDcmVhdGUiIC1jb21tYW5kIG1rdGFnZ28KICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIG1rdGFnY2FuCiAgICBncmlkICR0b3AuYnV0cy5nZW4gJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKICAgIGZvY3VzICR0b3AudGFnCn0KCnByb2MgZG9ta3RhZyB7fSB7CiAgICBnbG9iYWwgbWt0YWd0b3AgZW52IHRhZ2lkcyBpZHRhZ3MKICAgIGdsb2JhbCBpZHBvcyBpZGxpbmUgbGluZWh0YWcgY2FudiBzZWxlY3RlZGxpbmUKCiAgICBzZXQgaWQgWyRta3RhZ3RvcC5zaGExIGdldF0KICAgIHNldCB0YWcgWyRta3RhZ3RvcC50YWcgZ2V0XQogICAgaWYgeyR0YWcgPT0ge319IHsKCWVycm9yX3BvcHVwICJObyB0YWcgbmFtZSBzcGVjaWZpZWQiCglyZXR1cm4KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgdGFnaWRzKCR0YWcpXX0gewoJZXJyb3JfcG9wdXAgIlRhZyBcIiR0YWdcIiBhbHJlYWR5IGV4aXN0cyIKCXJldHVybgogICAgfQogICAgaWYge1tjYXRjaCB7CglzZXQgZGlyIFtnaXRkaXJdCglzZXQgZm5hbWUgW2ZpbGUgam9pbiAkZGlyICJyZWZzL3RhZ3MiICR0YWddCglzZXQgZiBbb3BlbiAkZm5hbWUgd10KCXB1dHMgJGYgJGlkCgljbG9zZSAkZgogICAgfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3IgY3JlYXRpbmcgdGFnOiAkZXJyIgoJcmV0dXJuCiAgICB9CgogICAgc2V0IHRhZ2lkcygkdGFnKSAkaWQKICAgIGxhcHBlbmQgaWR0YWdzKCRpZCkgJHRhZwogICAgJGNhbnYgZGVsZXRlIHRhZy4kaWQKICAgIHNldCB4dCBbZXZhbCBkcmF3dGFncyAkaWQgJGlkcG9zKCRpZCldCiAgICAkY2FudiBjb29yZHMgJGxpbmVodGFnKCRpZGxpbmUoJGlkKSkgJHh0IFtsaW5kZXggJGlkcG9zKCRpZCkgMl0KICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXSAmJiAkc2VsZWN0ZWRsaW5lID09ICRpZGxpbmUoJGlkKX0gewoJc2VsZWN0bGluZSAkc2VsZWN0ZWRsaW5lCiAgICB9Cn0KCnByb2MgbWt0YWdjYW4ge30gewogICAgZ2xvYmFsIG1rdGFndG9wCgogICAgY2F0Y2gge2Rlc3Ryb3kgJG1rdGFndG9wfQogICAgdW5zZXQgbWt0YWd0b3AKfQoKcHJvYyBta3RhZ2dvIHt9IHsKICAgIGRvbWt0YWcKICAgIG1rdGFnY2FuCn0KCnByb2Mgd3JpdGVjb21taXQge30gewogICAgZ2xvYmFsIHJvd21lbnVpZCB3cmNvbXRvcCBjb21taXRpbmZvIHdyY29tY21kCgogICAgc2V0IHRvcCAud3JpdGVjb21taXQKICAgIHNldCB3cmNvbXRvcCAkdG9wCiAgICBjYXRjaCB7ZGVzdHJveSAkdG9wfQogICAgdG9wbGV2ZWwgJHRvcAogICAgbGFiZWwgJHRvcC50aXRsZSAtdGV4dCAiV3JpdGUgY29tbWl0IHRvIGZpbGUiCiAgICBncmlkICR0b3AudGl0bGUgLSAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5pZCAtdGV4dCAiSUQ6IgogICAgZW50cnkgJHRvcC5zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3Auc2hhMSBpbnNlcnQgMCAkcm93bWVudWlkCiAgICAkdG9wLnNoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgJHRvcC5pZCAkdG9wLnNoYTEgLXN0aWNreSB3CiAgICBlbnRyeSAkdG9wLmhlYWQgLXdpZHRoIDYwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5oZWFkIGluc2VydCAwIFtsaW5kZXggJGNvbW1pdGluZm8oJHJvd21lbnVpZCkgMF0KICAgICR0b3AuaGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCB4ICR0b3AuaGVhZCAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AuY2xhYiAtdGV4dCAiQ29tbWFuZDoiCiAgICBlbnRyeSAkdG9wLmNtZCAtd2lkdGggNjAgLXRleHR2YXJpYWJsZSB3cmNvbWNtZAogICAgZ3JpZCAkdG9wLmNsYWIgJHRvcC5jbWQgLXN0aWNreSB3IC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmZsYWIgLXRleHQgIk91dHB1dCBmaWxlOiIKICAgIGVudHJ5ICR0b3AuZm5hbWUgLXdpZHRoIDYwCiAgICAkdG9wLmZuYW1lIGluc2VydCAwIFtmaWxlIG5vcm1hbGl6ZSAiY29tbWl0LVtzdHJpbmcgcmFuZ2UgJHJvd21lbnVpZCAwIDZdIl0KICAgIGdyaWQgJHRvcC5mbGFiICR0b3AuZm5hbWUgLXN0aWNreSB3CiAgICBmcmFtZSAkdG9wLmJ1dHMKICAgIGJ1dHRvbiAkdG9wLmJ1dHMuZ2VuIC10ZXh0ICJXcml0ZSIgLWNvbW1hbmQgd3Jjb21nbwogICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgd3Jjb21jYW4KICAgIGdyaWQgJHRvcC5idXRzLmdlbiAkdG9wLmJ1dHMuY2FuCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgJHRvcC5idXRzIC0gLXBhZHkgMTAgLXN0aWNreSBldwogICAgZm9jdXMgJHRvcC5mbmFtZQp9Cgpwcm9jIHdyY29tZ28ge30gewogICAgZ2xvYmFsIHdyY29tdG9wCgogICAgc2V0IGlkIFskd3Jjb210b3Auc2hhMSBnZXRdCiAgICBzZXQgY21kICJlY2hvICRpZCB8IFskd3Jjb210b3AuY21kIGdldF0iCiAgICBzZXQgZm5hbWUgWyR3cmNvbXRvcC5mbmFtZSBnZXRdCiAgICBpZiB7W2NhdGNoIHtleGVjIHNoIC1jICRjbWQgPiRmbmFtZSAmfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3Igd3JpdGluZyBjb21taXQ6ICRlcnIiCiAgICB9CiAgICBjYXRjaCB7ZGVzdHJveSAkd3Jjb210b3B9CiAgICB1bnNldCB3cmNvbXRvcAp9Cgpwcm9jIHdyY29tY2FuIHt9IHsKICAgIGdsb2JhbCB3cmNvbXRvcAoKICAgIGNhdGNoIHtkZXN0cm95ICR3cmNvbXRvcH0KICAgIHVuc2V0IHdyY29tdG9wCn0KCnByb2MgZG9xdWl0IHt9IHsKICAgIGdsb2JhbCBzdG9wcGVkCiAgICBzZXQgc3RvcHBlZCAxMDAKICAgIGRlc3Ryb3kgLgp9CgojIGRlZmF1bHRzLi4uCnNldCBkYXRlbW9kZSAwCnNldCBib2xkbmFtZXMgMApzZXQgZGlmZm9wdHMgIi1VIDUgLXAiCnNldCB3cmNvbWNtZCAiZ2l0LWRpZmYtdHJlZSAtLXN0ZGluIC1wIC0tcHJldHR5IgoKc2V0IG1haW5mb250IHtIZWx2ZXRpY2EgOX0Kc2V0IHRleHRmb250IHtDb3VyaWVyIDl9CnNldCBmaW5kbWVyZ2VmaWxlcyAwCnNldCBnYXVkeWRpZmYgMAoKc2V0IGNvbG9ycyB7Z3JlZW4gcmVkIGJsdWUgbWFnZW50YSBkYXJrZ3JleSBicm93biBvcmFuZ2V9CgpjYXRjaCB7c291cmNlIH4vLmdpdGt9CgpzZXQgbmFtZWZvbnQgJG1haW5mb250CmlmIHskYm9sZG5hbWVzfSB7CiAgICBsYXBwZW5kIG5hbWVmb250IGJvbGQKfQoKc2V0IHJldnRyZWVhcmdzIHt9CmZvcmVhY2ggYXJnICRhcmd2IHsKICAgIHN3aXRjaCAtcmVnZXhwIC0tICRhcmcgewoJIl4kIiB7IH0KCSJeLWIiIHsgc2V0IGJvbGRuYW1lcyAxIH0KCSJeLWQiIHsgc2V0IGRhdGVtb2RlIDEgfQoJZGVmYXVsdCB7CgkgICAgbGFwcGVuZCByZXZ0cmVlYXJncyAkYXJnCgl9CiAgICB9Cn0KCnNldCBzdG9wcGVkIDAKc2V0IHJlZGlzcGxheWluZyAwCnNldCBzdHVmZnNhdmVkIDAKc2V0IHBhdGNobnVtIDAKc2V0Y29vcmRzCm1ha2V3aW5kb3cKcmVhZHJlZnMKZ2V0Y29tbWl0cyAkcmV2dHJlZWFyZ3MK