IyEvYmluL3NoCiMgVGNsIGlnbm9yZXMgdGhlIG5leHQgbGluZSAtKi0gdGNsIC0qLSBcCmV4ZWMgd2lzaCAiJDAiIC0tICIkQCIKCiMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgUGF1bCBNYWNrZXJyYXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyBpdCBtYXkgYmUgdXNlZCwgY29waWVkLCBtb2RpZmllZAojIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlLAojIGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgpwcm9jIGdpdGRpciB7fSB7CiAgICBnbG9iYWwgZW52CiAgICBpZiB7W2luZm8gZXhpc3RzIGVudihHSVRfRElSKV19IHsKCXJldHVybiAkZW52KEdJVF9ESVIpCiAgICB9IGVsc2UgewoJcmV0dXJuICIuZ2l0IgogICAgfQp9Cgpwcm9jIHN0YXJ0X3Jldl9saXN0IHt2aWV3fSB7CiAgICBnbG9iYWwgc3RhcnRtc2VjcyBuZXh0dXBkYXRlCiAgICBnbG9iYWwgY29tbWZkIGxlZnRvdmVyIHRjbGVuY29kaW5nIGRhdGVtb2RlCiAgICBnbG9iYWwgdmlld2FyZ3Mgdmlld2ZpbGVzIGNvbW1pdGlkeAoKICAgIHNldCBzdGFydG1zZWNzIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KICAgIHNldCBuZXh0dXBkYXRlIFtleHByIHskc3RhcnRtc2VjcyArIDEwMH1dCiAgICBzZXQgY29tbWl0aWR4KCR2aWV3KSAwCiAgICBzZXQgYXJncyAkdmlld2FyZ3MoJHZpZXcpCiAgICBpZiB7JHZpZXdmaWxlcygkdmlldykgbmUge319IHsKCXNldCBhcmdzIFtjb25jYXQgJGFyZ3MgIi0tIiAkdmlld2ZpbGVzKCR2aWV3KV0KICAgIH0KICAgIHNldCBvcmRlciAiLS10b3BvLW9yZGVyIgogICAgaWYgeyRkYXRlbW9kZX0gewoJc2V0IG9yZGVyICItLWRhdGUtb3JkZXIiCiAgICB9CiAgICBpZiB7W2NhdGNoIHsKCXNldCBmZCBbb3BlbiBbY29uY2F0IHwgZ2l0IHJldi1saXN0IC0taGVhZGVyICRvcmRlciBcCgkJCSAgLS1wYXJlbnRzIC0tYm91bmRhcnkgLS1kZWZhdWx0IEhFQUQgJGFyZ3NdIHJdCiAgICB9IGVycl19IHsKCXB1dHMgc3RkZXJyICJFcnJvciBleGVjdXRpbmcgZ2l0IHJldi1saXN0OiAkZXJyIgoJZXhpdCAxCiAgICB9CiAgICBzZXQgY29tbWZkKCR2aWV3KSAkZmQKICAgIHNldCBsZWZ0b3Zlcigkdmlldykge30KICAgIGZjb25maWd1cmUgJGZkIC1ibG9ja2luZyAwIC10cmFuc2xhdGlvbiBsZgogICAgaWYgeyR0Y2xlbmNvZGluZyAhPSB7fX0gewoJZmNvbmZpZ3VyZSAkZmQgLWVuY29kaW5nICR0Y2xlbmNvZGluZwogICAgfQogICAgZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCBnZXRjb21taXRsaW5lcyAkZmQgJHZpZXddCiAgICBub3didXN5ICR2aWV3Cn0KCnByb2Mgc3RvcF9yZXZfbGlzdCB7fSB7CiAgICBnbG9iYWwgY29tbWZkIGN1cnZpZXcKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21tZmQoJGN1cnZpZXcpXX0gcmV0dXJuCiAgICBzZXQgZmQgJGNvbW1mZCgkY3VydmlldykKICAgIGNhdGNoIHsKCXNldCBwaWQgW3BpZCAkZmRdCglleGVjIGtpbGwgJHBpZAogICAgfQogICAgY2F0Y2gge2Nsb3NlICRmZH0KICAgIHVuc2V0IGNvbW1mZCgkY3VydmlldykKfQoKcHJvYyBnZXRjb21taXRzIHt9IHsKICAgIGdsb2JhbCBwaGFzZSBjYW52IG1haW5mb250IGN1cnZpZXcKCiAgICBzZXQgcGhhc2UgZ2V0Y29tbWl0cwogICAgaW5pdGxheW91dAogICAgc3RhcnRfcmV2X2xpc3QgJGN1cnZpZXcKICAgIHNob3dfc3RhdHVzICJSZWFkaW5nIGNvbW1pdHMuLi4iCn0KCnByb2MgZ2V0Y29tbWl0bGluZXMge2ZkIHZpZXd9ICB7CiAgICBnbG9iYWwgY29tbWl0bGlzdGVkIG5leHR1cGRhdGUKICAgIGdsb2JhbCBsZWZ0b3ZlciBjb21tZmQKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgY29tbWl0aWR4IGNvbW1pdHJvdyBjb21taXRkYXRhCiAgICBnbG9iYWwgcGFyZW50bGlzdCBjaGlsZGxpc3QgY2hpbGRyZW4gY3VydmlldyBobHZpZXcKICAgIGdsb2JhbCB2cGFyZW50bGlzdCB2Y2hpbGRsaXN0IHZkaXNwb3JkZXIgdmNtaXRsaXN0ZWQKCiAgICBzZXQgc3R1ZmYgW3JlYWQgJGZkIDUwMDAwMF0KICAgIGlmIHskc3R1ZmYgPT0ge319IHsKCWlmIHshW2VvZiAkZmRdfSByZXR1cm4KCWdsb2JhbCB2aWV3bmFtZQoJdW5zZXQgY29tbWZkKCR2aWV3KQoJbm90YnVzeSAkdmlldwoJIyBzZXQgaXQgYmxvY2tpbmcgc28gd2Ugd2FpdCBmb3IgdGhlIHByb2Nlc3MgdG8gdGVybWluYXRlCglmY29uZmlndXJlICRmZCAtYmxvY2tpbmcgMQoJaWYge1tjYXRjaCB7Y2xvc2UgJGZkfSBlcnJdfSB7CgkgICAgc2V0IGZ2IHt9CgkgICAgaWYgeyR2aWV3ICE9ICRjdXJ2aWV3fSB7CgkJc2V0IGZ2ICIgZm9yIHRoZSBcIiR2aWV3bmFtZSgkdmlldylcIiB2aWV3IgoJICAgIH0KCSAgICBpZiB7W3N0cmluZyByYW5nZSAkZXJyIDAgNF0gPT0gInVzYWdlIn0gewoJCXNldCBlcnIgIkdpdGs6IGVycm9yIHJlYWRpbmcgY29tbWl0cyRmdjpcCgkJCWJhZCBhcmd1bWVudHMgdG8gZ2l0IHJldi1saXN0LiIKCQlpZiB7JHZpZXduYW1lKCR2aWV3KSBlcSAiQ29tbWFuZCBsaW5lIn0gewoJCSAgICBhcHBlbmQgZXJyIFwKCQkJIiAgKE5vdGU6IGFyZ3VtZW50cyB0byBnaXRrIGFyZSBwYXNzZWQgdG8gZ2l0IHJldi1saXN0XAoJCQkgdG8gYWxsb3cgc2VsZWN0aW9uIG9mIGNvbW1pdHMgdG8gYmUgZGlzcGxheWVkLikiCgkJfQoJICAgIH0gZWxzZSB7CgkJc2V0IGVyciAiRXJyb3IgcmVhZGluZyBjb21taXRzJGZ2OiAkZXJyIgoJICAgIH0KCSAgICBlcnJvcl9wb3B1cCAkZXJyCgl9CglpZiB7JHZpZXcgPT0gJGN1cnZpZXd9IHsKCSAgICBhZnRlciBpZGxlIGZpbmlzaGNvbW1pdHMKCX0KCXJldHVybgogICAgfQogICAgc2V0IHN0YXJ0IDAKICAgIHNldCBnb3Rzb21lIDAKICAgIHdoaWxlIDEgewoJc2V0IGkgW3N0cmluZyBmaXJzdCAiXDAiICRzdHVmZiAkc3RhcnRdCglpZiB7JGkgPCAwfSB7CgkgICAgYXBwZW5kIGxlZnRvdmVyKCR2aWV3KSBbc3RyaW5nIHJhbmdlICRzdHVmZiAkc3RhcnQgZW5kXQoJICAgIGJyZWFrCgl9CglpZiB7JHN0YXJ0ID09IDB9IHsKCSAgICBzZXQgY21pdCAkbGVmdG92ZXIoJHZpZXcpCgkgICAgYXBwZW5kIGNtaXQgW3N0cmluZyByYW5nZSAkc3R1ZmYgMCBbZXhwciB7JGkgLSAxfV1dCgkgICAgc2V0IGxlZnRvdmVyKCR2aWV3KSB7fQoJfSBlbHNlIHsKCSAgICBzZXQgY21pdCBbc3RyaW5nIHJhbmdlICRzdHVmZiAkc3RhcnQgW2V4cHIgeyRpIC0gMX1dXQoJfQoJc2V0IHN0YXJ0IFtleHByIHskaSArIDF9XQoJc2V0IGogW3N0cmluZyBmaXJzdCAiXG4iICRjbWl0XQoJc2V0IG9rIDAKCXNldCBsaXN0ZWQgMQoJaWYgeyRqID49IDB9IHsKCSAgICBzZXQgaWRzIFtzdHJpbmcgcmFuZ2UgJGNtaXQgMCBbZXhwciB7JGogLSAxfV1dCgkgICAgaWYge1tzdHJpbmcgcmFuZ2UgJGlkcyAwIDBdID09ICItIn0gewoJCXNldCBsaXN0ZWQgMAoJCXNldCBpZHMgW3N0cmluZyByYW5nZSAkaWRzIDEgZW5kXQoJICAgIH0KCSAgICBzZXQgb2sgMQoJICAgIGZvcmVhY2ggaWQgJGlkcyB7CgkJaWYge1tzdHJpbmcgbGVuZ3RoICRpZF0gIT0gNDB9IHsKCQkgICAgc2V0IG9rIDAKCQkgICAgYnJlYWsKCQl9CgkgICAgfQoJfQoJaWYgeyEkb2t9IHsKCSAgICBzZXQgc2hvcnRjbWl0ICRjbWl0CgkgICAgaWYge1tzdHJpbmcgbGVuZ3RoICRzaG9ydGNtaXRdID4gODB9IHsKCQlzZXQgc2hvcnRjbWl0ICJbc3RyaW5nIHJhbmdlICRzaG9ydGNtaXQgMCA4MF0uLi4iCgkgICAgfQoJICAgIGVycm9yX3BvcHVwICJDYW4ndCBwYXJzZSBnaXQgcmV2LWxpc3Qgb3V0cHV0OiB7JHNob3J0Y21pdH0iCgkgICAgZXhpdCAxCgl9CglzZXQgaWQgW2xpbmRleCAkaWRzIDBdCglpZiB7JGxpc3RlZH0gewoJICAgIHNldCBvbGRzIFtscmFuZ2UgJGlkcyAxIGVuZF0KCSAgICBzZXQgaSAwCgkgICAgZm9yZWFjaCBwICRvbGRzIHsKCQlpZiB7JGkgPT0gMCB8fCBbbHNlYXJjaCAtZXhhY3QgJG9sZHMgJHBdID49ICRpfSB7CgkJICAgIGxhcHBlbmQgY2hpbGRyZW4oJHZpZXcsJHApICRpZAoJCX0KCQlpbmNyIGkKCSAgICB9Cgl9IGVsc2UgewoJICAgIHNldCBvbGRzIHt9Cgl9CglpZiB7IVtpbmZvIGV4aXN0cyBjaGlsZHJlbigkdmlldywkaWQpXX0gewoJICAgIHNldCBjaGlsZHJlbigkdmlldywkaWQpIHt9Cgl9CglzZXQgY29tbWl0ZGF0YSgkaWQpIFtzdHJpbmcgcmFuZ2UgJGNtaXQgW2V4cHIgeyRqICsgMX1dIGVuZF0KCXNldCBjb21taXRyb3coJHZpZXcsJGlkKSAkY29tbWl0aWR4KCR2aWV3KQoJaW5jciBjb21taXRpZHgoJHZpZXcpCglpZiB7JHZpZXcgPT0gJGN1cnZpZXd9IHsKCSAgICBsYXBwZW5kIHBhcmVudGxpc3QgJG9sZHMKCSAgICBsYXBwZW5kIGNoaWxkbGlzdCAkY2hpbGRyZW4oJHZpZXcsJGlkKQoJICAgIGxhcHBlbmQgZGlzcGxheW9yZGVyICRpZAoJICAgIGxhcHBlbmQgY29tbWl0bGlzdGVkICRsaXN0ZWQKCX0gZWxzZSB7CgkgICAgbGFwcGVuZCB2cGFyZW50bGlzdCgkdmlldykgJG9sZHMKCSAgICBsYXBwZW5kIHZjaGlsZGxpc3QoJHZpZXcpICRjaGlsZHJlbigkdmlldywkaWQpCgkgICAgbGFwcGVuZCB2ZGlzcG9yZGVyKCR2aWV3KSAkaWQKCSAgICBsYXBwZW5kIHZjbWl0bGlzdGVkKCR2aWV3KSAkbGlzdGVkCgl9CglzZXQgZ290c29tZSAxCiAgICB9CiAgICBpZiB7JGdvdHNvbWV9IHsKCWlmIHskdmlldyA9PSAkY3Vydmlld30gewoJICAgIHdoaWxlIHtbbGF5b3V0bW9yZSAkbmV4dHVwZGF0ZV19IGRvdXBkYXRlCgl9IGVsc2VpZiB7W2luZm8gZXhpc3RzIGhsdmlld10gJiYgJHZpZXcgPT0gJGhsdmlld30gewoJICAgIHZoaWdobGlnaHRtb3JlCgl9CiAgICB9CiAgICBpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSA+PSAkbmV4dHVwZGF0ZX0gewoJZG91cGRhdGUKICAgIH0KfQoKcHJvYyBkb3VwZGF0ZSB7fSB7CiAgICBnbG9iYWwgY29tbWZkIG5leHR1cGRhdGUgbnVtY29tbWl0cwoKICAgIGZvcmVhY2ggdiBbYXJyYXkgbmFtZXMgY29tbWZkXSB7CglmaWxlZXZlbnQgJGNvbW1mZCgkdikgcmVhZGFibGUge30KICAgIH0KICAgIHVwZGF0ZQogICAgc2V0IG5leHR1cGRhdGUgW2V4cHIge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gKyAxMDB9XQogICAgZm9yZWFjaCB2IFthcnJheSBuYW1lcyBjb21tZmRdIHsKCXNldCBmZCAkY29tbWZkKCR2KQoJZmlsZWV2ZW50ICRmZCByZWFkYWJsZSBbbGlzdCBnZXRjb21taXRsaW5lcyAkZmQgJHZdCiAgICB9Cn0KCnByb2MgcmVhZGNvbW1pdCB7aWR9IHsKICAgIGlmIHtbY2F0Y2gge3NldCBjb250ZW50cyBbZXhlYyBnaXQgY2F0LWZpbGUgY29tbWl0ICRpZF19XX0gcmV0dXJuCiAgICBwYXJzZWNvbW1pdCAkaWQgJGNvbnRlbnRzIDAKfQoKcHJvYyB1cGRhdGVjb21taXRzIHt9IHsKICAgIGdsb2JhbCB2aWV3ZGF0YSBjdXJ2aWV3IHBoYXNlIGRpc3BsYXlvcmRlcgogICAgZ2xvYmFsIGNoaWxkcmVuIGNvbW1pdHJvdyBzZWxlY3RlZGxpbmUgdGhpY2tlcmxpbmUKCiAgICBpZiB7JHBoYXNlIG5lIHt9fSB7CglzdG9wX3Jldl9saXN0CglzZXQgcGhhc2Uge30KICAgIH0KICAgIHNldCBuICRjdXJ2aWV3CiAgICBmb3JlYWNoIGlkICRkaXNwbGF5b3JkZXIgewoJY2F0Y2gge3Vuc2V0IGNoaWxkcmVuKCRuLCRpZCl9CgljYXRjaCB7dW5zZXQgY29tbWl0cm93KCRuLCRpZCl9CiAgICB9CiAgICBzZXQgY3VydmlldyAtMQogICAgY2F0Y2gge3Vuc2V0IHNlbGVjdGVkbGluZX0KICAgIGNhdGNoIHt1bnNldCB0aGlja2VybGluZX0KICAgIGNhdGNoIHt1bnNldCB2aWV3ZGF0YSgkbil9CiAgICBkaXNjYXJkYWxsY29tbWl0cwogICAgcmVhZHJlZnMKICAgIHNob3d2aWV3ICRuCn0KCnByb2MgcGFyc2Vjb21taXQge2lkIGNvbnRlbnRzIGxpc3RlZH0gewogICAgZ2xvYmFsIGNvbW1pdGluZm8gY2RhdGUKCiAgICBzZXQgaW5oZHIgMQogICAgc2V0IGNvbW1lbnQge30KICAgIHNldCBoZWFkbGluZSB7fQogICAgc2V0IGF1bmFtZSB7fQogICAgc2V0IGF1ZGF0ZSB7fQogICAgc2V0IGNvbW5hbWUge30KICAgIHNldCBjb21kYXRlIHt9CiAgICBzZXQgaGRyZW5kIFtzdHJpbmcgZmlyc3QgIlxuXG4iICRjb250ZW50c10KICAgIGlmIHskaGRyZW5kIDwgMH0gewoJIyBzaG91bGQgbmV2ZXIgaGFwcGVuLi4uCglzZXQgaGRyZW5kIFtzdHJpbmcgbGVuZ3RoICRjb250ZW50c10KICAgIH0KICAgIHNldCBoZWFkZXIgW3N0cmluZyByYW5nZSAkY29udGVudHMgMCBbZXhwciB7JGhkcmVuZCAtIDF9XV0KICAgIHNldCBjb21tZW50IFtzdHJpbmcgcmFuZ2UgJGNvbnRlbnRzIFtleHByIHskaGRyZW5kICsgMn1dIGVuZF0KICAgIGZvcmVhY2ggbGluZSBbc3BsaXQgJGhlYWRlciAiXG4iXSB7CglzZXQgdGFnIFtsaW5kZXggJGxpbmUgMF0KCWlmIHskdGFnID09ICJhdXRob3IifSB7CgkgICAgc2V0IGF1ZGF0ZSBbbGluZGV4ICRsaW5lIGVuZC0xXQoJICAgIHNldCBhdW5hbWUgW2xyYW5nZSAkbGluZSAxIGVuZC0yXQoJfSBlbHNlaWYgeyR0YWcgPT0gImNvbW1pdHRlciJ9IHsKCSAgICBzZXQgY29tZGF0ZSBbbGluZGV4ICRsaW5lIGVuZC0xXQoJICAgIHNldCBjb21uYW1lIFtscmFuZ2UgJGxpbmUgMSBlbmQtMl0KCX0KICAgIH0KICAgIHNldCBoZWFkbGluZSB7fQogICAgIyB0YWtlIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBjb21tZW50IGFzIHRoZSBoZWFkbGluZQogICAgc2V0IGkgW3N0cmluZyBmaXJzdCAiXG4iICRjb21tZW50XQogICAgaWYgeyRpID49IDB9IHsKCXNldCBoZWFkbGluZSBbc3RyaW5nIHRyaW0gW3N0cmluZyByYW5nZSAkY29tbWVudCAwICRpXV0KICAgIH0gZWxzZSB7CglzZXQgaGVhZGxpbmUgJGNvbW1lbnQKICAgIH0KICAgIGlmIHshJGxpc3RlZH0gewoJIyBnaXQgcmV2LWxpc3QgaW5kZW50cyB0aGUgY29tbWVudCBieSA0IHNwYWNlczsKCSMgaWYgd2UgZ290IHRoaXMgdmlhIGdpdCBjYXQtZmlsZSwgYWRkIHRoZSBpbmRlbnRhdGlvbgoJc2V0IG5ld2NvbW1lbnQge30KCWZvcmVhY2ggbGluZSBbc3BsaXQgJGNvbW1lbnQgIlxuIl0gewoJICAgIGFwcGVuZCBuZXdjb21tZW50ICIgICAgIgoJICAgIGFwcGVuZCBuZXdjb21tZW50ICRsaW5lCgkgICAgYXBwZW5kIG5ld2NvbW1lbnQgIlxuIgoJfQoJc2V0IGNvbW1lbnQgJG5ld2NvbW1lbnQKICAgIH0KICAgIGlmIHskY29tZGF0ZSAhPSB7fX0gewoJc2V0IGNkYXRlKCRpZCkgJGNvbWRhdGUKICAgIH0KICAgIHNldCBjb21taXRpbmZvKCRpZCkgW2xpc3QgJGhlYWRsaW5lICRhdW5hbWUgJGF1ZGF0ZSBcCgkJCSAgICAgJGNvbW5hbWUgJGNvbWRhdGUgJGNvbW1lbnRdCn0KCnByb2MgZ2V0Y29tbWl0IHtpZH0gewogICAgZ2xvYmFsIGNvbW1pdGRhdGEgY29tbWl0aW5mbwoKICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0ZGF0YSgkaWQpXX0gewoJcGFyc2Vjb21taXQgJGlkICRjb21taXRkYXRhKCRpZCkgMQogICAgfSBlbHNlIHsKCXJlYWRjb21taXQgJGlkCglpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSB7CgkgICAgc2V0IGNvbW1pdGluZm8oJGlkKSB7Ik5vIGNvbW1pdCBpbmZvcm1hdGlvbiBhdmFpbGFibGUifQoJfQogICAgfQogICAgcmV0dXJuIDEKfQoKcHJvYyByZWFkcmVmcyB7fSB7CiAgICBnbG9iYWwgdGFnaWRzIGlkdGFncyBoZWFkaWRzIGlkaGVhZHMgdGFnY29udGVudHMKICAgIGdsb2JhbCBvdGhlcnJlZmlkcyBpZG90aGVycmVmcyBtYWluaGVhZAoKICAgIGZvcmVhY2ggdiB7dGFnaWRzIGlkdGFncyBoZWFkaWRzIGlkaGVhZHMgb3RoZXJyZWZpZHMgaWRvdGhlcnJlZnN9IHsKCWNhdGNoIHt1bnNldCAkdn0KICAgIH0KICAgIHNldCByZWZkIFtvcGVuIFtsaXN0IHwgZ2l0IGxzLXJlbW90ZSBbZ2l0ZGlyXV0gcl0KICAgIHdoaWxlIHswIDw9IFtzZXQgbiBbZ2V0cyAkcmVmZCBsaW5lXV19IHsKCWlmIHshW3JlZ2V4cCB7XihbMC05YS1mXXs0MH0pCXJlZnMvKFteXl0qKSR9ICRsaW5lIFwKCSAgICBtYXRjaCBpZCBwYXRoXX0gewoJICAgIGNvbnRpbnVlCgl9CglpZiB7W3JlZ2V4cCB7XnJlbW90ZXMvLiovSEVBRCR9ICRwYXRoIG1hdGNoXX0gewoJICAgIGNvbnRpbnVlCgl9CglpZiB7IVtyZWdleHAge14odGFnc3xoZWFkcykvKC4qKSR9ICRwYXRoIG1hdGNoIHR5cGUgbmFtZV19IHsKCSAgICBzZXQgdHlwZSBvdGhlcnMKCSAgICBzZXQgbmFtZSAkcGF0aAoJfQoJaWYge1tyZWdleHAge15yZW1vdGVzL30gJHBhdGggbWF0Y2hdfSB7CgkgICAgc2V0IHR5cGUgaGVhZHMKCX0KCWlmIHskdHlwZSA9PSAidGFncyJ9IHsKCSAgICBzZXQgdGFnaWRzKCRuYW1lKSAkaWQKCSAgICBsYXBwZW5kIGlkdGFncygkaWQpICRuYW1lCgkgICAgc2V0IG9iaiB7fQoJICAgIHNldCB0eXBlIHt9CgkgICAgc2V0IHRhZyB7fQoJICAgIGNhdGNoIHsKCQlzZXQgY29tbWl0IFtleGVjIGdpdCByZXYtcGFyc2UgIiRpZF4wIl0KCQlpZiB7JGNvbW1pdCAhPSAkaWR9IHsKCQkgICAgc2V0IHRhZ2lkcygkbmFtZSkgJGNvbW1pdAoJCSAgICBsYXBwZW5kIGlkdGFncygkY29tbWl0KSAkbmFtZQoJCX0KCSAgICB9CQkKCSAgICBjYXRjaCB7CgkgICAgICAgIHNldCB0YWdjb250ZW50cygkbmFtZSkgW2V4ZWMgZ2l0IGNhdC1maWxlIHRhZyAkaWRdCgkgICAgfQoJfSBlbHNlaWYgeyAkdHlwZSA9PSAiaGVhZHMiIH0gewoJICAgIHNldCBoZWFkaWRzKCRuYW1lKSAkaWQKCSAgICBsYXBwZW5kIGlkaGVhZHMoJGlkKSAkbmFtZQoJfSBlbHNlIHsKCSAgICBzZXQgb3RoZXJyZWZpZHMoJG5hbWUpICRpZAoJICAgIGxhcHBlbmQgaWRvdGhlcnJlZnMoJGlkKSAkbmFtZQoJfQogICAgfQogICAgY2xvc2UgJHJlZmQKICAgIHNldCBtYWluaGVhZCB7fQogICAgY2F0Y2ggewoJc2V0IHRoZWhlYWQgW2V4ZWMgZ2l0IHN5bWJvbGljLXJlZiBIRUFEXQoJaWYge1tzdHJpbmcgbWF0Y2ggInJlZnMvaGVhZHMvKiIgJHRoZWhlYWRdfSB7CgkgICAgc2V0IG1haW5oZWFkIFtzdHJpbmcgcmFuZ2UgJHRoZWhlYWQgMTEgZW5kXQoJfQogICAgfQp9Cgpwcm9jIHNob3dfZXJyb3Ige3cgdG9wIG1zZ30gewogICAgbWVzc2FnZSAkdy5tIC10ZXh0ICRtc2cgLWp1c3RpZnkgY2VudGVyIC1hc3BlY3QgNDAwCiAgICBwYWNrICR3Lm0gLXNpZGUgdG9wIC1maWxsIHggLXBhZHggMjAgLXBhZHkgMjAKICAgIGJ1dHRvbiAkdy5vayAtdGV4dCBPSyAtY29tbWFuZCAiZGVzdHJveSAkdG9wIgogICAgcGFjayAkdy5vayAtc2lkZSBib3R0b20gLWZpbGwgeAogICAgYmluZCAkdG9wIDxWaXNpYmlsaXR5PiAiZ3JhYiAkdG9wOyBmb2N1cyAkdG9wIgogICAgYmluZCAkdG9wIDxLZXktUmV0dXJuPiAiZGVzdHJveSAkdG9wIgogICAgdGt3YWl0IHdpbmRvdyAkdG9wCn0KCnByb2MgZXJyb3JfcG9wdXAgbXNnIHsKICAgIHNldCB3IC5lcnJvcgogICAgdG9wbGV2ZWwgJHcKICAgIHdtIHRyYW5zaWVudCAkdyAuCiAgICBzaG93X2Vycm9yICR3ICR3ICRtc2cKfQoKcHJvYyBjb25maXJtX3BvcHVwIG1zZyB7CiAgICBnbG9iYWwgY29uZmlybV9vawogICAgc2V0IGNvbmZpcm1fb2sgMAogICAgc2V0IHcgLmNvbmZpcm0KICAgIHRvcGxldmVsICR3CiAgICB3bSB0cmFuc2llbnQgJHcgLgogICAgbWVzc2FnZSAkdy5tIC10ZXh0ICRtc2cgLWp1c3RpZnkgY2VudGVyIC1hc3BlY3QgNDAwCiAgICBwYWNrICR3Lm0gLXNpZGUgdG9wIC1maWxsIHggLXBhZHggMjAgLXBhZHkgMjAKICAgIGJ1dHRvbiAkdy5vayAtdGV4dCBPSyAtY29tbWFuZCAic2V0IGNvbmZpcm1fb2sgMTsgZGVzdHJveSAkdyIKICAgIHBhY2sgJHcub2sgLXNpZGUgbGVmdCAtZmlsbCB4CiAgICBidXR0b24gJHcuY2FuY2VsIC10ZXh0IENhbmNlbCAtY29tbWFuZCAiZGVzdHJveSAkdyIKICAgIHBhY2sgJHcuY2FuY2VsIC1zaWRlIHJpZ2h0IC1maWxsIHgKICAgIGJpbmQgJHcgPFZpc2liaWxpdHk+ICJncmFiICR3OyBmb2N1cyAkdyIKICAgIHRrd2FpdCB3aW5kb3cgJHcKICAgIHJldHVybiAkY29uZmlybV9vawp9Cgpwcm9jIG1ha2V3aW5kb3cge30gewogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMgbGluZXNwYyBjaGFyc3BjIGN0ZXh0IGNmbGlzdAogICAgZ2xvYmFsIHRleHRmb250IG1haW5mb250IHVpZm9udAogICAgZ2xvYmFsIGZpbmR0eXBlIGZpbmR0eXBlbWVudSBmaW5kbG9jIGZpbmRzdHJpbmcgZnN0cmluZyBnZW9tZXRyeQogICAgZ2xvYmFsIGVudHJpZXMgc2hhMWVudHJ5IHNoYTFzdHJpbmcgc2hhMWJ1dAogICAgZ2xvYmFsIG1haW5jdXJzb3IgdGV4dGN1cnNvciBjdXJ0ZXh0Y3Vyc29yCiAgICBnbG9iYWwgcm93Y3R4bWVudSBtZXJnZW1heCB3cmFwY29tbWVudAogICAgZ2xvYmFsIGhpZ2hsaWdodF9maWxlcyBnZHR0eXBlCiAgICBnbG9iYWwgc2VhcmNoc3RyaW5nIHNzdHJpbmcKICAgIGdsb2JhbCBiZ2NvbG9yIGZnY29sb3IgYmdsaXN0IGZnbGlzdCBkaWZmY29sb3JzCiAgICBnbG9iYWwgaGVhZGN0eG1lbnUKCiAgICBtZW51IC5iYXIKICAgIC5iYXIgYWRkIGNhc2NhZGUgLWxhYmVsICJGaWxlIiAtbWVudSAuYmFyLmZpbGUKICAgIC5iYXIgY29uZmlndXJlIC1mb250ICR1aWZvbnQKICAgIG1lbnUgLmJhci5maWxlCiAgICAuYmFyLmZpbGUgYWRkIGNvbW1hbmQgLWxhYmVsICJVcGRhdGUiIC1jb21tYW5kIHVwZGF0ZWNvbW1pdHMKICAgIC5iYXIuZmlsZSBhZGQgY29tbWFuZCAtbGFiZWwgIlJlcmVhZCByZWZlcmVuY2VzIiAtY29tbWFuZCByZXJlYWRyZWZzCiAgICAuYmFyLmZpbGUgYWRkIGNvbW1hbmQgLWxhYmVsICJRdWl0IiAtY29tbWFuZCBkb3F1aXQKICAgIC5iYXIuZmlsZSBjb25maWd1cmUgLWZvbnQgJHVpZm9udAogICAgbWVudSAuYmFyLmVkaXQKICAgIC5iYXIgYWRkIGNhc2NhZGUgLWxhYmVsICJFZGl0IiAtbWVudSAuYmFyLmVkaXQKICAgIC5iYXIuZWRpdCBhZGQgY29tbWFuZCAtbGFiZWwgIlByZWZlcmVuY2VzIiAtY29tbWFuZCBkb3ByZWZzCiAgICAuYmFyLmVkaXQgY29uZmlndXJlIC1mb250ICR1aWZvbnQKCiAgICBtZW51IC5iYXIudmlldyAtZm9udCAkdWlmb250CiAgICAuYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCAiVmlldyIgLW1lbnUgLmJhci52aWV3CiAgICAuYmFyLnZpZXcgYWRkIGNvbW1hbmQgLWxhYmVsICJOZXcgdmlldy4uLiIgLWNvbW1hbmQge25ld3ZpZXcgMH0KICAgIC5iYXIudmlldyBhZGQgY29tbWFuZCAtbGFiZWwgIkVkaXQgdmlldy4uLiIgLWNvbW1hbmQgZWRpdHZpZXcgXAoJLXN0YXRlIGRpc2FibGVkCiAgICAuYmFyLnZpZXcgYWRkIGNvbW1hbmQgLWxhYmVsICJEZWxldGUgdmlldyIgLWNvbW1hbmQgZGVsdmlldyAtc3RhdGUgZGlzYWJsZWQKICAgIC5iYXIudmlldyBhZGQgc2VwYXJhdG9yCiAgICAuYmFyLnZpZXcgYWRkIHJhZGlvYnV0dG9uIC1sYWJlbCAiQWxsIGZpbGVzIiAtY29tbWFuZCB7c2hvd3ZpZXcgMH0gXAoJLXZhcmlhYmxlIHNlbGVjdGVkdmlldyAtdmFsdWUgMAogICAgCiAgICBtZW51IC5iYXIuaGVscAogICAgLmJhciBhZGQgY2FzY2FkZSAtbGFiZWwgIkhlbHAiIC1tZW51IC5iYXIuaGVscAogICAgLmJhci5oZWxwIGFkZCBjb21tYW5kIC1sYWJlbCAiQWJvdXQgZ2l0ayIgLWNvbW1hbmQgYWJvdXQKICAgIC5iYXIuaGVscCBhZGQgY29tbWFuZCAtbGFiZWwgIktleSBiaW5kaW5ncyIgLWNvbW1hbmQga2V5cwogICAgLmJhci5oZWxwIGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CiAgICAuIGNvbmZpZ3VyZSAtbWVudSAuYmFyCgogICAgaWYgeyFbaW5mbyBleGlzdHMgZ2VvbWV0cnkoY2FudjEpXX0gewoJc2V0IGdlb21ldHJ5KGNhbnYxKSBbZXhwciB7NDUgKiAkY2hhcnNwY31dCglzZXQgZ2VvbWV0cnkoY2FudjIpIFtleHByIHszMCAqICRjaGFyc3BjfV0KCXNldCBnZW9tZXRyeShjYW52MykgW2V4cHIgezE1ICogJGNoYXJzcGN9XQoJc2V0IGdlb21ldHJ5KGNhbnZoKSBbZXhwciB7MjUgKiAkbGluZXNwYyArIDR9XQoJc2V0IGdlb21ldHJ5KGN0ZXh0dykgODAKCXNldCBnZW9tZXRyeShjdGV4dGgpIDMwCglzZXQgZ2VvbWV0cnkoY2ZsaXN0dykgMzAKICAgIH0KICAgIHBhbmVkd2luZG93IC5jdG9wIC1vcmllbnQgdmVydGljYWwKICAgIGlmIHtbaW5mbyBleGlzdHMgZ2VvbWV0cnkod2lkdGgpXX0gewoJLmN0b3AgY29uZiAtd2lkdGggJGdlb21ldHJ5KHdpZHRoKSAtaGVpZ2h0ICRnZW9tZXRyeShoZWlnaHQpCglzZXQgdGV4dGggW2V4cHIgeyRnZW9tZXRyeShoZWlnaHQpIC0gJGdlb21ldHJ5KGNhbnZoKSAtIDU2fV0KCXNldCBnZW9tZXRyeShjdGV4dGgpIFtleHByIHsoJHRleHRoIC0gOCkgLwoJCQkJICAgIFtmb250IG1ldHJpY3MgJHRleHRmb250IC1saW5lc3BhY2VdfV0KICAgIH0KICAgIGZyYW1lIC5jdG9wLnRvcAogICAgZnJhbWUgLmN0b3AudG9wLmJhcgogICAgZnJhbWUgLmN0b3AudG9wLmxiYXIKICAgIHBhY2sgLmN0b3AudG9wLmxiYXIgLXNpZGUgYm90dG9tIC1maWxsIHgKICAgIHBhY2sgLmN0b3AudG9wLmJhciAtc2lkZSBib3R0b20gLWZpbGwgeAogICAgc2V0IGNzY3JvbGwgLmN0b3AudG9wLmNzYgogICAgc2Nyb2xsYmFyICRjc2Nyb2xsIC1jb21tYW5kIHthbGxjYW52cyB5dmlld30gLWhpZ2hsaWdodHRoaWNrbmVzcyAwCiAgICBwYWNrICRjc2Nyb2xsIC1zaWRlIHJpZ2h0IC1maWxsIHkKICAgIHBhbmVkd2luZG93IC5jdG9wLnRvcC5jbGlzdCAtb3JpZW50IGhvcml6b250YWwgLXNhc2hwYWQgMCAtaGFuZGxlc2l6ZSA0CiAgICBwYWNrIC5jdG9wLnRvcC5jbGlzdCAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEKICAgIC5jdG9wIGFkZCAuY3RvcC50b3AKICAgIHNldCBjYW52IC5jdG9wLnRvcC5jbGlzdC5jYW52CiAgICBjYW52YXMgJGNhbnYgLWhlaWdodCAkZ2VvbWV0cnkoY2FudmgpIC13aWR0aCAkZ2VvbWV0cnkoY2FudjEpIFwKCS1iYWNrZ3JvdW5kICRiZ2NvbG9yIC1iZCAwIFwKCS15c2Nyb2xsaW5jciAkbGluZXNwYyAteXNjcm9sbGNvbW1hbmQgInNjcm9sbGNhbnYgJGNzY3JvbGwiCiAgICAuY3RvcC50b3AuY2xpc3QgYWRkICRjYW52CiAgICBzZXQgY2FudjIgLmN0b3AudG9wLmNsaXN0LmNhbnYyCiAgICBjYW52YXMgJGNhbnYyIC1oZWlnaHQgJGdlb21ldHJ5KGNhbnZoKSAtd2lkdGggJGdlb21ldHJ5KGNhbnYyKSBcCgktYmFja2dyb3VuZCAkYmdjb2xvciAtYmQgMCAteXNjcm9sbGluY3IgJGxpbmVzcGMKICAgIC5jdG9wLnRvcC5jbGlzdCBhZGQgJGNhbnYyCiAgICBzZXQgY2FudjMgLmN0b3AudG9wLmNsaXN0LmNhbnYzCiAgICBjYW52YXMgJGNhbnYzIC1oZWlnaHQgJGdlb21ldHJ5KGNhbnZoKSAtd2lkdGggJGdlb21ldHJ5KGNhbnYzKSBcCgktYmFja2dyb3VuZCAkYmdjb2xvciAtYmQgMCAteXNjcm9sbGluY3IgJGxpbmVzcGMKICAgIC5jdG9wLnRvcC5jbGlzdCBhZGQgJGNhbnYzCiAgICBiaW5kIC5jdG9wLnRvcC5jbGlzdCA8Q29uZmlndXJlPiB7cmVzaXplY2xpc3RwYW5lcyAlVyAld30KICAgIGxhcHBlbmQgYmdsaXN0ICRjYW52ICRjYW52MiAkY2FudjMKCiAgICBzZXQgc2hhMWVudHJ5IC5jdG9wLnRvcC5iYXIuc2hhMQogICAgc2V0IGVudHJpZXMgJHNoYTFlbnRyeQogICAgc2V0IHNoYTFidXQgLmN0b3AudG9wLmJhci5zaGExbGFiZWwKICAgIGJ1dHRvbiAkc2hhMWJ1dCAtdGV4dCAiU0hBMSBJRDogIiAtc3RhdGUgZGlzYWJsZWQgLXJlbGllZiBmbGF0IFwKCS1jb21tYW5kIGdvdG9jb21taXQgLXdpZHRoIDggLWZvbnQgJHVpZm9udAogICAgJHNoYTFidXQgY29uZiAtZGlzYWJsZWRmb3JlZ3JvdW5kIFskc2hhMWJ1dCBjZ2V0IC1mb3JlZ3JvdW5kXQogICAgcGFjayAuY3RvcC50b3AuYmFyLnNoYTFsYWJlbCAtc2lkZSBsZWZ0CiAgICBlbnRyeSAkc2hhMWVudHJ5IC13aWR0aCA0MCAtZm9udCAkdGV4dGZvbnQgLXRleHR2YXJpYWJsZSBzaGExc3RyaW5nCiAgICB0cmFjZSBhZGQgdmFyaWFibGUgc2hhMXN0cmluZyB3cml0ZSBzaGExY2hhbmdlCiAgICBwYWNrICRzaGExZW50cnkgLXNpZGUgbGVmdCAtcGFkeSAyCgogICAgaW1hZ2UgY3JlYXRlIGJpdG1hcCBibS1sZWZ0IC1kYXRhIHsKCSNkZWZpbmUgbGVmdF93aWR0aCAxNgoJI2RlZmluZSBsZWZ0X2hlaWdodCAxNgoJc3RhdGljIHVuc2lnbmVkIGNoYXIgbGVmdF9iaXRzW10gPSB7CgkweDAwLCAweDAwLCAweGMwLCAweDAxLCAweGUwLCAweDAwLCAweDcwLCAweDAwLCAweDM4LCAweDAwLCAweDFjLCAweDAwLAoJMHgwZSwgMHgwMCwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHgwZSwgMHgwMCwgMHgxYywgMHgwMCwKCTB4MzgsIDB4MDAsIDB4NzAsIDB4MDAsIDB4ZTAsIDB4MDAsIDB4YzAsIDB4MDF9OwogICAgfQogICAgaW1hZ2UgY3JlYXRlIGJpdG1hcCBibS1yaWdodCAtZGF0YSB7CgkjZGVmaW5lIHJpZ2h0X3dpZHRoIDE2CgkjZGVmaW5lIHJpZ2h0X2hlaWdodCAxNgoJc3RhdGljIHVuc2lnbmVkIGNoYXIgcmlnaHRfYml0c1tdID0gewoJMHgwMCwgMHgwMCwgMHhjMCwgMHgwMSwgMHg4MCwgMHgwMywgMHgwMCwgMHgwNywgMHgwMCwgMHgwZSwgMHgwMCwgMHgxYywKCTB4MDAsIDB4MzgsIDB4ZmYsIDB4N2YsIDB4ZmYsIDB4N2YsIDB4ZmYsIDB4N2YsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MWMsCgkweDAwLCAweDBlLCAweDAwLCAweDA3LCAweDgwLCAweDAzLCAweGMwLCAweDAxfTsKICAgIH0KICAgIGJ1dHRvbiAuY3RvcC50b3AuYmFyLmxlZnRidXQgLWltYWdlIGJtLWxlZnQgLWNvbW1hbmQgZ29iYWNrIFwKCS1zdGF0ZSBkaXNhYmxlZCAtd2lkdGggMjYKICAgIHBhY2sgLmN0b3AudG9wLmJhci5sZWZ0YnV0IC1zaWRlIGxlZnQgLWZpbGwgeQogICAgYnV0dG9uIC5jdG9wLnRvcC5iYXIucmlnaHRidXQgLWltYWdlIGJtLXJpZ2h0IC1jb21tYW5kIGdvZm9ydyBcCgktc3RhdGUgZGlzYWJsZWQgLXdpZHRoIDI2CiAgICBwYWNrIC5jdG9wLnRvcC5iYXIucmlnaHRidXQgLXNpZGUgbGVmdCAtZmlsbCB5CgogICAgYnV0dG9uIC5jdG9wLnRvcC5iYXIuZmluZGJ1dCAtdGV4dCAiRmluZCIgLWNvbW1hbmQgZG9maW5kIC1mb250ICR1aWZvbnQKICAgIHBhY2sgLmN0b3AudG9wLmJhci5maW5kYnV0IC1zaWRlIGxlZnQKICAgIHNldCBmaW5kc3RyaW5nIHt9CiAgICBzZXQgZnN0cmluZyAuY3RvcC50b3AuYmFyLmZpbmRzdHJpbmcKICAgIGxhcHBlbmQgZW50cmllcyAkZnN0cmluZwogICAgZW50cnkgJGZzdHJpbmcgLXdpZHRoIDMwIC1mb250ICR0ZXh0Zm9udCAtdGV4dHZhcmlhYmxlIGZpbmRzdHJpbmcKICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBmaW5kc3RyaW5nIHdyaXRlIGZpbmRfY2hhbmdlCiAgICBwYWNrICRmc3RyaW5nIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHgKICAgIHNldCBmaW5kdHlwZSBFeGFjdAogICAgc2V0IGZpbmR0eXBlbWVudSBbdGtfb3B0aW9uTWVudSAuY3RvcC50b3AuYmFyLmZpbmR0eXBlIFwKCQkJICBmaW5kdHlwZSBFeGFjdCBJZ25DYXNlIFJlZ2V4cF0KICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBmaW5kdHlwZSB3cml0ZSBmaW5kX2NoYW5nZQogICAgLmN0b3AudG9wLmJhci5maW5kdHlwZSBjb25maWd1cmUgLWZvbnQgJHVpZm9udAogICAgLmN0b3AudG9wLmJhci5maW5kdHlwZS5tZW51IGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CiAgICBzZXQgZmluZGxvYyAiQWxsIGZpZWxkcyIKICAgIHRrX29wdGlvbk1lbnUgLmN0b3AudG9wLmJhci5maW5kbG9jIGZpbmRsb2MgIkFsbCBmaWVsZHMiIEhlYWRsaW5lIFwKCUNvbW1lbnRzIEF1dGhvciBDb21taXR0ZXIKICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBmaW5kbG9jIHdyaXRlIGZpbmRfY2hhbmdlCiAgICAuY3RvcC50b3AuYmFyLmZpbmRsb2MgY29uZmlndXJlIC1mb250ICR1aWZvbnQKICAgIC5jdG9wLnRvcC5iYXIuZmluZGxvYy5tZW51IGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CiAgICBwYWNrIC5jdG9wLnRvcC5iYXIuZmluZGxvYyAtc2lkZSByaWdodAogICAgcGFjayAuY3RvcC50b3AuYmFyLmZpbmR0eXBlIC1zaWRlIHJpZ2h0CgogICAgbGFiZWwgLmN0b3AudG9wLmxiYXIuZmxhYmVsIC10ZXh0ICJIaWdobGlnaHQ6ICBDb21taXRzICIgXAoJLWZvbnQgJHVpZm9udAogICAgcGFjayAuY3RvcC50b3AubGJhci5mbGFiZWwgLXNpZGUgbGVmdCAtZmlsbCB5CiAgICBzZXQgZ2R0dHlwZSAidG91Y2hpbmcgcGF0aHM6IgogICAgc2V0IGdtIFt0a19vcHRpb25NZW51IC5jdG9wLnRvcC5sYmFyLmdkdHR5cGUgZ2R0dHlwZSAidG91Y2hpbmcgcGF0aHM6IiBcCgkJImFkZGluZy9yZW1vdmluZyBzdHJpbmc6Il0KICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBnZHR0eXBlIHdyaXRlIGhmaWxlc19jaGFuZ2UKICAgICRnbSBjb25mIC1mb250ICR1aWZvbnQKICAgIC5jdG9wLnRvcC5sYmFyLmdkdHR5cGUgY29uZiAtZm9udCAkdWlmb250CiAgICBwYWNrIC5jdG9wLnRvcC5sYmFyLmdkdHR5cGUgLXNpZGUgbGVmdCAtZmlsbCB5CiAgICBlbnRyeSAuY3RvcC50b3AubGJhci5mZW50IC13aWR0aCAyNSAtZm9udCAkdGV4dGZvbnQgXAoJLXRleHR2YXJpYWJsZSBoaWdobGlnaHRfZmlsZXMKICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBoaWdobGlnaHRfZmlsZXMgd3JpdGUgaGZpbGVzX2NoYW5nZQogICAgbGFwcGVuZCBlbnRyaWVzIC5jdG9wLnRvcC5sYmFyLmZlbnQKICAgIHBhY2sgLmN0b3AudG9wLmxiYXIuZmVudCAtc2lkZSBsZWZ0IC1maWxsIHggLWV4cGFuZCAxCiAgICBsYWJlbCAuY3RvcC50b3AubGJhci52bGFiZWwgLXRleHQgIiBPUiBpbiB2aWV3IiAtZm9udCAkdWlmb250CiAgICBwYWNrIC5jdG9wLnRvcC5sYmFyLnZsYWJlbCAtc2lkZSBsZWZ0IC1maWxsIHkKICAgIGdsb2JhbCB2aWV3aGxtZW51IHNlbGVjdGVkaGx2aWV3CiAgICBzZXQgdmlld2hsbWVudSBbdGtfb3B0aW9uTWVudSAuY3RvcC50b3AubGJhci52aGwgc2VsZWN0ZWRobHZpZXcgTm9uZV0KICAgICR2aWV3aGxtZW51IGVudHJ5Y29uZiAwIC1jb21tYW5kIGRlbHZoaWdobGlnaHQKICAgICR2aWV3aGxtZW51IGNvbmYgLWZvbnQgJHVpZm9udAogICAgLmN0b3AudG9wLmxiYXIudmhsIGNvbmYgLWZvbnQgJHVpZm9udAogICAgcGFjayAuY3RvcC50b3AubGJhci52aGwgLXNpZGUgbGVmdCAtZmlsbCB5CiAgICBsYWJlbCAuY3RvcC50b3AubGJhci5ybGFiZWwgLXRleHQgIiBPUiAiIC1mb250ICR1aWZvbnQKICAgIHBhY2sgLmN0b3AudG9wLmxiYXIucmxhYmVsIC1zaWRlIGxlZnQgLWZpbGwgeQogICAgZ2xvYmFsIGhpZ2hsaWdodF9yZWxhdGVkCiAgICBzZXQgbSBbdGtfb3B0aW9uTWVudSAuY3RvcC50b3AubGJhci5yZWxtIGhpZ2hsaWdodF9yZWxhdGVkIE5vbmUgXAoJICAgICAgICJEZXNjZW5kZW50IiAiTm90IGRlc2NlbmRlbnQiICJBbmNlc3RvciIgIk5vdCBhbmNlc3RvciJdCiAgICAkbSBjb25mIC1mb250ICR1aWZvbnQKICAgIC5jdG9wLnRvcC5sYmFyLnJlbG0gY29uZiAtZm9udCAkdWlmb250CiAgICB0cmFjZSBhZGQgdmFyaWFibGUgaGlnaGxpZ2h0X3JlbGF0ZWQgd3JpdGUgdnJlbF9jaGFuZ2UKICAgIHBhY2sgLmN0b3AudG9wLmxiYXIucmVsbSAtc2lkZSBsZWZ0IC1maWxsIHkKCiAgICBwYW5lZHdpbmRvdyAuY3RvcC5jZGV0IC1vcmllbnQgaG9yaXpvbnRhbAogICAgLmN0b3AgYWRkIC5jdG9wLmNkZXQKICAgIGZyYW1lIC5jdG9wLmNkZXQubGVmdAogICAgZnJhbWUgLmN0b3AuY2RldC5sZWZ0LmJvdAogICAgcGFjayAuY3RvcC5jZGV0LmxlZnQuYm90IC1zaWRlIGJvdHRvbSAtZmlsbCB4CiAgICBidXR0b24gLmN0b3AuY2RldC5sZWZ0LmJvdC5zZWFyY2ggLXRleHQgIlNlYXJjaCIgLWNvbW1hbmQgZG9zZWFyY2ggXAoJLWZvbnQgJHVpZm9udAogICAgcGFjayAuY3RvcC5jZGV0LmxlZnQuYm90LnNlYXJjaCAtc2lkZSBsZWZ0IC1wYWR4IDUKICAgIHNldCBzc3RyaW5nIC5jdG9wLmNkZXQubGVmdC5ib3Quc3N0cmluZwogICAgZW50cnkgJHNzdHJpbmcgLXdpZHRoIDIwIC1mb250ICR0ZXh0Zm9udCAtdGV4dHZhcmlhYmxlIHNlYXJjaHN0cmluZwogICAgbGFwcGVuZCBlbnRyaWVzICRzc3RyaW5nCiAgICB0cmFjZSBhZGQgdmFyaWFibGUgc2VhcmNoc3RyaW5nIHdyaXRlIGluY3JzZWFyY2gKICAgIHBhY2sgJHNzdHJpbmcgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLWZpbGwgeAogICAgc2V0IGN0ZXh0IC5jdG9wLmNkZXQubGVmdC5jdGV4dAogICAgdGV4dCAkY3RleHQgLWJhY2tncm91bmQgJGJnY29sb3IgLWZvcmVncm91bmQgJGZnY29sb3IgXAoJLXN0YXRlIGRpc2FibGVkIC1mb250ICR0ZXh0Zm9udCBcCgktd2lkdGggJGdlb21ldHJ5KGN0ZXh0dykgLWhlaWdodCAkZ2VvbWV0cnkoY3RleHRoKSBcCgkteXNjcm9sbGNvbW1hbmQgc2Nyb2xsdGV4dCAtd3JhcCBub25lCiAgICBzY3JvbGxiYXIgLmN0b3AuY2RldC5sZWZ0LnNiIC1jb21tYW5kICIkY3RleHQgeXZpZXciCiAgICBwYWNrIC5jdG9wLmNkZXQubGVmdC5zYiAtc2lkZSByaWdodCAtZmlsbCB5CiAgICBwYWNrICRjdGV4dCAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCiAgICAuY3RvcC5jZGV0IGFkZCAuY3RvcC5jZGV0LmxlZnQKICAgIGxhcHBlbmQgYmdsaXN0ICRjdGV4dAogICAgbGFwcGVuZCBmZ2xpc3QgJGN0ZXh0CgogICAgJGN0ZXh0IHRhZyBjb25mIGNvbW1lbnQgLXdyYXAgJHdyYXBjb21tZW50CiAgICAkY3RleHQgdGFnIGNvbmYgZmlsZXNlcCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXSAtYmFjayAiI2FhYWFhYSIKICAgICRjdGV4dCB0YWcgY29uZiBodW5rc2VwIC1mb3JlIFtsaW5kZXggJGRpZmZjb2xvcnMgMl0KICAgICRjdGV4dCB0YWcgY29uZiBkMCAtZm9yZSBbbGluZGV4ICRkaWZmY29sb3JzIDBdCiAgICAkY3RleHQgdGFnIGNvbmYgZDEgLWZvcmUgW2xpbmRleCAkZGlmZmNvbG9ycyAxXQogICAgJGN0ZXh0IHRhZyBjb25mIG0wIC1mb3JlIHJlZAogICAgJGN0ZXh0IHRhZyBjb25mIG0xIC1mb3JlIGJsdWUKICAgICRjdGV4dCB0YWcgY29uZiBtMiAtZm9yZSBncmVlbgogICAgJGN0ZXh0IHRhZyBjb25mIG0zIC1mb3JlIHB1cnBsZQogICAgJGN0ZXh0IHRhZyBjb25mIG00IC1mb3JlIGJyb3duCiAgICAkY3RleHQgdGFnIGNvbmYgbTUgLWZvcmUgIiMwMDkwOTAiCiAgICAkY3RleHQgdGFnIGNvbmYgbTYgLWZvcmUgbWFnZW50YQogICAgJGN0ZXh0IHRhZyBjb25mIG03IC1mb3JlICIjODA4MDAwIgogICAgJGN0ZXh0IHRhZyBjb25mIG04IC1mb3JlICIjMDA5MDAwIgogICAgJGN0ZXh0IHRhZyBjb25mIG05IC1mb3JlICIjZmYwMDgwIgogICAgJGN0ZXh0IHRhZyBjb25mIG0xMCAtZm9yZSBjeWFuCiAgICAkY3RleHQgdGFnIGNvbmYgbTExIC1mb3JlICIjYjA3MDcwIgogICAgJGN0ZXh0IHRhZyBjb25mIG0xMiAtZm9yZSAiIzcwYjBmMCIKICAgICRjdGV4dCB0YWcgY29uZiBtMTMgLWZvcmUgIiM3MGYwYjAiCiAgICAkY3RleHQgdGFnIGNvbmYgbTE0IC1mb3JlICIjZjBiMDcwIgogICAgJGN0ZXh0IHRhZyBjb25mIG0xNSAtZm9yZSAiI2ZmNzBiMCIKICAgICRjdGV4dCB0YWcgY29uZiBtbWF4IC1mb3JlIGRhcmtncmV5CiAgICBzZXQgbWVyZ2VtYXggMTYKICAgICRjdGV4dCB0YWcgY29uZiBtcmVzdWx0IC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdCiAgICAkY3RleHQgdGFnIGNvbmYgbXNlcCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXQogICAgJGN0ZXh0IHRhZyBjb25mIGZvdW5kIC1iYWNrIHllbGxvdwoKICAgIGZyYW1lIC5jdG9wLmNkZXQucmlnaHQKICAgIGZyYW1lIC5jdG9wLmNkZXQucmlnaHQubW9kZQogICAgcmFkaW9idXR0b24gLmN0b3AuY2RldC5yaWdodC5tb2RlLnBhdGNoIC10ZXh0ICJQYXRjaCIgXAoJLWNvbW1hbmQgcmVzZWxlY3RsaW5lIC12YXJpYWJsZSBjbWl0bW9kZSAtdmFsdWUgInBhdGNoIgogICAgcmFkaW9idXR0b24gLmN0b3AuY2RldC5yaWdodC5tb2RlLnRyZWUgLXRleHQgIlRyZWUiIFwKCS1jb21tYW5kIHJlc2VsZWN0bGluZSAtdmFyaWFibGUgY21pdG1vZGUgLXZhbHVlICJ0cmVlIgogICAgZ3JpZCAuY3RvcC5jZGV0LnJpZ2h0Lm1vZGUucGF0Y2ggLmN0b3AuY2RldC5yaWdodC5tb2RlLnRyZWUgLXN0aWNreSBldwogICAgcGFjayAuY3RvcC5jZGV0LnJpZ2h0Lm1vZGUgLXNpZGUgdG9wIC1maWxsIHgKICAgIHNldCBjZmxpc3QgLmN0b3AuY2RldC5yaWdodC5jZmlsZXMKICAgIHNldCBpbmRlbnQgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgIm5uIl0KICAgIHRleHQgJGNmbGlzdCAtd2lkdGggJGdlb21ldHJ5KGNmbGlzdHcpIFwKCS1iYWNrZ3JvdW5kICRiZ2NvbG9yIC1mb3JlZ3JvdW5kICRmZ2NvbG9yIFwKCS1mb250ICRtYWluZm9udCBcCgktdGFicyBbbGlzdCAkaW5kZW50IFtleHByIHsyICogJGluZGVudH1dXSBcCgkteXNjcm9sbGNvbW1hbmQgIi5jdG9wLmNkZXQucmlnaHQuc2Igc2V0IiBcCgktY3Vyc29yIFsuIGNnZXQgLWN1cnNvcl0gXAoJLXNwYWNpbmcxIDEgLXNwYWNpbmczIDEKICAgIGxhcHBlbmQgYmdsaXN0ICRjZmxpc3QKICAgIGxhcHBlbmQgZmdsaXN0ICRjZmxpc3QKICAgIHNjcm9sbGJhciAuY3RvcC5jZGV0LnJpZ2h0LnNiIC1jb21tYW5kICIkY2ZsaXN0IHl2aWV3IgogICAgcGFjayAuY3RvcC5jZGV0LnJpZ2h0LnNiIC1zaWRlIHJpZ2h0IC1maWxsIHkKICAgIHBhY2sgJGNmbGlzdCAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCiAgICAkY2ZsaXN0IHRhZyBjb25maWd1cmUgaGlnaGxpZ2h0IFwKCS1iYWNrZ3JvdW5kIFskY2ZsaXN0IGNnZXQgLXNlbGVjdGJhY2tncm91bmRdCiAgICAkY2ZsaXN0IHRhZyBjb25maWd1cmUgYm9sZCAtZm9udCBbY29uY2F0ICRtYWluZm9udCBib2xkXQogICAgLmN0b3AuY2RldCBhZGQgLmN0b3AuY2RldC5yaWdodAogICAgYmluZCAuY3RvcC5jZGV0IDxDb25maWd1cmU+IHtyZXNpemVjZGV0cGFuZXMgJVcgJXd9CgogICAgcGFjayAuY3RvcCAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEKCiAgICBiaW5kYWxsIDwxPiB7c2VsY2FudmxpbmUgJVcgJXggJXl9CiAgICAjYmluZGFsbCA8QjEtTW90aW9uPiB7c2VsY2FudmxpbmUgJVcgJXggJXl9CiAgICBiaW5kYWxsIDxCdXR0b25SZWxlYXNlLTQ+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgLTUgdW5pdHMiCiAgICBiaW5kYWxsIDxCdXR0b25SZWxlYXNlLTU+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgNSB1bml0cyIKICAgIGJpbmRhbGwgPDI+ICJjYW52c2NhbiBtYXJrICVXICV4ICV5IgogICAgYmluZGFsbCA8QjItTW90aW9uPiAiY2FudnNjYW4gZHJhZ3RvICVXICV4ICV5IgogICAgYmluZGtleSA8SG9tZT4gc2VsZmlyc3RsaW5lCiAgICBiaW5ka2V5IDxFbmQ+IHNlbGxhc3RsaW5lCiAgICBiaW5kIC4gPEtleS1VcD4gInNlbG5leHRsaW5lIC0xIgogICAgYmluZCAuIDxLZXktRG93bj4gInNlbG5leHRsaW5lIDEiCiAgICBiaW5kIC4gPFNoaWZ0LUtleS1VcD4gIm5leHRfaGlnaGxpZ2h0IC0xIgogICAgYmluZCAuIDxTaGlmdC1LZXktRG93bj4gIm5leHRfaGlnaGxpZ2h0IDEiCiAgICBiaW5ka2V5IDxLZXktUmlnaHQ+ICJnb2ZvcnciCiAgICBiaW5ka2V5IDxLZXktTGVmdD4gImdvYmFjayIKICAgIGJpbmQgLiA8S2V5LVByaW9yPiAic2VsbmV4dHBhZ2UgLTEiCiAgICBiaW5kIC4gPEtleS1OZXh0PiAic2VsbmV4dHBhZ2UgMSIKICAgIGJpbmQgLiA8Q29udHJvbC1Ib21lPiAiYWxsY2FudnMgeXZpZXcgbW92ZXRvIDAuMCIKICAgIGJpbmQgLiA8Q29udHJvbC1FbmQ+ICJhbGxjYW52cyB5dmlldyBtb3ZldG8gMS4wIgogICAgYmluZCAuIDxDb250cm9sLUtleS1VcD4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAtMSB1bml0cyIKICAgIGJpbmQgLiA8Q29udHJvbC1LZXktRG93bj4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAxIHVuaXRzIgogICAgYmluZCAuIDxDb250cm9sLUtleS1Qcmlvcj4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKICAgIGJpbmQgLiA8Q29udHJvbC1LZXktTmV4dD4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAxIHBhZ2VzIgogICAgYmluZGtleSA8S2V5LURlbGV0ZT4gIiRjdGV4dCB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5ka2V5IDxLZXktQmFja1NwYWNlPiAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKICAgIGJpbmRrZXkgPEtleS1zcGFjZT4gIiRjdGV4dCB5dmlldyBzY3JvbGwgMSBwYWdlcyIKICAgIGJpbmRrZXkgcCAic2VsbmV4dGxpbmUgLTEiCiAgICBiaW5ka2V5IG4gInNlbG5leHRsaW5lIDEiCiAgICBiaW5ka2V5IHogImdvYmFjayIKICAgIGJpbmRrZXkgeCAiZ29mb3J3IgogICAgYmluZGtleSBpICJzZWxuZXh0bGluZSAtMSIKICAgIGJpbmRrZXkgayAic2VsbmV4dGxpbmUgMSIKICAgIGJpbmRrZXkgaiAiZ29iYWNrIgogICAgYmluZGtleSBsICJnb2ZvcnciCiAgICBiaW5ka2V5IGIgIiRjdGV4dCB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5ka2V5IGQgIiRjdGV4dCB5dmlldyBzY3JvbGwgMTggdW5pdHMiCiAgICBiaW5ka2V5IHUgIiRjdGV4dCB5dmlldyBzY3JvbGwgLTE4IHVuaXRzIgogICAgYmluZGtleSAvIHtmaW5kbmV4dCAxfQogICAgYmluZGtleSA8S2V5LVJldHVybj4ge2ZpbmRuZXh0IDB9CiAgICBiaW5ka2V5ID8gZmluZHByZXYKICAgIGJpbmRrZXkgZiBuZXh0ZmlsZQogICAgYmluZCAuIDxDb250cm9sLXE+IGRvcXVpdAogICAgYmluZCAuIDxDb250cm9sLWY+IGRvZmluZAogICAgYmluZCAuIDxDb250cm9sLWc+IHtmaW5kbmV4dCAwfQogICAgYmluZCAuIDxDb250cm9sLXI+IGRvc2VhcmNoYmFjawogICAgYmluZCAuIDxDb250cm9sLXM+IGRvc2VhcmNoCiAgICBiaW5kIC4gPENvbnRyb2wtZXF1YWw+IHtpbmNyZm9udCAxfQogICAgYmluZCAuIDxDb250cm9sLUtQX0FkZD4ge2luY3Jmb250IDF9CiAgICBiaW5kIC4gPENvbnRyb2wtbWludXM+IHtpbmNyZm9udCAtMX0KICAgIGJpbmQgLiA8Q29udHJvbC1LUF9TdWJ0cmFjdD4ge2luY3Jmb250IC0xfQogICAgYmluZCAuIDxEZXN0cm95PiB7c2F2ZXN0dWZmICVXfQogICAgYmluZCAuIDxCdXR0b24tMT4gImNsaWNrICVXIgogICAgYmluZCAkZnN0cmluZyA8S2V5LVJldHVybj4gZG9maW5kCiAgICBiaW5kICRzaGExZW50cnkgPEtleS1SZXR1cm4+IGdvdG9jb21taXQKICAgIGJpbmQgJHNoYTFlbnRyeSA8PFBhc3RlU2VsZWN0aW9uPj4gY2xlYXJzaGExCiAgICBiaW5kICRjZmxpc3QgPDE+IHtzZWxfZmxpc3QgJVcgJXggJXk7IGJyZWFrfQogICAgYmluZCAkY2ZsaXN0IDxCMS1Nb3Rpb24+IHtzZWxfZmxpc3QgJVcgJXggJXk7IGJyZWFrfQogICAgYmluZCAkY2ZsaXN0IDxCdXR0b25SZWxlYXNlLTE+IHt0cmVlY2xpY2sgJVcgJXggJXl9CgogICAgc2V0IG1haW5jdXJzb3IgWy4gY2dldCAtY3Vyc29yXQogICAgc2V0IHRleHRjdXJzb3IgWyRjdGV4dCBjZ2V0IC1jdXJzb3JdCiAgICBzZXQgY3VydGV4dGN1cnNvciAkdGV4dGN1cnNvcgoKICAgIHNldCByb3djdHhtZW51IC5yb3djdHhtZW51CiAgICBtZW51ICRyb3djdHhtZW51IC10ZWFyb2ZmIDAKICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiRGlmZiB0aGlzIC0+IHNlbGVjdGVkIiBcCgktY29tbWFuZCB7ZGlmZnZzc2VsIDB9CiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkRpZmYgc2VsZWN0ZWQgLT4gdGhpcyIgXAoJLWNvbW1hbmQge2RpZmZ2c3NlbCAxfQogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJNYWtlIHBhdGNoIiAtY29tbWFuZCBta3BhdGNoCiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkNyZWF0ZSB0YWciIC1jb21tYW5kIG1rdGFnCiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIldyaXRlIGNvbW1pdCB0byBmaWxlIiAtY29tbWFuZCB3cml0ZWNvbW1pdAogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJDcmVhdGUgbmV3IGJyYW5jaCIgLWNvbW1hbmQgbWticmFuY2gKICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiQ2hlcnJ5LXBpY2sgdGhpcyBjb21taXQiIFwKCS1jb21tYW5kIGNoZXJyeXBpY2sKCiAgICBzZXQgaGVhZGN0eG1lbnUgLmhlYWRjdHhtZW51CiAgICBtZW51ICRoZWFkY3R4bWVudSAtdGVhcm9mZiAwCiAgICAkaGVhZGN0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJDaGVjayBvdXQgdGhpcyBicmFuY2giIFwKCS1jb21tYW5kIGNvYnJhbmNoCiAgICAkaGVhZGN0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJSZW1vdmUgdGhpcyBicmFuY2giIFwKCS1jb21tYW5kIHJtYnJhbmNoCn0KCiMgbW91c2UtMiBtYWtlcyBhbGwgd2luZG93cyBzY2FuIHZlcnRpY2FsbHksIGJ1dCBvbmx5IHRoZSBvbmUKIyB0aGUgY3Vyc29yIGlzIGluIHNjYW5zIGhvcml6b250YWxseQpwcm9jIGNhbnZzY2FuIHtvcCB3IHggeX0gewogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMKICAgIGZvcmVhY2ggYyBbbGlzdCAkY2FudiAkY2FudjIgJGNhbnYzXSB7CglpZiB7JGMgPT0gJHd9IHsKCSAgICAkYyBzY2FuICRvcCAkeCAkeQoJfSBlbHNlIHsKCSAgICAkYyBzY2FuICRvcCAwICR5Cgl9CiAgICB9Cn0KCnByb2Mgc2Nyb2xsY2FudiB7Y3Njcm9sbCBmMCBmMX0gewogICAgJGNzY3JvbGwgc2V0ICRmMCAkZjEKICAgIGRyYXdmcmFjICRmMCAkZjEKICAgIGZsdXNoaGlnaGxpZ2h0cwp9CgojIHdoZW4gd2UgbWFrZSBhIGtleSBiaW5kaW5nIGZvciB0aGUgdG9wbGV2ZWwsIG1ha2Ugc3VyZQojIGl0IGRvZXNuJ3QgZ2V0IHRyaWdnZXJlZCB3aGVuIHRoYXQga2V5IGlzIHByZXNzZWQgaW4gdGhlCiMgZmluZCBzdHJpbmcgZW50cnkgd2lkZ2V0Lgpwcm9jIGJpbmRrZXkge2V2IHNjcmlwdH0gewogICAgZ2xvYmFsIGVudHJpZXMKICAgIGJpbmQgLiAkZXYgJHNjcmlwdAogICAgc2V0IGVzY3JpcHQgW2JpbmQgRW50cnkgJGV2XQogICAgaWYgeyRlc2NyaXB0ID09IHt9fSB7CglzZXQgZXNjcmlwdCBbYmluZCBFbnRyeSA8S2V5Pl0KICAgIH0KICAgIGZvcmVhY2ggZSAkZW50cmllcyB7CgliaW5kICRlICRldiAiJGVzY3JpcHQ7IGJyZWFrIgogICAgfQp9CgojIHNldCB0aGUgZm9jdXMgYmFjayB0byB0aGUgdG9wbGV2ZWwgZm9yIGFueSBjbGljayBvdXRzaWRlCiMgdGhlIGVudHJ5IHdpZGdldHMKcHJvYyBjbGljayB7d30gewogICAgZ2xvYmFsIGVudHJpZXMKICAgIGZvcmVhY2ggZSAkZW50cmllcyB7CglpZiB7JHcgPT0gJGV9IHJldHVybgogICAgfQogICAgZm9jdXMgLgp9Cgpwcm9jIHNhdmVzdHVmZiB7d30gewogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMgY3RleHQgY2ZsaXN0IG1haW5mb250IHRleHRmb250IHVpZm9udAogICAgZ2xvYmFsIHN0dWZmc2F2ZWQgZmluZG1lcmdlZmlsZXMgbWF4Z3JhcGhwY3QKICAgIGdsb2JhbCBtYXh3aWR0aCBzaG93bmVhcnRhZ3MKICAgIGdsb2JhbCB2aWV3bmFtZSB2aWV3ZmlsZXMgdmlld2FyZ3Mgdmlld3Blcm0gbmV4dHZpZXdudW0KICAgIGdsb2JhbCBjbWl0bW9kZSB3cmFwY29tbWVudAogICAgZ2xvYmFsIGNvbG9ycyBiZ2NvbG9yIGZnY29sb3IgZGlmZmNvbG9ycwoKICAgIGlmIHskc3R1ZmZzYXZlZH0gcmV0dXJuCiAgICBpZiB7IVt3aW5mbyB2aWV3YWJsZSAuXX0gcmV0dXJuCiAgICBjYXRjaCB7CglzZXQgZiBbb3BlbiAifi8uZ2l0ay1uZXciIHddCglwdXRzICRmIFtsaXN0IHNldCBtYWluZm9udCAkbWFpbmZvbnRdCglwdXRzICRmIFtsaXN0IHNldCB0ZXh0Zm9udCAkdGV4dGZvbnRdCglwdXRzICRmIFtsaXN0IHNldCB1aWZvbnQgJHVpZm9udF0KCXB1dHMgJGYgW2xpc3Qgc2V0IGZpbmRtZXJnZWZpbGVzICRmaW5kbWVyZ2VmaWxlc10KCXB1dHMgJGYgW2xpc3Qgc2V0IG1heGdyYXBocGN0ICRtYXhncmFwaHBjdF0KCXB1dHMgJGYgW2xpc3Qgc2V0IG1heHdpZHRoICRtYXh3aWR0aF0KCXB1dHMgJGYgW2xpc3Qgc2V0IGNtaXRtb2RlICRjbWl0bW9kZV0KCXB1dHMgJGYgW2xpc3Qgc2V0IHdyYXBjb21tZW50ICR3cmFwY29tbWVudF0KCXB1dHMgJGYgW2xpc3Qgc2V0IHNob3duZWFydGFncyAkc2hvd25lYXJ0YWdzXQoJcHV0cyAkZiBbbGlzdCBzZXQgYmdjb2xvciAkYmdjb2xvcl0KCXB1dHMgJGYgW2xpc3Qgc2V0IGZnY29sb3IgJGZnY29sb3JdCglwdXRzICRmIFtsaXN0IHNldCBjb2xvcnMgJGNvbG9yc10KCXB1dHMgJGYgW2xpc3Qgc2V0IGRpZmZjb2xvcnMgJGRpZmZjb2xvcnNdCglwdXRzICRmICJzZXQgZ2VvbWV0cnkod2lkdGgpIFt3aW5mbyB3aWR0aCAuY3RvcF0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoaGVpZ2h0KSBbd2luZm8gaGVpZ2h0IC5jdG9wXSIKCXB1dHMgJGYgInNldCBnZW9tZXRyeShjYW52MSkgW2V4cHIge1t3aW5mbyB3aWR0aCAkY2Fudl0tMn1dIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGNhbnYyKSBbZXhwciB7W3dpbmZvIHdpZHRoICRjYW52Ml0tMn1dIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGNhbnYzKSBbZXhwciB7W3dpbmZvIHdpZHRoICRjYW52M10tMn1dIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGNhbnZoKSBbZXhwciB7W3dpbmZvIGhlaWdodCAkY2Fudl0tMn1dIgoJc2V0IHdpZCBbZXhwciB7KFt3aW5mbyB3aWR0aCAkY3RleHRdIC0gOCkgXAoJCQkgICAvIFtmb250IG1lYXN1cmUgJHRleHRmb250ICIwIl19XQoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGN0ZXh0dykgJHdpZCIKCXNldCB3aWQgW2V4cHIgeyhbd2luZm8gd2lkdGggJGNmbGlzdF0gLSAxMSkgXAoJCQkgICAvIFtmb250IG1lYXN1cmUgWyRjZmxpc3QgY2dldCAtZm9udF0gIjAiXX1dCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2ZsaXN0dykgJHdpZCIKCXB1dHMgLW5vbmV3bGluZSAkZiAic2V0IHBlcm12aWV3cyB7IgoJZm9yIHtzZXQgdiAwfSB7JHYgPCAkbmV4dHZpZXdudW19IHtpbmNyIHZ9IHsKCSAgICBpZiB7JHZpZXdwZXJtKCR2KX0gewoJCXB1dHMgJGYgIntbbGlzdCAkdmlld25hbWUoJHYpICR2aWV3ZmlsZXMoJHYpICR2aWV3YXJncygkdildfSIKCSAgICB9Cgl9CglwdXRzICRmICJ9IgoJY2xvc2UgJGYKCWZpbGUgcmVuYW1lIC1mb3JjZSAifi8uZ2l0ay1uZXciICJ+Ly5naXRrIgogICAgfQogICAgc2V0IHN0dWZmc2F2ZWQgMQp9Cgpwcm9jIHJlc2l6ZWNsaXN0cGFuZXMge3dpbiB3fSB7CiAgICBnbG9iYWwgb2xkd2lkdGgKICAgIGlmIHtbaW5mbyBleGlzdHMgb2xkd2lkdGgoJHdpbildfSB7CglzZXQgczAgWyR3aW4gc2FzaCBjb29yZCAwXQoJc2V0IHMxIFskd2luIHNhc2ggY29vcmQgMV0KCWlmIHskdyA8IDYwfSB7CgkgICAgc2V0IHNhc2gwIFtleHByIHtpbnQoJHcvMiAtIDIpfV0KCSAgICBzZXQgc2FzaDEgW2V4cHIge2ludCgkdyo1LzYgLSAyKX1dCgl9IGVsc2UgewoJICAgIHNldCBmYWN0b3IgW2V4cHIgezEuMCAqICR3IC8gJG9sZHdpZHRoKCR3aW4pfV0KCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkZmFjdG9yICogW2xpbmRleCAkczAgMF0pfV0KCSAgICBzZXQgc2FzaDEgW2V4cHIge2ludCgkZmFjdG9yICogW2xpbmRleCAkczEgMF0pfV0KCSAgICBpZiB7JHNhc2gwIDwgMzB9IHsKCQlzZXQgc2FzaDAgMzAKCSAgICB9CgkgICAgaWYgeyRzYXNoMSA8ICRzYXNoMCArIDIwfSB7CgkJc2V0IHNhc2gxIFtleHByIHskc2FzaDAgKyAyMH1dCgkgICAgfQoJICAgIGlmIHskc2FzaDEgPiAkdyAtIDEwfSB7CgkJc2V0IHNhc2gxIFtleHByIHskdyAtIDEwfV0KCQlpZiB7JHNhc2gwID4gJHNhc2gxIC0gMjB9IHsKCQkgICAgc2V0IHNhc2gwIFtleHByIHskc2FzaDEgLSAyMH1dCgkJfQoJICAgIH0KCX0KCSR3aW4gc2FzaCBwbGFjZSAwICRzYXNoMCBbbGluZGV4ICRzMCAxXQoJJHdpbiBzYXNoIHBsYWNlIDEgJHNhc2gxIFtsaW5kZXggJHMxIDFdCiAgICB9CiAgICBzZXQgb2xkd2lkdGgoJHdpbikgJHcKfQoKcHJvYyByZXNpemVjZGV0cGFuZXMge3dpbiB3fSB7CiAgICBnbG9iYWwgb2xkd2lkdGgKICAgIGlmIHtbaW5mbyBleGlzdHMgb2xkd2lkdGgoJHdpbildfSB7CglzZXQgczAgWyR3aW4gc2FzaCBjb29yZCAwXQoJaWYgeyR3IDwgNjB9IHsKCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkdyozLzQgLSAyKX1dCgl9IGVsc2UgewoJICAgIHNldCBmYWN0b3IgW2V4cHIgezEuMCAqICR3IC8gJG9sZHdpZHRoKCR3aW4pfV0KCSAgICBzZXQgc2FzaDAgW2V4cHIge2ludCgkZmFjdG9yICogW2xpbmRleCAkczAgMF0pfV0KCSAgICBpZiB7JHNhc2gwIDwgNDV9IHsKCQlzZXQgc2FzaDAgNDUKCSAgICB9CgkgICAgaWYgeyRzYXNoMCA+ICR3IC0gMTV9IHsKCQlzZXQgc2FzaDAgW2V4cHIgeyR3IC0gMTV9XQoJICAgIH0KCX0KCSR3aW4gc2FzaCBwbGFjZSAwICRzYXNoMCBbbGluZGV4ICRzMCAxXQogICAgfQogICAgc2V0IG9sZHdpZHRoKCR3aW4pICR3Cn0KCnByb2MgYWxsY2FudnMgYXJncyB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MwogICAgZXZhbCAkY2FudiAkYXJncwogICAgZXZhbCAkY2FudjIgJGFyZ3MKICAgIGV2YWwgJGNhbnYzICRhcmdzCn0KCnByb2MgYmluZGFsbCB7ZXZlbnQgYWN0aW9ufSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MwogICAgYmluZCAkY2FudiAkZXZlbnQgJGFjdGlvbgogICAgYmluZCAkY2FudjIgJGV2ZW50ICRhY3Rpb24KICAgIGJpbmQgJGNhbnYzICRldmVudCAkYWN0aW9uCn0KCnByb2MgYWJvdXQge30gewogICAgc2V0IHcgLmFib3V0CiAgICBpZiB7W3dpbmZvIGV4aXN0cyAkd119IHsKCXJhaXNlICR3CglyZXR1cm4KICAgIH0KICAgIHRvcGxldmVsICR3CiAgICB3bSB0aXRsZSAkdyAiQWJvdXQgZ2l0ayIKICAgIG1lc3NhZ2UgJHcubSAtdGV4dCB7CkdpdGsgLSBhIGNvbW1pdCB2aWV3ZXIgZm9yIGdpdAoKQ29weXJpZ2h0IKkgMjAwNS0yMDA2IFBhdWwgTWFja2VycmFzCgpVc2UgYW5kIHJlZGlzdHJpYnV0ZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlfSBcCgkgICAgLWp1c3RpZnkgY2VudGVyIC1hc3BlY3QgNDAwCiAgICBwYWNrICR3Lm0gLXNpZGUgdG9wIC1maWxsIHggLXBhZHggMjAgLXBhZHkgMjAKICAgIGJ1dHRvbiAkdy5vayAtdGV4dCBDbG9zZSAtY29tbWFuZCAiZGVzdHJveSAkdyIKICAgIHBhY2sgJHcub2sgLXNpZGUgYm90dG9tCn0KCnByb2Mga2V5cyB7fSB7CiAgICBzZXQgdyAua2V5cwogICAgaWYge1t3aW5mbyBleGlzdHMgJHddfSB7CglyYWlzZSAkdwoJcmV0dXJuCiAgICB9CiAgICB0b3BsZXZlbCAkdwogICAgd20gdGl0bGUgJHcgIkdpdGsga2V5IGJpbmRpbmdzIgogICAgbWVzc2FnZSAkdy5tIC10ZXh0IHsKR2l0ayBrZXkgYmluZGluZ3M6Cgo8Q3RybC1RPgkJUXVpdAo8SG9tZT4JCU1vdmUgdG8gZmlyc3QgY29tbWl0CjxFbmQ+CQlNb3ZlIHRvIGxhc3QgY29tbWl0CjxVcD4sIHAsIGkJTW92ZSB1cCBvbmUgY29tbWl0CjxEb3duPiwgbiwgawlNb3ZlIGRvd24gb25lIGNvbW1pdAo8TGVmdD4sIHosIGoJR28gYmFjayBpbiBoaXN0b3J5IGxpc3QKPFJpZ2h0PiwgeCwgbAlHbyBmb3J3YXJkIGluIGhpc3RvcnkgbGlzdAo8UGFnZVVwPglNb3ZlIHVwIG9uZSBwYWdlIGluIGNvbW1pdCBsaXN0CjxQYWdlRG93bj4JTW92ZSBkb3duIG9uZSBwYWdlIGluIGNvbW1pdCBsaXN0CjxDdHJsLUhvbWU+CVNjcm9sbCB0byB0b3Agb2YgY29tbWl0IGxpc3QKPEN0cmwtRW5kPglTY3JvbGwgdG8gYm90dG9tIG9mIGNvbW1pdCBsaXN0CjxDdHJsLVVwPglTY3JvbGwgY29tbWl0IGxpc3QgdXAgb25lIGxpbmUKPEN0cmwtRG93bj4JU2Nyb2xsIGNvbW1pdCBsaXN0IGRvd24gb25lIGxpbmUKPEN0cmwtUGFnZVVwPglTY3JvbGwgY29tbWl0IGxpc3QgdXAgb25lIHBhZ2UKPEN0cmwtUGFnZURvd24+CVNjcm9sbCBjb21taXQgbGlzdCBkb3duIG9uZSBwYWdlCjxTaGlmdC1VcD4JTW92ZSB0byBwcmV2aW91cyBoaWdobGlnaHRlZCBsaW5lCjxTaGlmdC1Eb3duPglNb3ZlIHRvIG5leHQgaGlnaGxpZ2h0ZWQgbGluZQo8RGVsZXRlPiwgYglTY3JvbGwgZGlmZiB2aWV3IHVwIG9uZSBwYWdlCjxCYWNrc3BhY2U+CVNjcm9sbCBkaWZmIHZpZXcgdXAgb25lIHBhZ2UKPFNwYWNlPgkJU2Nyb2xsIGRpZmYgdmlldyBkb3duIG9uZSBwYWdlCnUJCVNjcm9sbCBkaWZmIHZpZXcgdXAgMTggbGluZXMKZAkJU2Nyb2xsIGRpZmYgdmlldyBkb3duIDE4IGxpbmVzCjxDdHJsLUY+CQlGaW5kCjxDdHJsLUc+CQlNb3ZlIHRvIG5leHQgZmluZCBoaXQKPFJldHVybj4JTW92ZSB0byBuZXh0IGZpbmQgaGl0Ci8JCU1vdmUgdG8gbmV4dCBmaW5kIGhpdCwgb3IgcmVkbyBmaW5kCj8JCU1vdmUgdG8gcHJldmlvdXMgZmluZCBoaXQKZgkJU2Nyb2xsIGRpZmYgdmlldyB0byBuZXh0IGZpbGUKPEN0cmwtUz4JCVNlYXJjaCBmb3IgbmV4dCBoaXQgaW4gZGlmZiB2aWV3CjxDdHJsLVI+CQlTZWFyY2ggZm9yIHByZXZpb3VzIGhpdCBpbiBkaWZmIHZpZXcKPEN0cmwtS1ArPglJbmNyZWFzZSBmb250IHNpemUKPEN0cmwtcGx1cz4JSW5jcmVhc2UgZm9udCBzaXplCjxDdHJsLUtQLT4JRGVjcmVhc2UgZm9udCBzaXplCjxDdHJsLW1pbnVzPglEZWNyZWFzZSBmb250IHNpemUKfSBcCgkgICAgLWp1c3RpZnkgbGVmdCAtYmcgd2hpdGUgLWJvcmRlciAyIC1yZWxpZWYgc3Vua2VuCiAgICBwYWNrICR3Lm0gLXNpZGUgdG9wIC1maWxsIGJvdGgKICAgIGJ1dHRvbiAkdy5vayAtdGV4dCBDbG9zZSAtY29tbWFuZCAiZGVzdHJveSAkdyIKICAgIHBhY2sgJHcub2sgLXNpZGUgYm90dG9tCn0KCiMgUHJvY2VkdXJlcyBmb3IgbWFuaXB1bGF0aW5nIHRoZSBmaWxlIGxpc3Qgd2luZG93IGF0IHRoZQojIGJvdHRvbSByaWdodCBvZiB0aGUgb3ZlcmFsbCB3aW5kb3cuCgpwcm9jIHRyZWV2aWV3IHt3IGwgb3BlbmxldnN9IHsKICAgIGdsb2JhbCB0cmVlY29udGVudHMgdHJlZWRpcm9wZW4gdHJlZWhlaWdodCB0cmVlcGFyZW50IHRyZWVpbmRleAoKICAgIHNldCBpeCAwCiAgICBzZXQgdHJlZWluZGV4KCkgMAogICAgc2V0IGxldiAwCiAgICBzZXQgcHJlZml4IHt9CiAgICBzZXQgcHJlZml4ZW5kIC0xCiAgICBzZXQgcHJlZmVuZHN0YWNrIHt9CiAgICBzZXQgaHRzdGFjayB7fQogICAgc2V0IGh0IDAKICAgIHNldCB0cmVlY29udGVudHMoKSB7fQogICAgJHcgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBmb3JlYWNoIGYgJGwgewoJd2hpbGUge1tzdHJpbmcgcmFuZ2UgJGYgMCAkcHJlZml4ZW5kXSBuZSAkcHJlZml4fSB7CgkgICAgaWYgeyRsZXYgPD0gJG9wZW5sZXZzfSB7CgkJJHcgbWFyayBzZXQgZTokdHJlZWluZGV4KCRwcmVmaXgpICJlbmQgLTFjIgoJCSR3IG1hcmsgZ3Jhdml0eSBlOiR0cmVlaW5kZXgoJHByZWZpeCkgbGVmdAoJICAgIH0KCSAgICBzZXQgdHJlZWhlaWdodCgkcHJlZml4KSAkaHQKCSAgICBpbmNyIGh0IFtsaW5kZXggJGh0c3RhY2sgZW5kXQoJICAgIHNldCBodHN0YWNrIFtscmVwbGFjZSAkaHRzdGFjayBlbmQgZW5kXQoJICAgIHNldCBwcmVmaXhlbmQgW2xpbmRleCAkcHJlZmVuZHN0YWNrIGVuZF0KCSAgICBzZXQgcHJlZmVuZHN0YWNrIFtscmVwbGFjZSAkcHJlZmVuZHN0YWNrIGVuZCBlbmRdCgkgICAgc2V0IHByZWZpeCBbc3RyaW5nIHJhbmdlICRwcmVmaXggMCAkcHJlZml4ZW5kXQoJICAgIGluY3IgbGV2IC0xCgl9CglzZXQgdGFpbCBbc3RyaW5nIHJhbmdlICRmIFtleHByIHskcHJlZml4ZW5kKzF9XSBlbmRdCgl3aGlsZSB7W3NldCBzbGFzaCBbc3RyaW5nIGZpcnN0ICIvIiAkdGFpbF1dID49IDB9IHsKCSAgICBsYXBwZW5kIGh0c3RhY2sgJGh0CgkgICAgc2V0IGh0IDAKCSAgICBsYXBwZW5kIHByZWZlbmRzdGFjayAkcHJlZml4ZW5kCgkgICAgaW5jciBwcmVmaXhlbmQgW2V4cHIgeyRzbGFzaCArIDF9XQoJICAgIHNldCBkIFtzdHJpbmcgcmFuZ2UgJHRhaWwgMCAkc2xhc2hdCgkgICAgbGFwcGVuZCB0cmVlY29udGVudHMoJHByZWZpeCkgJGQKCSAgICBzZXQgb2xkcHJlZml4ICRwcmVmaXgKCSAgICBhcHBlbmQgcHJlZml4ICRkCgkgICAgc2V0IHRyZWVjb250ZW50cygkcHJlZml4KSB7fQoJICAgIHNldCB0cmVlaW5kZXgoJHByZWZpeCkgW2luY3IgaXhdCgkgICAgc2V0IHRyZWVwYXJlbnQoJHByZWZpeCkgJG9sZHByZWZpeAoJICAgIHNldCB0YWlsIFtzdHJpbmcgcmFuZ2UgJHRhaWwgW2V4cHIgeyRzbGFzaCsxfV0gZW5kXQoJICAgIGlmIHskbGV2IDw9ICRvcGVubGV2c30gewoJCXNldCBodCAxCgkJc2V0IHRyZWVkaXJvcGVuKCRwcmVmaXgpIFtleHByIHskbGV2IDwgJG9wZW5sZXZzfV0KCQlzZXQgYm0gW2V4cHIgeyRsZXYgPT0gJG9wZW5sZXZzPyAidHJpLXJ0IjogInRyaS1kbiJ9XQoJCSR3IG1hcmsgc2V0IGQ6JGl4ICJlbmQgLTFjIgoJCSR3IG1hcmsgZ3Jhdml0eSBkOiRpeCBsZWZ0CgkJc2V0IHN0ciAiXG4iCgkJZm9yIHtzZXQgaSAwfSB7JGkgPCAkbGV2fSB7aW5jciBpfSB7YXBwZW5kIHN0ciAiXHQifQoJCSR3IGluc2VydCBlbmQgJHN0cgoJCSR3IGltYWdlIGNyZWF0ZSBlbmQgLWFsaWduIGNlbnRlciAtaW1hZ2UgJGJtIC1wYWR4IDEgXAoJCSAgICAtbmFtZSBhOiRpeAoJCSR3IGluc2VydCBlbmQgJGQgW2hpZ2hsaWdodF90YWcgJHByZWZpeF0KCQkkdyBtYXJrIHNldCBzOiRpeCAiZW5kIC0xYyIKCQkkdyBtYXJrIGdyYXZpdHkgczokaXggbGVmdAoJICAgIH0KCSAgICBpbmNyIGxldgoJfQoJaWYgeyR0YWlsIG5lIHt9fSB7CgkgICAgaWYgeyRsZXYgPD0gJG9wZW5sZXZzfSB7CgkJaW5jciBodAoJCXNldCBzdHIgIlxuIgoJCWZvciB7c2V0IGkgMH0geyRpIDwgJGxldn0ge2luY3IgaX0ge2FwcGVuZCBzdHIgIlx0In0KCQkkdyBpbnNlcnQgZW5kICRzdHIKCQkkdyBpbnNlcnQgZW5kICR0YWlsIFtoaWdobGlnaHRfdGFnICRmXQoJICAgIH0KCSAgICBsYXBwZW5kIHRyZWVjb250ZW50cygkcHJlZml4KSAkdGFpbAoJfQogICAgfQogICAgd2hpbGUgeyRodHN0YWNrIG5lIHt9fSB7CglzZXQgdHJlZWhlaWdodCgkcHJlZml4KSAkaHQKCWluY3IgaHQgW2xpbmRleCAkaHRzdGFjayBlbmRdCglzZXQgaHRzdGFjayBbbHJlcGxhY2UgJGh0c3RhY2sgZW5kIGVuZF0KICAgIH0KICAgICR3IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2MgbGluZXRvZWx0IHtsfSB7CiAgICBnbG9iYWwgdHJlZWhlaWdodCB0cmVlY29udGVudHMKCiAgICBzZXQgeSAyCiAgICBzZXQgcHJlZml4IHt9CiAgICB3aGlsZSB7MX0gewoJZm9yZWFjaCBlICR0cmVlY29udGVudHMoJHByZWZpeCkgewoJICAgIGlmIHskeSA9PSAkbH0gewoJCXJldHVybiAiJHByZWZpeCRlIgoJICAgIH0KCSAgICBzZXQgbiAxCgkgICAgaWYge1tzdHJpbmcgaW5kZXggJGUgZW5kXSBlcSAiLyJ9IHsKCQlzZXQgbiAkdHJlZWhlaWdodCgkcHJlZml4JGUpCgkJaWYgeyR5ICsgJG4gPiAkbH0gewoJCSAgICBhcHBlbmQgcHJlZml4ICRlCgkJICAgIGluY3IgeQoJCSAgICBicmVhawoJCX0KCSAgICB9CgkgICAgaW5jciB5ICRuCgl9CiAgICB9Cn0KCnByb2MgaGlnaGxpZ2h0X3RyZWUge3kgcHJlZml4fSB7CiAgICBnbG9iYWwgdHJlZWhlaWdodCB0cmVlY29udGVudHMgY2ZsaXN0CgogICAgZm9yZWFjaCBlICR0cmVlY29udGVudHMoJHByZWZpeCkgewoJc2V0IHBhdGggJHByZWZpeCRlCglpZiB7W2hpZ2hsaWdodF90YWcgJHBhdGhdIG5lIHt9fSB7CgkgICAgJGNmbGlzdCB0YWcgYWRkIGJvbGQgJHkuMCAiJHkuMCBsaW5lZW5kIgoJfQoJaW5jciB5CglpZiB7W3N0cmluZyBpbmRleCAkZSBlbmRdIGVxICIvIiAmJiAkdHJlZWhlaWdodCgkcGF0aCkgPiAxfSB7CgkgICAgc2V0IHkgW2hpZ2hsaWdodF90cmVlICR5ICRwYXRoXQoJfQogICAgfQogICAgcmV0dXJuICR5Cn0KCnByb2MgdHJlZWNsb3NlZGlyIHt3IGRpcn0gewogICAgZ2xvYmFsIHRyZWVkaXJvcGVuIHRyZWVoZWlnaHQgdHJlZXBhcmVudCB0cmVlaW5kZXgKCiAgICBzZXQgaXggJHRyZWVpbmRleCgkZGlyKQogICAgJHcgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkdyBkZWxldGUgczokaXggZTokaXgKICAgIHNldCB0cmVlZGlyb3BlbigkZGlyKSAwCiAgICAkdyBpbWFnZSBjb25maWd1cmUgYTokaXggLWltYWdlIHRyaS1ydAogICAgJHcgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIHNldCBuIFtleHByIHsxIC0gJHRyZWVoZWlnaHQoJGRpcil9XQogICAgd2hpbGUgeyRkaXIgbmUge319IHsKCWluY3IgdHJlZWhlaWdodCgkZGlyKSAkbgoJc2V0IGRpciAkdHJlZXBhcmVudCgkZGlyKQogICAgfQp9Cgpwcm9jIHRyZWVvcGVuZGlyIHt3IGRpcn0gewogICAgZ2xvYmFsIHRyZWVkaXJvcGVuIHRyZWVoZWlnaHQgdHJlZXBhcmVudCB0cmVlY29udGVudHMgdHJlZWluZGV4CgogICAgc2V0IGl4ICR0cmVlaW5kZXgoJGRpcikKICAgICR3IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJHcgaW1hZ2UgY29uZmlndXJlIGE6JGl4IC1pbWFnZSB0cmktZG4KICAgICR3IG1hcmsgc2V0IGU6JGl4IHM6JGl4CiAgICAkdyBtYXJrIGdyYXZpdHkgZTokaXggcmlnaHQKICAgIHNldCBsZXYgMAogICAgc2V0IHN0ciAiXG4iCiAgICBzZXQgbiBbbGxlbmd0aCAkdHJlZWNvbnRlbnRzKCRkaXIpXQogICAgZm9yIHtzZXQgeCAkZGlyfSB7JHggbmUge319IHtzZXQgeCAkdHJlZXBhcmVudCgkeCl9IHsKCWluY3IgbGV2CglhcHBlbmQgc3RyICJcdCIKCWluY3IgdHJlZWhlaWdodCgkeCkgJG4KICAgIH0KICAgIGZvcmVhY2ggZSAkdHJlZWNvbnRlbnRzKCRkaXIpIHsKCXNldCBkZSAkZGlyJGUKCWlmIHtbc3RyaW5nIGluZGV4ICRlIGVuZF0gZXEgIi8ifSB7CgkgICAgc2V0IGl5ICR0cmVlaW5kZXgoJGRlKQoJICAgICR3IG1hcmsgc2V0IGQ6JGl5IGU6JGl4CgkgICAgJHcgbWFyayBncmF2aXR5IGQ6JGl5IGxlZnQKCSAgICAkdyBpbnNlcnQgZTokaXggJHN0cgoJICAgIHNldCB0cmVlZGlyb3BlbigkZGUpIDAKCSAgICAkdyBpbWFnZSBjcmVhdGUgZTokaXggLWFsaWduIGNlbnRlciAtaW1hZ2UgdHJpLXJ0IC1wYWR4IDEgXAoJCS1uYW1lIGE6JGl5CgkgICAgJHcgaW5zZXJ0IGU6JGl4ICRlIFtoaWdobGlnaHRfdGFnICRkZV0KCSAgICAkdyBtYXJrIHNldCBzOiRpeSBlOiRpeAoJICAgICR3IG1hcmsgZ3Jhdml0eSBzOiRpeSBsZWZ0CgkgICAgc2V0IHRyZWVoZWlnaHQoJGRlKSAxCgl9IGVsc2UgewoJICAgICR3IGluc2VydCBlOiRpeCAkc3RyCgkgICAgJHcgaW5zZXJ0IGU6JGl4ICRlIFtoaWdobGlnaHRfdGFnICRkZV0KCX0KICAgIH0KICAgICR3IG1hcmsgZ3Jhdml0eSBlOiRpeCBsZWZ0CiAgICAkdyBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgc2V0IHRyZWVkaXJvcGVuKCRkaXIpIDEKICAgIHNldCB0b3AgW2xpbmRleCBbc3BsaXQgWyR3IGluZGV4IEAwLDBdIC5dIDBdCiAgICBzZXQgaHQgWyR3IGNnZXQgLWhlaWdodF0KICAgIHNldCBsIFtsaW5kZXggW3NwbGl0IFskdyBpbmRleCBzOiRpeF0gLl0gMF0KICAgIGlmIHskbCA8ICR0b3B9IHsKCSR3IHl2aWV3ICRsLjAKICAgIH0gZWxzZWlmIHskbCArICRuICsgMSA+ICR0b3AgKyAkaHR9IHsKCXNldCB0b3AgW2V4cHIgeyRsICsgJG4gKyAyIC0gJGh0fV0KCWlmIHskbCA8ICR0b3B9IHsKCSAgICBzZXQgdG9wICRsCgl9CgkkdyB5dmlldyAkdG9wLjAKICAgIH0KfQoKcHJvYyB0cmVlY2xpY2sge3cgeCB5fSB7CiAgICBnbG9iYWwgdHJlZWRpcm9wZW4gY21pdG1vZGUgY3RleHQgY2ZsaXN0IGNmbGlzdF90b3AKCiAgICBpZiB7JGNtaXRtb2RlIG5lICJ0cmVlIn0gcmV0dXJuCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjZmxpc3RfdG9wXX0gcmV0dXJuCiAgICBzZXQgbCBbbGluZGV4IFtzcGxpdCBbJHcgaW5kZXggIkAkeCwkeSJdICIuIl0gMF0KICAgICRjZmxpc3QgdGFnIHJlbW92ZSBoaWdobGlnaHQgJGNmbGlzdF90b3AuMCAiJGNmbGlzdF90b3AuMCBsaW5lZW5kIgogICAgJGNmbGlzdCB0YWcgYWRkIGhpZ2hsaWdodCAkbC4wICIkbC4wIGxpbmVlbmQiCiAgICBzZXQgY2ZsaXN0X3RvcCAkbAogICAgaWYgeyRsID09IDF9IHsKCSRjdGV4dCB5dmlldyAxLjAKCXJldHVybgogICAgfQogICAgc2V0IGUgW2xpbmV0b2VsdCAkbF0KICAgIGlmIHtbc3RyaW5nIGluZGV4ICRlIGVuZF0gbmUgIi8ifSB7CglzaG93ZmlsZSAkZQogICAgfSBlbHNlaWYgeyR0cmVlZGlyb3BlbigkZSl9IHsKCXRyZWVjbG9zZWRpciAkdyAkZQogICAgfSBlbHNlIHsKCXRyZWVvcGVuZGlyICR3ICRlCiAgICB9Cn0KCnByb2Mgc2V0ZmlsZWxpc3Qge2lkfSB7CiAgICBnbG9iYWwgdHJlZWZpbGVsaXN0IGNmbGlzdAoKICAgIHRyZWV2aWV3ICRjZmxpc3QgJHRyZWVmaWxlbGlzdCgkaWQpIDAKfQoKaW1hZ2UgY3JlYXRlIGJpdG1hcCB0cmktcnQgLWJhY2tncm91bmQgYmxhY2sgLWZvcmVncm91bmQgYmx1ZSAtZGF0YSB7CiAgICAjZGVmaW5lIHRyaS1ydF93aWR0aCAxMwogICAgI2RlZmluZSB0cmktcnRfaGVpZ2h0IDEzCiAgICBzdGF0aWMgdW5zaWduZWQgY2hhciB0cmktcnRfYml0c1tdID0gewogICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgzMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHhmMCwgMHgwMCwKICAgICAgIDB4ZjAsIDB4MDEsIDB4ZjAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAgICAweDAwLCAweDAwfTsKfSAtbWFza2RhdGEgewogICAgI2RlZmluZSB0cmktcnQtbWFza193aWR0aCAxMwogICAgI2RlZmluZSB0cmktcnQtbWFza19oZWlnaHQgMTMKICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHRyaS1ydC1tYXNrX2JpdHNbXSA9IHsKICAgICAgIDB4MDgsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MzgsIDB4MDAsIDB4NzgsIDB4MDAsIDB4ZjgsIDB4MDAsIDB4ZjgsIDB4MDEsCiAgICAgICAweGY4LCAweDAzLCAweGY4LCAweDAxLCAweGY4LCAweDAwLCAweDc4LCAweDAwLCAweDM4LCAweDAwLCAweDE4LCAweDAwLAogICAgICAgMHgwOCwgMHgwMH07Cn0KaW1hZ2UgY3JlYXRlIGJpdG1hcCB0cmktZG4gLWJhY2tncm91bmQgYmxhY2sgLWZvcmVncm91bmQgYmx1ZSAtZGF0YSB7CiAgICAjZGVmaW5lIHRyaS1kbl93aWR0aCAxMwogICAgI2RlZmluZSB0cmktZG5faGVpZ2h0IDEzCiAgICBzdGF0aWMgdW5zaWduZWQgY2hhciB0cmktZG5fYml0c1tdID0gewogICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmYywgMHgwNywgMHhmOCwgMHgwMywKICAgICAgIDB4ZjAsIDB4MDEsIDB4ZTAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAgICAweDAwLCAweDAwfTsKfSAtbWFza2RhdGEgewogICAgI2RlZmluZSB0cmktZG4tbWFza193aWR0aCAxMwogICAgI2RlZmluZSB0cmktZG4tbWFza19oZWlnaHQgMTMKICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHRyaS1kbi1tYXNrX2JpdHNbXSA9IHsKICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MWYsIDB4ZmUsIDB4MGYsIDB4ZmMsIDB4MDcsCiAgICAgICAweGY4LCAweDAzLCAweGYwLCAweDAxLCAweGUwLCAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAgICAgMHgwMCwgMHgwMH07Cn0KCnByb2MgaW5pdF9mbGlzdCB7Zmlyc3R9IHsKICAgIGdsb2JhbCBjZmxpc3QgY2ZsaXN0X3RvcCBzZWxlY3RlZGxpbmUgZGlmZmZpbGVzdGFydAoKICAgICRjZmxpc3QgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkY2ZsaXN0IGRlbGV0ZSAwLjAgZW5kCiAgICBpZiB7JGZpcnN0IG5lIHt9fSB7CgkkY2ZsaXN0IGluc2VydCBlbmQgJGZpcnN0CglzZXQgY2ZsaXN0X3RvcCAxCgkkY2ZsaXN0IHRhZyBhZGQgaGlnaGxpZ2h0IDEuMCAiMS4wIGxpbmVlbmQiCiAgICB9IGVsc2UgewoJY2F0Y2gge3Vuc2V0IGNmbGlzdF90b3B9CiAgICB9CiAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICBzZXQgZGlmZmZpbGVzdGFydCB7fQp9Cgpwcm9jIGhpZ2hsaWdodF90YWcge2Z9IHsKICAgIGdsb2JhbCBoaWdobGlnaHRfcGF0aHMKCiAgICBmb3JlYWNoIHAgJGhpZ2hsaWdodF9wYXRocyB7CglpZiB7W3N0cmluZyBtYXRjaCAkcCAkZl19IHsKCSAgICByZXR1cm4gImJvbGQiCgl9CiAgICB9CiAgICByZXR1cm4ge30KfQoKcHJvYyBoaWdobGlnaHRfZmlsZWxpc3Qge30gewogICAgZ2xvYmFsIGNtaXRtb2RlIGNmbGlzdAoKICAgICRjZmxpc3QgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBpZiB7JGNtaXRtb2RlIG5lICJ0cmVlIn0gewoJc2V0IGVuZCBbbGluZGV4IFtzcGxpdCBbJGNmbGlzdCBpbmRleCBlbmRdIC5dIDBdCglmb3Ige3NldCBsIDJ9IHskbCA8ICRlbmR9IHtpbmNyIGx9IHsKCSAgICBzZXQgbGluZSBbJGNmbGlzdCBnZXQgJGwuMCAiJGwuMCBsaW5lZW5kIl0KCSAgICBpZiB7W2hpZ2hsaWdodF90YWcgJGxpbmVdIG5lIHt9fSB7CgkJJGNmbGlzdCB0YWcgYWRkIGJvbGQgJGwuMCAiJGwuMCBsaW5lZW5kIgoJICAgIH0KCX0KICAgIH0gZWxzZSB7CgloaWdobGlnaHRfdHJlZSAyIHt9CiAgICB9CiAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2MgdW5oaWdobGlnaHRfZmlsZWxpc3Qge30gewogICAgZ2xvYmFsIGNmbGlzdAoKICAgICRjZmxpc3QgY29uZiAtc3RhdGUgbm9ybWFsCiAgICAkY2ZsaXN0IHRhZyByZW1vdmUgYm9sZCAxLjAgZW5kCiAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2MgYWRkX2ZsaXN0IHtmbH0gewogICAgZ2xvYmFsIGNmbGlzdAoKICAgICRjZmxpc3QgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBmb3JlYWNoIGYgJGZsIHsKCSRjZmxpc3QgaW5zZXJ0IGVuZCAiXG4iCgkkY2ZsaXN0IGluc2VydCBlbmQgJGYgW2hpZ2hsaWdodF90YWcgJGZdCiAgICB9CiAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2Mgc2VsX2ZsaXN0IHt3IHggeX0gewogICAgZ2xvYmFsIGN0ZXh0IGRpZmZmaWxlc3RhcnQgY2ZsaXN0IGNmbGlzdF90b3AgY21pdG1vZGUKCiAgICBpZiB7JGNtaXRtb2RlIGVxICJ0cmVlIn0gcmV0dXJuCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjZmxpc3RfdG9wXX0gcmV0dXJuCiAgICBzZXQgbCBbbGluZGV4IFtzcGxpdCBbJHcgaW5kZXggIkAkeCwkeSJdICIuIl0gMF0KICAgICRjZmxpc3QgdGFnIHJlbW92ZSBoaWdobGlnaHQgJGNmbGlzdF90b3AuMCAiJGNmbGlzdF90b3AuMCBsaW5lZW5kIgogICAgJGNmbGlzdCB0YWcgYWRkIGhpZ2hsaWdodCAkbC4wICIkbC4wIGxpbmVlbmQiCiAgICBzZXQgY2ZsaXN0X3RvcCAkbAogICAgaWYgeyRsID09IDF9IHsKCSRjdGV4dCB5dmlldyAxLjAKICAgIH0gZWxzZSB7CgljYXRjaCB7JGN0ZXh0IHl2aWV3IFtsaW5kZXggJGRpZmZmaWxlc3RhcnQgW2V4cHIgeyRsIC0gMn1dXX0KICAgIH0KfQoKIyBGdW5jdGlvbnMgZm9yIGFkZGluZyBhbmQgcmVtb3Zpbmcgc2hlbGwtdHlwZSBxdW90aW5nCgpwcm9jIHNoZWxscXVvdGUge3N0cn0gewogICAgaWYgeyFbc3RyaW5nIG1hdGNoICIqXFsnXCJcXCBcdF0qIiAkc3RyXX0gewoJcmV0dXJuICRzdHIKICAgIH0KICAgIGlmIHshW3N0cmluZyBtYXRjaCAiKlxbJ1wiXFxdKiIgJHN0cl19IHsKCXJldHVybiAiXCIkc3RyXCIiCiAgICB9CiAgICBpZiB7IVtzdHJpbmcgbWF0Y2ggIionKiIgJHN0cl19IHsKCXJldHVybiAiJyRzdHInIgogICAgfQogICAgcmV0dXJuICJcIltzdHJpbmcgbWFwIHtcIiBcXFwiIFxcIFxcXFx9ICRzdHJdXCIiCn0KCnByb2Mgc2hlbGxhcmdsaXN0IHtsfSB7CiAgICBzZXQgc3RyIHt9CiAgICBmb3JlYWNoIGEgJGwgewoJaWYgeyRzdHIgbmUge319IHsKCSAgICBhcHBlbmQgc3RyICIgIgoJfQoJYXBwZW5kIHN0ciBbc2hlbGxxdW90ZSAkYV0KICAgIH0KICAgIHJldHVybiAkc3RyCn0KCnByb2Mgc2hlbGxkZXF1b3RlIHtzdHJ9IHsKICAgIHNldCByZXQge30KICAgIHNldCB1c2VkIC0xCiAgICB3aGlsZSB7MX0gewoJaW5jciB1c2VkCglpZiB7IVtyZWdleHAgLXN0YXJ0ICR1c2VkIC1pbmRpY2VzICJcWydcIlxcXFwgXHRdIiAkc3RyIGZpcnN0XX0gewoJICAgIGFwcGVuZCByZXQgW3N0cmluZyByYW5nZSAkc3RyICR1c2VkIGVuZF0KCSAgICBzZXQgdXNlZCBbc3RyaW5nIGxlbmd0aCAkc3RyXQoJICAgIGJyZWFrCgl9CglzZXQgZmlyc3QgW2xpbmRleCAkZmlyc3QgMF0KCXNldCBjaCBbc3RyaW5nIGluZGV4ICRzdHIgJGZpcnN0XQoJaWYgeyRmaXJzdCA+ICR1c2VkfSB7CgkgICAgYXBwZW5kIHJldCBbc3RyaW5nIHJhbmdlICRzdHIgJHVzZWQgW2V4cHIgeyRmaXJzdCAtIDF9XV0KCSAgICBzZXQgdXNlZCAkZmlyc3QKCX0KCWlmIHskY2ggZXEgIiAiIHx8ICRjaCBlcSAiXHQifSBicmVhawoJaW5jciB1c2VkCglpZiB7JGNoIGVxICInIn0gewoJICAgIHNldCBmaXJzdCBbc3RyaW5nIGZpcnN0ICInIiAkc3RyICR1c2VkXQoJICAgIGlmIHskZmlyc3QgPCAwfSB7CgkJZXJyb3IgInVubWF0Y2hlZCBzaW5nbGUtcXVvdGUiCgkgICAgfQoJICAgIGFwcGVuZCByZXQgW3N0cmluZyByYW5nZSAkc3RyICR1c2VkIFtleHByIHskZmlyc3QgLSAxfV1dCgkgICAgc2V0IHVzZWQgJGZpcnN0CgkgICAgY29udGludWUKCX0KCWlmIHskY2ggZXEgIlxcIn0gewoJICAgIGlmIHskdXNlZCA+PSBbc3RyaW5nIGxlbmd0aCAkc3RyXX0gewoJCWVycm9yICJ0cmFpbGluZyBiYWNrc2xhc2giCgkgICAgfQoJICAgIGFwcGVuZCByZXQgW3N0cmluZyBpbmRleCAkc3RyICR1c2VkXQoJICAgIGNvbnRpbnVlCgl9CgkjIGhlcmUgY2ggPT0gIlwiIgoJd2hpbGUgezF9IHsKCSAgICBpZiB7IVtyZWdleHAgLXN0YXJ0ICR1c2VkIC1pbmRpY2VzICJcW1wiXFxcXF0iICRzdHIgZmlyc3RdfSB7CgkJZXJyb3IgInVubWF0Y2hlZCBkb3VibGUtcXVvdGUiCgkgICAgfQoJICAgIHNldCBmaXJzdCBbbGluZGV4ICRmaXJzdCAwXQoJICAgIHNldCBjaCBbc3RyaW5nIGluZGV4ICRzdHIgJGZpcnN0XQoJICAgIGlmIHskZmlyc3QgPiAkdXNlZH0gewoJCWFwcGVuZCByZXQgW3N0cmluZyByYW5nZSAkc3RyICR1c2VkIFtleHByIHskZmlyc3QgLSAxfV1dCgkJc2V0IHVzZWQgJGZpcnN0CgkgICAgfQoJICAgIGlmIHskY2ggZXEgIlwiIn0gYnJlYWsKCSAgICBpbmNyIHVzZWQKCSAgICBhcHBlbmQgcmV0IFtzdHJpbmcgaW5kZXggJHN0ciAkdXNlZF0KCSAgICBpbmNyIHVzZWQKCX0KICAgIH0KICAgIHJldHVybiBbbGlzdCAkdXNlZCAkcmV0XQp9Cgpwcm9jIHNoZWxsc3BsaXQge3N0cn0gewogICAgc2V0IGwge30KICAgIHdoaWxlIHsxfSB7CglzZXQgc3RyIFtzdHJpbmcgdHJpbWxlZnQgJHN0cl0KCWlmIHskc3RyIGVxIHt9fSBicmVhawoJc2V0IGRxIFtzaGVsbGRlcXVvdGUgJHN0cl0KCXNldCBuIFtsaW5kZXggJGRxIDBdCglzZXQgd29yZCBbbGluZGV4ICRkcSAxXQoJc2V0IHN0ciBbc3RyaW5nIHJhbmdlICRzdHIgJG4gZW5kXQoJbGFwcGVuZCBsICR3b3JkCiAgICB9CiAgICByZXR1cm4gJGwKfQoKIyBDb2RlIHRvIGltcGxlbWVudCBtdWx0aXBsZSB2aWV3cwoKcHJvYyBuZXd2aWV3IHtpc2hpZ2hsaWdodH0gewogICAgZ2xvYmFsIG5leHR2aWV3bnVtIG5ld3ZpZXduYW1lIG5ld3ZpZXdwZXJtIHVpZm9udCBuZXdpc2hpZ2hsaWdodAogICAgZ2xvYmFsIG5ld3ZpZXdhcmdzIHJldnRyZWVhcmdzCgogICAgc2V0IG5ld2lzaGlnaGxpZ2h0ICRpc2hpZ2hsaWdodAogICAgc2V0IHRvcCAuZ2l0a3ZpZXcKICAgIGlmIHtbd2luZm8gZXhpc3RzICR0b3BdfSB7CglyYWlzZSAkdG9wCglyZXR1cm4KICAgIH0KICAgIHNldCBuZXd2aWV3bmFtZSgkbmV4dHZpZXdudW0pICJWaWV3ICRuZXh0dmlld251bSIKICAgIHNldCBuZXd2aWV3cGVybSgkbmV4dHZpZXdudW0pIDAKICAgIHNldCBuZXd2aWV3YXJncygkbmV4dHZpZXdudW0pIFtzaGVsbGFyZ2xpc3QgJHJldnRyZWVhcmdzXQogICAgdmlld2VkaXRvciAkdG9wICRuZXh0dmlld251bSAiR2l0ayB2aWV3IGRlZmluaXRpb24iIAp9Cgpwcm9jIGVkaXR2aWV3IHt9IHsKICAgIGdsb2JhbCBjdXJ2aWV3CiAgICBnbG9iYWwgdmlld25hbWUgdmlld3Blcm0gbmV3dmlld25hbWUgbmV3dmlld3Blcm0KICAgIGdsb2JhbCB2aWV3YXJncyBuZXd2aWV3YXJncwoKICAgIHNldCB0b3AgLmdpdGt2ZWRpdC0kY3VydmlldwogICAgaWYge1t3aW5mbyBleGlzdHMgJHRvcF19IHsKCXJhaXNlICR0b3AKCXJldHVybgogICAgfQogICAgc2V0IG5ld3ZpZXduYW1lKCRjdXJ2aWV3KSAkdmlld25hbWUoJGN1cnZpZXcpCiAgICBzZXQgbmV3dmlld3Blcm0oJGN1cnZpZXcpICR2aWV3cGVybSgkY3VydmlldykKICAgIHNldCBuZXd2aWV3YXJncygkY3VydmlldykgW3NoZWxsYXJnbGlzdCAkdmlld2FyZ3MoJGN1cnZpZXcpXQogICAgdmlld2VkaXRvciAkdG9wICRjdXJ2aWV3ICJHaXRrOiBlZGl0IHZpZXcgJHZpZXduYW1lKCRjdXJ2aWV3KSIKfQoKcHJvYyB2aWV3ZWRpdG9yIHt0b3AgbiB0aXRsZX0gewogICAgZ2xvYmFsIG5ld3ZpZXduYW1lIG5ld3ZpZXdwZXJtIHZpZXdmaWxlcwogICAgZ2xvYmFsIHVpZm9udAoKICAgIHRvcGxldmVsICR0b3AKICAgIHdtIHRpdGxlICR0b3AgJHRpdGxlCiAgICBsYWJlbCAkdG9wLm5sIC10ZXh0ICJOYW1lIiAtZm9udCAkdWlmb250CiAgICBlbnRyeSAkdG9wLm5hbWUgLXdpZHRoIDIwIC10ZXh0dmFyaWFibGUgbmV3dmlld25hbWUoJG4pCiAgICBncmlkICR0b3AubmwgJHRvcC5uYW1lIC1zdGlja3kgdyAtcGFkeSA1CiAgICBjaGVja2J1dHRvbiAkdG9wLnBlcm0gLXRleHQgIlJlbWVtYmVyIHRoaXMgdmlldyIgLXZhcmlhYmxlIG5ld3ZpZXdwZXJtKCRuKQogICAgZ3JpZCAkdG9wLnBlcm0gLSAtcGFkeSA1IC1zdGlja3kgdwogICAgbWVzc2FnZSAkdG9wLmFsIC1hc3BlY3QgMTAwMCAtZm9udCAkdWlmb250IFwKCS10ZXh0ICJDb21taXRzIHRvIGluY2x1ZGUgKGFyZ3VtZW50cyB0byBnaXQgcmV2LWxpc3QpOiIKICAgIGdyaWQgJHRvcC5hbCAtIC1zdGlja3kgdyAtcGFkeSA1CiAgICBlbnRyeSAkdG9wLmFyZ3MgLXdpZHRoIDUwIC10ZXh0dmFyaWFibGUgbmV3dmlld2FyZ3MoJG4pIFwKCS1iYWNrZ3JvdW5kIHdoaXRlCiAgICBncmlkICR0b3AuYXJncyAtIC1zdGlja3kgZXcgLXBhZHggNQogICAgbWVzc2FnZSAkdG9wLmwgLWFzcGVjdCAxMDAwIC1mb250ICR1aWZvbnQgXAoJLXRleHQgIkVudGVyIGZpbGVzIGFuZCBkaXJlY3RvcmllcyB0byBpbmNsdWRlLCBvbmUgcGVyIGxpbmU6IgogICAgZ3JpZCAkdG9wLmwgLSAtc3RpY2t5IHcKICAgIHRleHQgJHRvcC50IC13aWR0aCA0MCAtaGVpZ2h0IDEwIC1iYWNrZ3JvdW5kIHdoaXRlCiAgICBpZiB7W2luZm8gZXhpc3RzIHZpZXdmaWxlcygkbildfSB7Cglmb3JlYWNoIGYgJHZpZXdmaWxlcygkbikgewoJICAgICR0b3AudCBpbnNlcnQgZW5kICRmCgkgICAgJHRvcC50IGluc2VydCBlbmQgIlxuIgoJfQoJJHRvcC50IGRlbGV0ZSB7ZW5kIC0gMWN9IGVuZAoJJHRvcC50IG1hcmsgc2V0IGluc2VydCAwLjAKICAgIH0KICAgIGdyaWQgJHRvcC50IC0gLXN0aWNreSBldyAtcGFkeCA1CiAgICBmcmFtZSAkdG9wLmJ1dHMKICAgIGJ1dHRvbiAkdG9wLmJ1dHMub2sgLXRleHQgIk9LIiAtY29tbWFuZCBbbGlzdCBuZXd2aWV3b2sgJHRvcCAkbl0KICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIFtsaXN0IGRlc3Ryb3kgJHRvcF0KICAgIGdyaWQgJHRvcC5idXRzLm9rICR0b3AuYnV0cy5jYW4KICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCAkdG9wLmJ1dHMgLSAtcGFkeSAxMCAtc3RpY2t5IGV3CiAgICBmb2N1cyAkdG9wLnQKfQoKcHJvYyBkb3ZpZXdtZW51IHttIGZpcnN0IGNtZCBvcCBhcmd2fSB7CiAgICBzZXQgbm1lbnUgWyRtIGluZGV4IGVuZF0KICAgIGZvciB7c2V0IGkgJGZpcnN0fSB7JGkgPD0gJG5tZW51fSB7aW5jciBpfSB7CglpZiB7WyRtIGVudHJ5Y2dldCAkaSAtY29tbWFuZF0gZXEgJGNtZH0gewoJICAgIGV2YWwgJG0gJG9wICRpICRhcmd2CgkgICAgYnJlYWsKCX0KICAgIH0KfQoKcHJvYyBhbGx2aWV3bWVudXMge24gb3AgYXJnc30gewogICAgZ2xvYmFsIHZpZXdobG1lbnUKCiAgICBkb3ZpZXdtZW51IC5iYXIudmlldyA3IFtsaXN0IHNob3d2aWV3ICRuXSAkb3AgJGFyZ3MKICAgIGRvdmlld21lbnUgJHZpZXdobG1lbnUgMSBbbGlzdCBhZGR2aGlnaGxpZ2h0ICRuXSAkb3AgJGFyZ3MKfQoKcHJvYyBuZXd2aWV3b2sge3RvcCBufSB7CiAgICBnbG9iYWwgbmV4dHZpZXdudW0gbmV3dmlld3Blcm0gbmV3dmlld25hbWUgbmV3aXNoaWdobGlnaHQKICAgIGdsb2JhbCB2aWV3bmFtZSB2aWV3ZmlsZXMgdmlld3Blcm0gc2VsZWN0ZWR2aWV3IGN1cnZpZXcKICAgIGdsb2JhbCB2aWV3YXJncyBuZXd2aWV3YXJncyB2aWV3aGxtZW51CgogICAgaWYge1tjYXRjaCB7CglzZXQgbmV3YXJncyBbc2hlbGxzcGxpdCAkbmV3dmlld2FyZ3MoJG4pXQogICAgfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3IgaW4gY29tbWl0IHNlbGVjdGlvbiBhcmd1bWVudHM6ICRlcnIiCgl3bSByYWlzZSAkdG9wCglmb2N1cyAkdG9wCglyZXR1cm4KICAgIH0KICAgIHNldCBmaWxlcyB7fQogICAgZm9yZWFjaCBmIFtzcGxpdCBbJHRvcC50IGdldCAwLjAgZW5kXSAiXG4iXSB7CglzZXQgZnQgW3N0cmluZyB0cmltICRmXQoJaWYgeyRmdCBuZSB7fX0gewoJICAgIGxhcHBlbmQgZmlsZXMgJGZ0Cgl9CiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyB2aWV3ZmlsZXMoJG4pXX0gewoJIyBjcmVhdGluZyBhIG5ldyB2aWV3CglpbmNyIG5leHR2aWV3bnVtCglzZXQgdmlld25hbWUoJG4pICRuZXd2aWV3bmFtZSgkbikKCXNldCB2aWV3cGVybSgkbikgJG5ld3ZpZXdwZXJtKCRuKQoJc2V0IHZpZXdmaWxlcygkbikgJGZpbGVzCglzZXQgdmlld2FyZ3MoJG4pICRuZXdhcmdzCglhZGR2aWV3bWVudSAkbgoJaWYgeyEkbmV3aXNoaWdobGlnaHR9IHsKCSAgICBhZnRlciBpZGxlIHNob3d2aWV3ICRuCgl9IGVsc2UgewoJICAgIGFmdGVyIGlkbGUgYWRkdmhpZ2hsaWdodCAkbgoJfQogICAgfSBlbHNlIHsKCSMgZWRpdGluZyBhbiBleGlzdGluZyB2aWV3CglzZXQgdmlld3Blcm0oJG4pICRuZXd2aWV3cGVybSgkbikKCWlmIHskbmV3dmlld25hbWUoJG4pIG5lICR2aWV3bmFtZSgkbil9IHsKCSAgICBzZXQgdmlld25hbWUoJG4pICRuZXd2aWV3bmFtZSgkbikKCSAgICBkb3ZpZXdtZW51IC5iYXIudmlldyA3IFtsaXN0IHNob3d2aWV3ICRuXSBcCgkJZW50cnljb25mIFtsaXN0IC1sYWJlbCAkdmlld25hbWUoJG4pXQoJICAgIGRvdmlld21lbnUgJHZpZXdobG1lbnUgMSBbbGlzdCBhZGR2aGlnaGxpZ2h0ICRuXSBcCgkJZW50cnljb25mIFtsaXN0IC1sYWJlbCAkdmlld25hbWUoJG4pIC12YWx1ZSAkdmlld25hbWUoJG4pXQoJfQoJaWYgeyRmaWxlcyBuZSAkdmlld2ZpbGVzKCRuKSB8fCAkbmV3YXJncyBuZSAkdmlld2FyZ3MoJG4pfSB7CgkgICAgc2V0IHZpZXdmaWxlcygkbikgJGZpbGVzCgkgICAgc2V0IHZpZXdhcmdzKCRuKSAkbmV3YXJncwoJICAgIGlmIHskY3VydmlldyA9PSAkbn0gewoJCWFmdGVyIGlkbGUgdXBkYXRlY29tbWl0cwoJICAgIH0KCX0KICAgIH0KICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9Cn0KCnByb2MgZGVsdmlldyB7fSB7CiAgICBnbG9iYWwgY3VydmlldyB2aWV3ZGF0YSB2aWV3cGVybSBobHZpZXcgc2VsZWN0ZWRobHZpZXcKCiAgICBpZiB7JGN1cnZpZXcgPT0gMH0gcmV0dXJuCiAgICBpZiB7W2luZm8gZXhpc3RzIGhsdmlld10gJiYgJGhsdmlldyA9PSAkY3Vydmlld30gewoJc2V0IHNlbGVjdGVkaGx2aWV3IE5vbmUKCXVuc2V0IGhsdmlldwogICAgfQogICAgYWxsdmlld21lbnVzICRjdXJ2aWV3IGRlbGV0ZQogICAgc2V0IHZpZXdkYXRhKCRjdXJ2aWV3KSB7fQogICAgc2V0IHZpZXdwZXJtKCRjdXJ2aWV3KSAwCiAgICBzaG93dmlldyAwCn0KCnByb2MgYWRkdmlld21lbnUge259IHsKICAgIGdsb2JhbCB2aWV3bmFtZSB2aWV3aGxtZW51CgogICAgLmJhci52aWV3IGFkZCByYWRpb2J1dHRvbiAtbGFiZWwgJHZpZXduYW1lKCRuKSBcCgktY29tbWFuZCBbbGlzdCBzaG93dmlldyAkbl0gLXZhcmlhYmxlIHNlbGVjdGVkdmlldyAtdmFsdWUgJG4KICAgICR2aWV3aGxtZW51IGFkZCByYWRpb2J1dHRvbiAtbGFiZWwgJHZpZXduYW1lKCRuKSBcCgktY29tbWFuZCBbbGlzdCBhZGR2aGlnaGxpZ2h0ICRuXSAtdmFyaWFibGUgc2VsZWN0ZWRobHZpZXcKfQoKcHJvYyBmbGF0dGVuIHt2YXJ9IHsKICAgIGdsb2JhbCAkdmFyCgogICAgc2V0IHJldCB7fQogICAgZm9yZWFjaCBpIFthcnJheSBuYW1lcyAkdmFyXSB7CglsYXBwZW5kIHJldCAkaSBbc2V0ICR2YXJcKCRpXCldCiAgICB9CiAgICByZXR1cm4gJHJldAp9Cgpwcm9jIHVuZmxhdHRlbiB7dmFyIGx9IHsKICAgIGdsb2JhbCAkdmFyCgogICAgY2F0Y2gge3Vuc2V0ICR2YXJ9CiAgICBmb3JlYWNoIHtpIHZ9ICRsIHsKCXNldCAkdmFyXCgkaVwpICR2CiAgICB9Cn0KCnByb2Mgc2hvd3ZpZXcge259IHsKICAgIGdsb2JhbCBjdXJ2aWV3IHZpZXdkYXRhIHZpZXdmaWxlcwogICAgZ2xvYmFsIGRpc3BsYXlvcmRlciBwYXJlbnRsaXN0IGNoaWxkbGlzdCByb3dpZGxpc3Qgcm93b2Zmc2V0cwogICAgZ2xvYmFsIGNvbG9ybWFwIHJvd3RleHR4IGNvbW1pdHJvdyBuZXh0Y29sb3IgY2FudnhtYXgKICAgIGdsb2JhbCBudW1jb21taXRzIHJvd3JhbmdlbGlzdCBjb21taXRsaXN0ZWQgaWRyb3dyYW5nZXMKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUgY3VycmVudGlkIGNhbnYgY2FudnkwCiAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyB0cmVlZGlmZnMKICAgIGdsb2JhbCBwZW5kaW5nX3NlbGVjdCBwaGFzZQogICAgZ2xvYmFsIGNvbW1pdGlkeCByb3dsYWlkb3V0IHJvd29wdGltIGxpbmVzZWdlbmRzCiAgICBnbG9iYWwgY29tbWZkIG5leHR1cGRhdGUKICAgIGdsb2JhbCBzZWxlY3RlZHZpZXcKICAgIGdsb2JhbCB2cGFyZW50bGlzdCB2Y2hpbGRsaXN0IHZkaXNwb3JkZXIgdmNtaXRsaXN0ZWQKICAgIGdsb2JhbCBobHZpZXcgc2VsZWN0ZWRobHZpZXcKCiAgICBpZiB7JG4gPT0gJGN1cnZpZXd9IHJldHVybgogICAgc2V0IHNlbGlkIHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHsKCXNldCBzZWxpZCAkY3VycmVudGlkCglzZXQgeSBbeWMgJHNlbGVjdGVkbGluZV0KCXNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KCXNldCBzcGFuIFskY2FudiB5dmlld10KCXNldCB5dG9wIFtleHByIHtbbGluZGV4ICRzcGFuIDBdICogJHltYXh9XQoJc2V0IHlib3QgW2V4cHIge1tsaW5kZXggJHNwYW4gMV0gKiAkeW1heH1dCglpZiB7JHl0b3AgPCAkeSAmJiAkeSA8ICR5Ym90fSB7CgkgICAgc2V0IHlzY3JlZW4gW2V4cHIgeyR5IC0gJHl0b3B9XQoJfSBlbHNlIHsKCSAgICBzZXQgeXNjcmVlbiBbZXhwciB7KCR5Ym90IC0gJHl0b3ApIC8gMn1dCgl9CiAgICB9CiAgICB1bnNlbGVjdGxpbmUKICAgIG5vcm1hbGxpbmUKICAgIHN0b3BmaW5kcHJvYwogICAgaWYgeyRjdXJ2aWV3ID49IDB9IHsKCXNldCB2cGFyZW50bGlzdCgkY3VydmlldykgJHBhcmVudGxpc3QKCXNldCB2Y2hpbGRsaXN0KCRjdXJ2aWV3KSAkY2hpbGRsaXN0CglzZXQgdmRpc3BvcmRlcigkY3VydmlldykgJGRpc3BsYXlvcmRlcgoJc2V0IHZjbWl0bGlzdGVkKCRjdXJ2aWV3KSAkY29tbWl0bGlzdGVkCglpZiB7JHBoYXNlIG5lIHt9fSB7CgkgICAgc2V0IHZpZXdkYXRhKCRjdXJ2aWV3KSBcCgkJW2xpc3QgJHBoYXNlICRyb3dpZGxpc3QgJHJvd29mZnNldHMgJHJvd3JhbmdlbGlzdCBcCgkJICAgICBbZmxhdHRlbiBpZHJvd3Jhbmdlc10gW2ZsYXR0ZW4gaWRpbmxpc3RdIFwKCQkgICAgICRyb3dsYWlkb3V0ICRyb3dvcHRpbSAkbnVtY29tbWl0cyAkbGluZXNlZ2VuZHNdCgl9IGVsc2VpZiB7IVtpbmZvIGV4aXN0cyB2aWV3ZGF0YSgkY3VydmlldyldCgkJICB8fCBbbGluZGV4ICR2aWV3ZGF0YSgkY3VydmlldykgMF0gbmUge319IHsKCSAgICBzZXQgdmlld2RhdGEoJGN1cnZpZXcpIFwKCQlbbGlzdCB7fSAkcm93aWRsaXN0ICRyb3dvZmZzZXRzICRyb3dyYW5nZWxpc3RdCgl9CiAgICB9CiAgICBjYXRjaCB7dW5zZXQgbWF0Y2hpbmdsaW5lc30KICAgIGNhdGNoIHt1bnNldCB0cmVlZGlmZnN9CiAgICBjbGVhcl9kaXNwbGF5CiAgICBpZiB7W2luZm8gZXhpc3RzIGhsdmlld10gJiYgJGhsdmlldyA9PSAkbn0gewoJdW5zZXQgaGx2aWV3CglzZXQgc2VsZWN0ZWRobHZpZXcgTm9uZQogICAgfQoKICAgIHNldCBjdXJ2aWV3ICRuCiAgICBzZXQgc2VsZWN0ZWR2aWV3ICRuCiAgICAuYmFyLnZpZXcgZW50cnljb25mIDIgLXN0YXRlIFtleHByIHskbiA9PSAwPyAiZGlzYWJsZWQiOiAibm9ybWFsIn1dCiAgICAuYmFyLnZpZXcgZW50cnljb25mIDMgLXN0YXRlIFtleHByIHskbiA9PSAwPyAiZGlzYWJsZWQiOiAibm9ybWFsIn1dCgogICAgaWYgeyFbaW5mbyBleGlzdHMgdmlld2RhdGEoJG4pXX0gewoJc2V0IHBlbmRpbmdfc2VsZWN0ICRzZWxpZAoJZ2V0Y29tbWl0cwoJcmV0dXJuCiAgICB9CgogICAgc2V0IHYgJHZpZXdkYXRhKCRuKQogICAgc2V0IHBoYXNlIFtsaW5kZXggJHYgMF0KICAgIHNldCBkaXNwbGF5b3JkZXIgJHZkaXNwb3JkZXIoJG4pCiAgICBzZXQgcGFyZW50bGlzdCAkdnBhcmVudGxpc3QoJG4pCiAgICBzZXQgY2hpbGRsaXN0ICR2Y2hpbGRsaXN0KCRuKQogICAgc2V0IGNvbW1pdGxpc3RlZCAkdmNtaXRsaXN0ZWQoJG4pCiAgICBzZXQgcm93aWRsaXN0IFtsaW5kZXggJHYgMV0KICAgIHNldCByb3dvZmZzZXRzIFtsaW5kZXggJHYgMl0KICAgIHNldCByb3dyYW5nZWxpc3QgW2xpbmRleCAkdiAzXQogICAgaWYgeyRwaGFzZSBlcSB7fX0gewoJc2V0IG51bWNvbW1pdHMgW2xsZW5ndGggJGRpc3BsYXlvcmRlcl0KCWNhdGNoIHt1bnNldCBpZHJvd3Jhbmdlc30KICAgIH0gZWxzZSB7Cgl1bmZsYXR0ZW4gaWRyb3dyYW5nZXMgW2xpbmRleCAkdiA0XQoJdW5mbGF0dGVuIGlkaW5saXN0IFtsaW5kZXggJHYgNV0KCXNldCByb3dsYWlkb3V0IFtsaW5kZXggJHYgNl0KCXNldCByb3dvcHRpbSBbbGluZGV4ICR2IDddCglzZXQgbnVtY29tbWl0cyBbbGluZGV4ICR2IDhdCglzZXQgbGluZXNlZ2VuZHMgW2xpbmRleCAkdiA5XQogICAgfQoKICAgIGNhdGNoIHt1bnNldCBjb2xvcm1hcH0KICAgIGNhdGNoIHt1bnNldCByb3d0ZXh0eH0KICAgIHNldCBuZXh0Y29sb3IgMAogICAgc2V0IGNhbnZ4bWF4IFskY2FudiBjZ2V0IC13aWR0aF0KICAgIHNldCBjdXJ2aWV3ICRuCiAgICBzZXQgcm93IDAKICAgIHNldGNhbnZzY3JvbGwKICAgIHNldCB5ZiAwCiAgICBzZXQgcm93IDAKICAgIGlmIHskc2VsaWQgbmUge30gJiYgW2luZm8gZXhpc3RzIGNvbW1pdHJvdygkbiwkc2VsaWQpXX0gewoJc2V0IHJvdyAkY29tbWl0cm93KCRuLCRzZWxpZCkKCSMgdHJ5IHRvIGdldCB0aGUgc2VsZWN0ZWQgcm93IGluIHRoZSBzYW1lIHBvc2l0aW9uIG9uIHRoZSBzY3JlZW4KCXNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KCXNldCB5dG9wIFtleHByIHtbeWMgJHJvd10gLSAkeXNjcmVlbn1dCglpZiB7JHl0b3AgPCAwfSB7CgkgICAgc2V0IHl0b3AgMAoJfQoJc2V0IHlmIFtleHByIHskeXRvcCAqIDEuMCAvICR5bWF4fV0KICAgIH0KICAgIGFsbGNhbnZzIHl2aWV3IG1vdmV0byAkeWYKICAgIGRyYXd2aXNpYmxlCiAgICBzZWxlY3RsaW5lICRyb3cgMAogICAgaWYgeyRwaGFzZSBuZSB7fX0gewoJaWYgeyRwaGFzZSBlcSAiZ2V0Y29tbWl0cyJ9IHsKCSAgICBzaG93X3N0YXR1cyAiUmVhZGluZyBjb21taXRzLi4uIgoJfQoJaWYge1tpbmZvIGV4aXN0cyBjb21tZmQoJG4pXX0gewoJICAgIGxheW91dG1vcmUge30KCX0gZWxzZSB7CgkgICAgZmluaXNoY29tbWl0cwoJfQogICAgfSBlbHNlaWYgeyRudW1jb21taXRzID09IDB9IHsKCXNob3dfc3RhdHVzICJObyBjb21taXRzIHNlbGVjdGVkIgogICAgfQp9CgojIFN0dWZmIHJlbGF0aW5nIHRvIHRoZSBoaWdobGlnaHRpbmcgZmFjaWxpdHkKCnByb2MgaXNoaWdobGlnaHRlZCB7cm93fSB7CiAgICBnbG9iYWwgdmhpZ2hsaWdodHMgZmhpZ2hsaWdodHMgbmhpZ2hsaWdodHMgcmhpZ2hsaWdodHMKCiAgICBpZiB7W2luZm8gZXhpc3RzIG5oaWdobGlnaHRzKCRyb3cpXSAmJiAkbmhpZ2hsaWdodHMoJHJvdykgPiAwfSB7CglyZXR1cm4gJG5oaWdobGlnaHRzKCRyb3cpCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHZoaWdobGlnaHRzKCRyb3cpXSAmJiAkdmhpZ2hsaWdodHMoJHJvdykgPiAwfSB7CglyZXR1cm4gJHZoaWdobGlnaHRzKCRyb3cpCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGZoaWdobGlnaHRzKCRyb3cpXSAmJiAkZmhpZ2hsaWdodHMoJHJvdykgPiAwfSB7CglyZXR1cm4gJGZoaWdobGlnaHRzKCRyb3cpCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHJoaWdobGlnaHRzKCRyb3cpXSAmJiAkcmhpZ2hsaWdodHMoJHJvdykgPiAwfSB7CglyZXR1cm4gJHJoaWdobGlnaHRzKCRyb3cpCiAgICB9CiAgICByZXR1cm4gMAp9Cgpwcm9jIGJvbGRlbiB7cm93IGZvbnR9IHsKICAgIGdsb2JhbCBjYW52IGxpbmVodGFnIHNlbGVjdGVkbGluZSBib2xkcm93cwoKICAgIGxhcHBlbmQgYm9sZHJvd3MgJHJvdwogICAgJGNhbnYgaXRlbWNvbmYgJGxpbmVodGFnKCRyb3cpIC1mb250ICRmb250CiAgICBpZiB7W2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV0gJiYgJHJvdyA9PSAkc2VsZWN0ZWRsaW5lfSB7CgkkY2FudiBkZWxldGUgc2Vjc2VsCglzZXQgdCBbZXZhbCAkY2FudiBjcmVhdGUgcmVjdCBbJGNhbnYgYmJveCAkbGluZWh0YWcoJHJvdyldIFwKCQkgICAtb3V0bGluZSB7e319IC10YWdzIHNlY3NlbCBcCgkJICAgLWZpbGwgWyRjYW52IGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQoJJGNhbnYgbG93ZXIgJHQKICAgIH0KfQoKcHJvYyBib2xkZW5fbmFtZSB7cm93IGZvbnR9IHsKICAgIGdsb2JhbCBjYW52MiBsaW5lbnRhZyBzZWxlY3RlZGxpbmUgYm9sZG5hbWVyb3dzCgogICAgbGFwcGVuZCBib2xkbmFtZXJvd3MgJHJvdwogICAgJGNhbnYyIGl0ZW1jb25mICRsaW5lbnRhZygkcm93KSAtZm9udCAkZm9udAogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdICYmICRyb3cgPT0gJHNlbGVjdGVkbGluZX0gewoJJGNhbnYyIGRlbGV0ZSBzZWNzZWwKCXNldCB0IFtldmFsICRjYW52MiBjcmVhdGUgcmVjdCBbJGNhbnYyIGJib3ggJGxpbmVudGFnKCRyb3cpXSBcCgkJICAgLW91dGxpbmUge3t9fSAtdGFncyBzZWNzZWwgXAoJCSAgIC1maWxsIFskY2FudjIgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCgkkY2FudjIgbG93ZXIgJHQKICAgIH0KfQoKcHJvYyB1bmJvbGRlbiB7fSB7CiAgICBnbG9iYWwgbWFpbmZvbnQgYm9sZHJvd3MKCiAgICBzZXQgc3RpbGxib2xkIHt9CiAgICBmb3JlYWNoIHJvdyAkYm9sZHJvd3MgewoJaWYgeyFbaXNoaWdobGlnaHRlZCAkcm93XX0gewoJICAgIGJvbGRlbiAkcm93ICRtYWluZm9udAoJfSBlbHNlIHsKCSAgICBsYXBwZW5kIHN0aWxsYm9sZCAkcm93Cgl9CiAgICB9CiAgICBzZXQgYm9sZHJvd3MgJHN0aWxsYm9sZAp9Cgpwcm9jIGFkZHZoaWdobGlnaHQge259IHsKICAgIGdsb2JhbCBobHZpZXcgY3VydmlldyB2aWV3ZGF0YSB2aGxfZG9uZSB2aGlnaGxpZ2h0cyBjb21taXRpZHgKCiAgICBpZiB7W2luZm8gZXhpc3RzIGhsdmlld119IHsKCWRlbHZoaWdobGlnaHQKICAgIH0KICAgIHNldCBobHZpZXcgJG4KICAgIGlmIHskbiAhPSAkY3VydmlldyAmJiAhW2luZm8gZXhpc3RzIHZpZXdkYXRhKCRuKV19IHsKCXNldCB2aWV3ZGF0YSgkbikgW2xpc3QgZ2V0Y29tbWl0cyB7e319IHt7fX0ge30ge30ge30gMCAwIDAge31dCglzZXQgdnBhcmVudGxpc3QoJG4pIHt9CglzZXQgdmNoaWxkbGlzdCgkbikge30KCXNldCB2ZGlzcG9yZGVyKCRuKSB7fQoJc2V0IHZjbWl0bGlzdGVkKCRuKSB7fQoJc3RhcnRfcmV2X2xpc3QgJG4KICAgIH0KICAgIHNldCB2aGxfZG9uZSAkY29tbWl0aWR4KCRobHZpZXcpCiAgICBpZiB7JHZobF9kb25lID4gMH0gewoJZHJhd3Zpc2libGUKICAgIH0KfQoKcHJvYyBkZWx2aGlnaGxpZ2h0IHt9IHsKICAgIGdsb2JhbCBobHZpZXcgdmhpZ2hsaWdodHMKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBobHZpZXddfSByZXR1cm4KICAgIHVuc2V0IGhsdmlldwogICAgY2F0Y2gge3Vuc2V0IHZoaWdobGlnaHRzfQogICAgdW5ib2xkZW4KfQoKcHJvYyB2aGlnaGxpZ2h0bW9yZSB7fSB7CiAgICBnbG9iYWwgaGx2aWV3IHZobF9kb25lIGNvbW1pdGlkeCB2aGlnaGxpZ2h0cwogICAgZ2xvYmFsIGRpc3BsYXlvcmRlciB2ZGlzcG9yZGVyIGN1cnZpZXcgbWFpbmZvbnQKCiAgICBzZXQgZm9udCBbY29uY2F0ICRtYWluZm9udCBib2xkXQogICAgc2V0IG1heCAkY29tbWl0aWR4KCRobHZpZXcpCiAgICBpZiB7JGhsdmlldyA9PSAkY3Vydmlld30gewoJc2V0IGRpc3AgJGRpc3BsYXlvcmRlcgogICAgfSBlbHNlIHsKCXNldCBkaXNwICR2ZGlzcG9yZGVyKCRobHZpZXcpCiAgICB9CiAgICBzZXQgdnIgW3Zpc2libGVyb3dzXQogICAgc2V0IHIwIFtsaW5kZXggJHZyIDBdCiAgICBzZXQgcjEgW2xpbmRleCAkdnIgMV0KICAgIGZvciB7c2V0IGkgJHZobF9kb25lfSB7JGkgPCAkbWF4fSB7aW5jciBpfSB7CglzZXQgaWQgW2xpbmRleCAkZGlzcCAkaV0KCWlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCldfSB7CgkgICAgc2V0IHJvdyAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkKCSAgICBpZiB7JHIwIDw9ICRyb3cgJiYgJHJvdyA8PSAkcjF9IHsKCQlpZiB7IVtoaWdobGlnaHRlZCAkcm93XX0gewoJCSAgICBib2xkZW4gJHJvdyAkZm9udAoJCX0KCQlzZXQgdmhpZ2hsaWdodHMoJHJvdykgMQoJICAgIH0KCX0KICAgIH0KICAgIHNldCB2aGxfZG9uZSAkbWF4Cn0KCnByb2MgYXNrdmhpZ2hsaWdodCB7cm93IGlkfSB7CiAgICBnbG9iYWwgaGx2aWV3IHZoaWdobGlnaHRzIGNvbW1pdHJvdyBpZGRyYXduIG1haW5mb250CgogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGhsdmlldywkaWQpXX0gewoJaWYge1tpbmZvIGV4aXN0cyBpZGRyYXduKCRpZCldICYmICFbaXNoaWdobGlnaHRlZCAkcm93XX0gewoJICAgIGJvbGRlbiAkcm93IFtjb25jYXQgJG1haW5mb250IGJvbGRdCgl9CglzZXQgdmhpZ2hsaWdodHMoJHJvdykgMQogICAgfSBlbHNlIHsKCXNldCB2aGlnaGxpZ2h0cygkcm93KSAwCiAgICB9Cn0KCnByb2MgaGZpbGVzX2NoYW5nZSB7bmFtZSBpeCBvcH0gewogICAgZ2xvYmFsIGhpZ2hsaWdodF9maWxlcyBmaWxlaGlnaGxpZ2h0IGZoaWdobGlnaHRzIGZoX3NlcmlhbAogICAgZ2xvYmFsIG1haW5mb250IGhpZ2hsaWdodF9wYXRocwoKICAgIGlmIHtbaW5mbyBleGlzdHMgZmlsZWhpZ2hsaWdodF19IHsKCSMgZGVsZXRlIHByZXZpb3VzIGhpZ2hsaWdodHMKCWNhdGNoIHtjbG9zZSAkZmlsZWhpZ2hsaWdodH0KCXVuc2V0IGZpbGVoaWdobGlnaHQKCWNhdGNoIHt1bnNldCBmaGlnaGxpZ2h0c30KCXVuYm9sZGVuCgl1bmhpZ2hsaWdodF9maWxlbGlzdAogICAgfQogICAgc2V0IGhpZ2hsaWdodF9wYXRocyB7fQogICAgYWZ0ZXIgY2FuY2VsIGRvX2ZpbGVfaGwgJGZoX3NlcmlhbAogICAgaW5jciBmaF9zZXJpYWwKICAgIGlmIHskaGlnaGxpZ2h0X2ZpbGVzIG5lIHt9fSB7CglhZnRlciAzMDAgZG9fZmlsZV9obCAkZmhfc2VyaWFsCiAgICB9Cn0KCnByb2MgbWFrZXBhdHRlcm5zIHtsfSB7CiAgICBzZXQgcmV0IHt9CiAgICBmb3JlYWNoIGUgJGwgewoJc2V0IGVlIFtzdHJpbmcgbWFwIHsiKiIgIlxcKiIgIj8iICJcXD8iICJcWyIgIlxcXFsiICJcXCIgIlxcXFwifSAkZV0KCWlmIHtbc3RyaW5nIGluZGV4ICRlZSBlbmRdIGVxICIvIn0gewoJICAgIGxhcHBlbmQgcmV0ICIkZWUqIgoJfSBlbHNlIHsKCSAgICBsYXBwZW5kIHJldCAkZWUKCSAgICBsYXBwZW5kIHJldCAiJGVlLyoiCgl9CiAgICB9CiAgICByZXR1cm4gJHJldAp9Cgpwcm9jIGRvX2ZpbGVfaGwge3NlcmlhbH0gewogICAgZ2xvYmFsIGhpZ2hsaWdodF9maWxlcyBmaWxlaGlnaGxpZ2h0IGhpZ2hsaWdodF9wYXRocyBnZHR0eXBlIGZobF9saXN0CgogICAgaWYgeyRnZHR0eXBlIGVxICJ0b3VjaGluZyBwYXRoczoifSB7CglpZiB7W2NhdGNoIHtzZXQgcGF0aHMgW3NoZWxsc3BsaXQgJGhpZ2hsaWdodF9maWxlc119XX0gcmV0dXJuCglzZXQgaGlnaGxpZ2h0X3BhdGhzIFttYWtlcGF0dGVybnMgJHBhdGhzXQoJaGlnaGxpZ2h0X2ZpbGVsaXN0CglzZXQgZ2R0YXJncyBbY29uY2F0IC0tICRwYXRoc10KICAgIH0gZWxzZSB7CglzZXQgZ2R0YXJncyBbbGlzdCAiLVMkaGlnaGxpZ2h0X2ZpbGVzIl0KICAgIH0KICAgIHNldCBjbWQgW2NvbmNhdCB8IGdpdC1kaWZmLXRyZWUgLXIgLXMgLS1zdGRpbiAkZ2R0YXJnc10KICAgIHNldCBmaWxlaGlnaGxpZ2h0IFtvcGVuICRjbWQgcitdCiAgICBmY29uZmlndXJlICRmaWxlaGlnaGxpZ2h0IC1ibG9ja2luZyAwCiAgICBmaWxlZXZlbnQgJGZpbGVoaWdobGlnaHQgcmVhZGFibGUgcmVhZGZoaWdobGlnaHQKICAgIHNldCBmaGxfbGlzdCB7fQogICAgZHJhd3Zpc2libGUKICAgIGZsdXNoaGlnaGxpZ2h0cwp9Cgpwcm9jIGZsdXNoaGlnaGxpZ2h0cyB7fSB7CiAgICBnbG9iYWwgZmlsZWhpZ2hsaWdodCBmaGxfbGlzdAoKICAgIGlmIHtbaW5mbyBleGlzdHMgZmlsZWhpZ2hsaWdodF19IHsKCWxhcHBlbmQgZmhsX2xpc3Qge30KCXB1dHMgJGZpbGVoaWdobGlnaHQgIiIKCWZsdXNoICRmaWxlaGlnaGxpZ2h0CiAgICB9Cn0KCnByb2MgYXNrZmlsZWhpZ2hsaWdodCB7cm93IGlkfSB7CiAgICBnbG9iYWwgZmlsZWhpZ2hsaWdodCBmaGlnaGxpZ2h0cyBmaGxfbGlzdAoKICAgIGxhcHBlbmQgZmhsX2xpc3QgJGlkCiAgICBzZXQgZmhpZ2hsaWdodHMoJHJvdykgLTEKICAgIHB1dHMgJGZpbGVoaWdobGlnaHQgJGlkCn0KCnByb2MgcmVhZGZoaWdobGlnaHQge30gewogICAgZ2xvYmFsIGZpbGVoaWdobGlnaHQgZmhpZ2hsaWdodHMgY29tbWl0cm93IGN1cnZpZXcgbWFpbmZvbnQgaWRkcmF3bgogICAgZ2xvYmFsIGZobF9saXN0CgogICAgd2hpbGUge1tnZXRzICRmaWxlaGlnaGxpZ2h0IGxpbmVdID49IDB9IHsKCXNldCBsaW5lIFtzdHJpbmcgdHJpbSAkbGluZV0KCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkZmhsX2xpc3QgJGxpbmVdCglpZiB7JGkgPCAwfSBjb250aW51ZQoJZm9yIHtzZXQgaiAwfSB7JGogPCAkaX0ge2luY3Igan0gewoJICAgIHNldCBpZCBbbGluZGV4ICRmaGxfbGlzdCAkal0KCSAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXX0gewoJCXNldCBmaGlnaGxpZ2h0cygkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkpIDAKCSAgICB9Cgl9CglzZXQgZmhsX2xpc3QgW2xyYW5nZSAkZmhsX2xpc3QgW2V4cHIgeyRpKzF9XSBlbmRdCglpZiB7JGxpbmUgZXEge319IGNvbnRpbnVlCglpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGxpbmUpXX0gY29udGludWUKCXNldCByb3cgJGNvbW1pdHJvdygkY3VydmlldywkbGluZSkKCWlmIHtbaW5mbyBleGlzdHMgaWRkcmF3bigkbGluZSldICYmICFbaXNoaWdobGlnaHRlZCAkcm93XX0gewoJICAgIGJvbGRlbiAkcm93IFtjb25jYXQgJG1haW5mb250IGJvbGRdCgl9CglzZXQgZmhpZ2hsaWdodHMoJHJvdykgMQogICAgfQogICAgaWYge1tlb2YgJGZpbGVoaWdobGlnaHRdfSB7CgkjIHN0cmFuZ2UuLi4KCXB1dHMgIm9vcHMsIGdpdC1kaWZmLXRyZWUgZGllZCIKCWNhdGNoIHtjbG9zZSAkZmlsZWhpZ2hsaWdodH0KCXVuc2V0IGZpbGVoaWdobGlnaHQKICAgIH0KICAgIG5leHRfaGxjb250Cn0KCnByb2MgZmluZF9jaGFuZ2Uge25hbWUgaXggb3B9IHsKICAgIGdsb2JhbCBuaGlnaGxpZ2h0cyBtYWluZm9udCBib2xkbmFtZXJvd3MKICAgIGdsb2JhbCBmaW5kc3RyaW5nIGZpbmRwYXR0ZXJuIGZpbmR0eXBlCgogICAgIyBkZWxldGUgcHJldmlvdXMgaGlnaGxpZ2h0cywgaWYgYW55CiAgICBmb3JlYWNoIHJvdyAkYm9sZG5hbWVyb3dzIHsKCWJvbGRlbl9uYW1lICRyb3cgJG1haW5mb250CiAgICB9CiAgICBzZXQgYm9sZG5hbWVyb3dzIHt9CiAgICBjYXRjaCB7dW5zZXQgbmhpZ2hsaWdodHN9CiAgICB1bmJvbGRlbgogICAgaWYgeyRmaW5kdHlwZSBuZSAiUmVnZXhwIn0gewoJc2V0IGUgW3N0cmluZyBtYXAgeyIqIiAiXFwqIiAiPyIgIlxcPyIgIlxbIiAiXFxcWyIgIlxcIiAiXFxcXCJ9IFwKCQkgICAkZmluZHN0cmluZ10KCXNldCBmaW5kcGF0dGVybiAiKiRlKiIKICAgIH0KICAgIGRyYXd2aXNpYmxlCn0KCnByb2MgYXNrZmluZGhpZ2hsaWdodCB7cm93IGlkfSB7CiAgICBnbG9iYWwgbmhpZ2hsaWdodHMgY29tbWl0aW5mbyBpZGRyYXduIG1haW5mb250CiAgICBnbG9iYWwgZmluZHN0cmluZyBmaW5kdHlwZSBmaW5kbG9jIGZpbmRwYXR0ZXJuCgogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXX0gewoJZ2V0Y29tbWl0ICRpZAogICAgfQogICAgc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQogICAgc2V0IGlzYm9sZCAwCiAgICBzZXQgZmxkdHlwZXMge0hlYWRsaW5lIEF1dGhvciBEYXRlIENvbW1pdHRlciBDRGF0ZSBDb21tZW50c30KICAgIGZvcmVhY2ggZiAkaW5mbyB0eSAkZmxkdHlwZXMgewoJaWYgeyRmaW5kbG9jIG5lICJBbGwgZmllbGRzIiAmJiAkZmluZGxvYyBuZSAkdHl9IHsKCSAgICBjb250aW51ZQoJfQoJaWYgeyRmaW5kdHlwZSBlcSAiUmVnZXhwIn0gewoJICAgIHNldCBkb2VzbWF0Y2ggW3JlZ2V4cCAkZmluZHN0cmluZyAkZl0KCX0gZWxzZWlmIHskZmluZHR5cGUgZXEgIklnbkNhc2UifSB7CgkgICAgc2V0IGRvZXNtYXRjaCBbc3RyaW5nIG1hdGNoIC1ub2Nhc2UgJGZpbmRwYXR0ZXJuICRmXQoJfSBlbHNlIHsKCSAgICBzZXQgZG9lc21hdGNoIFtzdHJpbmcgbWF0Y2ggJGZpbmRwYXR0ZXJuICRmXQoJfQoJaWYgeyRkb2VzbWF0Y2h9IHsKCSAgICBpZiB7JHR5IGVxICJBdXRob3IifSB7CgkJc2V0IGlzYm9sZCAyCgkgICAgfSBlbHNlIHsKCQlzZXQgaXNib2xkIDEKCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkZHJhd24oJGlkKV19IHsKCWlmIHskaXNib2xkICYmICFbaXNoaWdobGlnaHRlZCAkcm93XX0gewoJICAgIGJvbGRlbiAkcm93IFtjb25jYXQgJG1haW5mb250IGJvbGRdCgl9CglpZiB7JGlzYm9sZCA+PSAyfSB7CgkgICAgYm9sZGVuX25hbWUgJHJvdyBbY29uY2F0ICRtYWluZm9udCBib2xkXQoJfQogICAgfQogICAgc2V0IG5oaWdobGlnaHRzKCRyb3cpICRpc2JvbGQKfQoKcHJvYyB2cmVsX2NoYW5nZSB7bmFtZSBpeCBvcH0gewogICAgZ2xvYmFsIGhpZ2hsaWdodF9yZWxhdGVkCgogICAgcmhpZ2hsaWdodF9ub25lCiAgICBpZiB7JGhpZ2hsaWdodF9yZWxhdGVkIG5lICJOb25lIn0gewoJYWZ0ZXIgaWRsZSBkcmF3dmlzaWJsZQogICAgfQp9CgojIHByZXBhcmUgZm9yIHRlc3Rpbmcgd2hldGhlciBjb21taXRzIGFyZSBkZXNjZW5kZW50cyBvciBhbmNlc3RvcnMgb2YgYQpwcm9jIHJoaWdobGlnaHRfc2VsIHthfSB7CiAgICBnbG9iYWwgZGVzY2VuZGVudCBkZXNjX3RvZG8gYW5jZXN0b3IgYW5jX3RvZG8KICAgIGdsb2JhbCBoaWdobGlnaHRfcmVsYXRlZCByaGlnaGxpZ2h0cwoKICAgIGNhdGNoIHt1bnNldCBkZXNjZW5kZW50fQogICAgc2V0IGRlc2NfdG9kbyBbbGlzdCAkYV0KICAgIGNhdGNoIHt1bnNldCBhbmNlc3Rvcn0KICAgIHNldCBhbmNfdG9kbyBbbGlzdCAkYV0KICAgIGlmIHskaGlnaGxpZ2h0X3JlbGF0ZWQgbmUgIk5vbmUifSB7CglyaGlnaGxpZ2h0X25vbmUKCWFmdGVyIGlkbGUgZHJhd3Zpc2libGUKICAgIH0KfQoKcHJvYyByaGlnaGxpZ2h0X25vbmUge30gewogICAgZ2xvYmFsIHJoaWdobGlnaHRzCgogICAgY2F0Y2gge3Vuc2V0IHJoaWdobGlnaHRzfQogICAgdW5ib2xkZW4KfQoKcHJvYyBpc19kZXNjZW5kZW50IHthfSB7CiAgICBnbG9iYWwgY3VydmlldyBjaGlsZHJlbiBjb21taXRyb3cgZGVzY2VuZGVudCBkZXNjX3RvZG8KCiAgICBzZXQgdiAkY3VydmlldwogICAgc2V0IGxhICRjb21taXRyb3coJHYsJGEpCiAgICBzZXQgdG9kbyAkZGVzY190b2RvCiAgICBzZXQgbGVmdG92ZXIge30KICAgIHNldCBkb25lIDAKICAgIGZvciB7c2V0IGkgMH0geyRpIDwgW2xsZW5ndGggJHRvZG9dfSB7aW5jciBpfSB7CglzZXQgZG8gW2xpbmRleCAkdG9kbyAkaV0KCWlmIHskY29tbWl0cm93KCR2LCRkbykgPCAkbGF9IHsKCSAgICBsYXBwZW5kIGxlZnRvdmVyICRkbwoJICAgIGNvbnRpbnVlCgl9Cglmb3JlYWNoIG5rICRjaGlsZHJlbigkdiwkZG8pIHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBkZXNjZW5kZW50KCRuayldfSB7CgkJc2V0IGRlc2NlbmRlbnQoJG5rKSAxCgkJbGFwcGVuZCB0b2RvICRuawoJCWlmIHskbmsgZXEgJGF9IHsKCQkgICAgc2V0IGRvbmUgMQoJCX0KCSAgICB9Cgl9CglpZiB7JGRvbmV9IHsKCSAgICBzZXQgZGVzY190b2RvIFtjb25jYXQgJGxlZnRvdmVyIFtscmFuZ2UgJHRvZG8gW2V4cHIgeyRpKzF9XSBlbmRdXQoJICAgIHJldHVybgoJfQogICAgfQogICAgc2V0IGRlc2NlbmRlbnQoJGEpIDAKICAgIHNldCBkZXNjX3RvZG8gJGxlZnRvdmVyCn0KCnByb2MgaXNfYW5jZXN0b3Ige2F9IHsKICAgIGdsb2JhbCBjdXJ2aWV3IHBhcmVudGxpc3QgY29tbWl0cm93IGFuY2VzdG9yIGFuY190b2RvCgogICAgc2V0IHYgJGN1cnZpZXcKICAgIHNldCBsYSAkY29tbWl0cm93KCR2LCRhKQogICAgc2V0IHRvZG8gJGFuY190b2RvCiAgICBzZXQgbGVmdG92ZXIge30KICAgIHNldCBkb25lIDAKICAgIGZvciB7c2V0IGkgMH0geyRpIDwgW2xsZW5ndGggJHRvZG9dfSB7aW5jciBpfSB7CglzZXQgZG8gW2xpbmRleCAkdG9kbyAkaV0KCWlmIHshW2luZm8gZXhpc3RzIGNvbW1pdHJvdygkdiwkZG8pXSB8fCAkY29tbWl0cm93KCR2LCRkbykgPiAkbGF9IHsKCSAgICBsYXBwZW5kIGxlZnRvdmVyICRkbwoJICAgIGNvbnRpbnVlCgl9Cglmb3JlYWNoIG5wIFtsaW5kZXggJHBhcmVudGxpc3QgJGNvbW1pdHJvdygkdiwkZG8pXSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgYW5jZXN0b3IoJG5wKV19IHsKCQlzZXQgYW5jZXN0b3IoJG5wKSAxCgkJbGFwcGVuZCB0b2RvICRucAoJCWlmIHskbnAgZXEgJGF9IHsKCQkgICAgc2V0IGRvbmUgMQoJCX0KCSAgICB9Cgl9CglpZiB7JGRvbmV9IHsKCSAgICBzZXQgYW5jX3RvZG8gW2NvbmNhdCAkbGVmdG92ZXIgW2xyYW5nZSAkdG9kbyBbZXhwciB7JGkrMX1dIGVuZF1dCgkgICAgcmV0dXJuCgl9CiAgICB9CiAgICBzZXQgYW5jZXN0b3IoJGEpIDAKICAgIHNldCBhbmNfdG9kbyAkbGVmdG92ZXIKfQoKcHJvYyBhc2tyZWxoaWdobGlnaHQge3JvdyBpZH0gewogICAgZ2xvYmFsIGRlc2NlbmRlbnQgaGlnaGxpZ2h0X3JlbGF0ZWQgaWRkcmF3biBtYWluZm9udCByaGlnaGxpZ2h0cwogICAgZ2xvYmFsIHNlbGVjdGVkbGluZSBhbmNlc3RvcgoKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgc2V0IGlzYm9sZCAwCiAgICBpZiB7JGhpZ2hsaWdodF9yZWxhdGVkIGVxICJEZXNjZW5kZW50IiB8fAoJJGhpZ2hsaWdodF9yZWxhdGVkIGVxICJOb3QgZGVzY2VuZGVudCJ9IHsKCWlmIHshW2luZm8gZXhpc3RzIGRlc2NlbmRlbnQoJGlkKV19IHsKCSAgICBpc19kZXNjZW5kZW50ICRpZAoJfQoJaWYgeyRkZXNjZW5kZW50KCRpZCkgPT0gKCRoaWdobGlnaHRfcmVsYXRlZCBlcSAiRGVzY2VuZGVudCIpfSB7CgkgICAgc2V0IGlzYm9sZCAxCgl9CiAgICB9IGVsc2VpZiB7JGhpZ2hsaWdodF9yZWxhdGVkIGVxICJBbmNlc3RvciIgfHwKCSAgICAgICRoaWdobGlnaHRfcmVsYXRlZCBlcSAiTm90IGFuY2VzdG9yIn0gewoJaWYgeyFbaW5mbyBleGlzdHMgYW5jZXN0b3IoJGlkKV19IHsKCSAgICBpc19hbmNlc3RvciAkaWQKCX0KCWlmIHskYW5jZXN0b3IoJGlkKSA9PSAoJGhpZ2hsaWdodF9yZWxhdGVkIGVxICJBbmNlc3RvciIpfSB7CgkgICAgc2V0IGlzYm9sZCAxCgl9CiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkZHJhd24oJGlkKV19IHsKCWlmIHskaXNib2xkICYmICFbaXNoaWdobGlnaHRlZCAkcm93XX0gewoJICAgIGJvbGRlbiAkcm93IFtjb25jYXQgJG1haW5mb250IGJvbGRdCgl9CiAgICB9CiAgICBzZXQgcmhpZ2hsaWdodHMoJHJvdykgJGlzYm9sZAp9Cgpwcm9jIG5leHRfaGxjb250IHt9IHsKICAgIGdsb2JhbCBmaGxfcm93IGZobF9kaXJuIGRpc3BsYXlvcmRlciBudW1jb21taXRzCiAgICBnbG9iYWwgdmhpZ2hsaWdodHMgZmhpZ2hsaWdodHMgbmhpZ2hsaWdodHMgcmhpZ2hsaWdodHMKICAgIGdsb2JhbCBobHZpZXcgZmlsZWhpZ2hsaWdodCBmaW5kc3RyaW5nIGhpZ2hsaWdodF9yZWxhdGVkCgogICAgaWYgeyFbaW5mbyBleGlzdHMgZmhsX2Rpcm5dIHx8ICRmaGxfZGlybiA9PSAwfSByZXR1cm4KICAgIHNldCByb3cgJGZobF9yb3cKICAgIHdoaWxlIHsxfSB7CglpZiB7JHJvdyA8IDAgfHwgJHJvdyA+PSAkbnVtY29tbWl0c30gewoJICAgIGJlbGwKCSAgICBzZXQgZmhsX2Rpcm4gMAoJICAgIHJldHVybgoJfQoJc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcm93XQoJaWYge1tpbmZvIGV4aXN0cyBobHZpZXddfSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgdmhpZ2hsaWdodHMoJHJvdyldfSB7CgkJYXNrdmhpZ2hsaWdodCAkcm93ICRpZAoJICAgIH0KCSAgICBpZiB7JHZoaWdobGlnaHRzKCRyb3cpID4gMH0gYnJlYWsKCX0KCWlmIHskZmluZHN0cmluZyBuZSB7fX0gewoJICAgIGlmIHshW2luZm8gZXhpc3RzIG5oaWdobGlnaHRzKCRyb3cpXX0gewoJCWFza2ZpbmRoaWdobGlnaHQgJHJvdyAkaWQKCSAgICB9CgkgICAgaWYgeyRuaGlnaGxpZ2h0cygkcm93KSA+IDB9IGJyZWFrCgl9CglpZiB7JGhpZ2hsaWdodF9yZWxhdGVkIG5lICJOb25lIn0gewoJICAgIGlmIHshW2luZm8gZXhpc3RzIHJoaWdobGlnaHRzKCRyb3cpXX0gewoJCWFza3JlbGhpZ2hsaWdodCAkcm93ICRpZAoJICAgIH0KCSAgICBpZiB7JHJoaWdobGlnaHRzKCRyb3cpID4gMH0gYnJlYWsKCX0KCWlmIHtbaW5mbyBleGlzdHMgZmlsZWhpZ2hsaWdodF19IHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBmaGlnaGxpZ2h0cygkcm93KV19IHsKCQkjIGFzayBmb3IgYSBmZXcgbW9yZSB3aGlsZSB3ZSdyZSBhdCBpdC4uLgoJCXNldCByICRyb3cKCQlmb3Ige3NldCBuIDB9IHskbiA8IDEwMH0ge2luY3Igbn0gewoJCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBmaGlnaGxpZ2h0cygkcildfSB7CgkJCWFza2ZpbGVoaWdobGlnaHQgJHIgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyXQoJCSAgICB9CgkJICAgIGluY3IgciAkZmhsX2Rpcm4KCQkgICAgaWYgeyRyIDwgMCB8fCAkciA+PSAkbnVtY29tbWl0c30gYnJlYWsKCQl9CgkJZmx1c2hoaWdobGlnaHRzCgkgICAgfQoJICAgIGlmIHskZmhpZ2hsaWdodHMoJHJvdykgPCAwfSB7CgkJc2V0IGZobF9yb3cgJHJvdwoJCXJldHVybgoJICAgIH0KCSAgICBpZiB7JGZoaWdobGlnaHRzKCRyb3cpID4gMH0gYnJlYWsKCX0KCWluY3Igcm93ICRmaGxfZGlybgogICAgfQogICAgc2V0IGZobF9kaXJuIDAKICAgIHNlbGVjdGxpbmUgJHJvdyAxCn0KCnByb2MgbmV4dF9oaWdobGlnaHQge2Rpcm59IHsKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUgZmhsX3JvdyBmaGxfZGlybgogICAgZ2xvYmFsIGhsdmlldyBmaWxlaGlnaGxpZ2h0IGZpbmRzdHJpbmcgaGlnaGxpZ2h0X3JlbGF0ZWQKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KICAgIGlmIHshKFtpbmZvIGV4aXN0cyBobHZpZXddIHx8ICRmaW5kc3RyaW5nIG5lIHt9IHx8CgkgICRoaWdobGlnaHRfcmVsYXRlZCBuZSAiTm9uZSIgfHwgW2luZm8gZXhpc3RzIGZpbGVoaWdobGlnaHRdKX0gcmV0dXJuCiAgICBzZXQgZmhsX3JvdyBbZXhwciB7JHNlbGVjdGVkbGluZSArICRkaXJufV0KICAgIHNldCBmaGxfZGlybiAkZGlybgogICAgbmV4dF9obGNvbnQKfQoKcHJvYyBjYW5jZWxfbmV4dF9oaWdobGlnaHQge30gewogICAgZ2xvYmFsIGZobF9kaXJuCgogICAgc2V0IGZobF9kaXJuIDAKfQoKIyBHcmFwaCBsYXlvdXQgZnVuY3Rpb25zCgpwcm9jIHNob3J0aWRzIHtpZHN9IHsKICAgIHNldCByZXMge30KICAgIGZvcmVhY2ggaWQgJGlkcyB7CglpZiB7W2xsZW5ndGggJGlkXSA+IDF9IHsKCSAgICBsYXBwZW5kIHJlcyBbc2hvcnRpZHMgJGlkXQoJfSBlbHNlaWYge1tyZWdleHAge15bMC05YS1mXXs0MH0kfSAkaWRdfSB7CgkgICAgbGFwcGVuZCByZXMgW3N0cmluZyByYW5nZSAkaWQgMCA3XQoJfSBlbHNlIHsKCSAgICBsYXBwZW5kIHJlcyAkaWQKCX0KICAgIH0KICAgIHJldHVybiAkcmVzCn0KCnByb2MgaW5jcmFuZ2Uge2wgeCBvfSB7CiAgICBzZXQgbiBbbGxlbmd0aCAkbF0KICAgIHdoaWxlIHskeCA8ICRufSB7CglzZXQgZSBbbGluZGV4ICRsICR4XQoJaWYgeyRlIG5lIHt9fSB7CgkgICAgbHNldCBsICR4IFtleHByIHskZSArICRvfV0KCX0KCWluY3IgeAogICAgfQogICAgcmV0dXJuICRsCn0KCnByb2MgbnRpbWVzIHtuIG99IHsKICAgIHNldCByZXQge30KICAgIGZvciB7fSB7JG4gPiAwfSB7aW5jciBuIC0xfSB7CglsYXBwZW5kIHJldCAkbwogICAgfQogICAgcmV0dXJuICRyZXQKfQoKcHJvYyB1c2VkaW5yYW5nZSB7aWQgbDEgbDJ9IHsKICAgIGdsb2JhbCBjaGlsZHJlbiBjb21taXRyb3cgY2hpbGRsaXN0IGN1cnZpZXcKCiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXX0gewoJc2V0IHIgJGNvbW1pdHJvdygkY3VydmlldywkaWQpCglpZiB7JGwxIDw9ICRyICYmICRyIDw9ICRsMn0gewoJICAgIHJldHVybiBbZXhwciB7JHIgLSAkbDEgKyAxfV0KCX0KCXNldCBraWRzIFtsaW5kZXggJGNoaWxkbGlzdCAkcl0KICAgIH0gZWxzZSB7CglzZXQga2lkcyAkY2hpbGRyZW4oJGN1cnZpZXcsJGlkKQogICAgfQogICAgZm9yZWFjaCBjICRraWRzIHsKCXNldCByICRjb21taXRyb3coJGN1cnZpZXcsJGMpCglpZiB7JGwxIDw9ICRyICYmICRyIDw9ICRsMn0gewoJICAgIHJldHVybiBbZXhwciB7JHIgLSAkbDEgKyAxfV0KCX0KICAgIH0KICAgIHJldHVybiAwCn0KCnByb2Mgc2FuaXR5IHtyb3cge2Z1bGwgMH19IHsKICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cwoKICAgIHNldCBjb2wgLTEKICAgIHNldCBpZHMgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddCiAgICBmb3JlYWNoIGlkICRpZHMgewoJaW5jciBjb2wKCWlmIHskaWQgZXEge319IGNvbnRpbnVlCglpZiB7JGNvbCA8IFtsbGVuZ3RoICRpZHNdIC0gMSAmJgoJICAgIFtsc2VhcmNoIC1leGFjdCAtc3RhcnQgW2V4cHIgeyRjb2wrMX1dICRpZHMgJGlkXSA+PSAwfSB7CgkgICAgcHV0cyAib29wczogW3Nob3J0aWRzICRpZF0gcmVwZWF0ZWQgaW4gcm93ICRyb3cgY29sICRjb2w6IHtbc2hvcnRpZHMgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddXX0iCgl9CglzZXQgbyBbbGluZGV4ICRyb3dvZmZzZXRzICRyb3cgJGNvbF0KCXNldCB5ICRyb3cKCXNldCB4ICRjb2wKCXdoaWxlIHskbyBuZSB7fX0gewoJICAgIGluY3IgeSAtMQoJICAgIGluY3IgeCAkbwoJICAgIGlmIHtbbGluZGV4ICRyb3dpZGxpc3QgJHkgJHhdICE9ICRpZH0gewoJCXB1dHMgIm9vcHM6IHJvd29mZnNldHMgd3JvbmcgYXQgcm93IFtleHByIHskeSsxfV0gY29sIFtleHByIHskeC0kb31dIgoJCXB1dHMgIiAgaWQ9W3Nob3J0aWRzICRpZF0gY2hlY2sgc3RhcnRlZCBhdCByb3cgJHJvdyIKCQlmb3Ige3NldCBpICRyb3d9IHskaSA+PSAkeX0ge2luY3IgaSAtMX0gewoJCSAgICBwdXRzICIgIHJvdyAkaSBpZHM9e1tzaG9ydGlkcyBbbGluZGV4ICRyb3dpZGxpc3QgJGldXX0gb2Zmcz17W2xpbmRleCAkcm93b2Zmc2V0cyAkaV19IgoJCX0KCQlicmVhawoJICAgIH0KCSAgICBpZiB7ISRmdWxsfSBicmVhawoJICAgIHNldCBvIFtsaW5kZXggJHJvd29mZnNldHMgJHkgJHhdCgl9CiAgICB9Cn0KCnByb2MgbWFrZXVwYXJyb3cge29pZCB4IHkgen0gewogICAgZ2xvYmFsIHJvd2lkbGlzdCByb3dvZmZzZXRzIHVwYXJyb3dsZW4gaWRyb3dyYW5nZXMKCiAgICBmb3Ige3NldCBpIDF9IHskaSA8ICR1cGFycm93bGVuICYmICR5ID4gMX0ge2luY3IgaX0gewoJaW5jciB5IC0xCglpbmNyIHggJHoKCXNldCBvZmYwIFtsaW5kZXggJHJvd29mZnNldHMgJHldCglmb3Ige3NldCB4MCAkeH0gezF9IHtpbmNyIHgwfSB7CgkgICAgaWYgeyR4MCA+PSBbbGxlbmd0aCAkb2ZmMF19IHsKCQlzZXQgeDAgW2xsZW5ndGggW2xpbmRleCAkcm93b2Zmc2V0cyBbZXhwciB7JHktMX1dXV0KCQlicmVhawoJICAgIH0KCSAgICBzZXQgeiBbbGluZGV4ICRvZmYwICR4MF0KCSAgICBpZiB7JHogbmUge319IHsKCQlpbmNyIHgwICR6CgkJYnJlYWsKCSAgICB9Cgl9CglzZXQgeiBbZXhwciB7JHgwIC0gJHh9XQoJbHNldCByb3dpZGxpc3QgJHkgW2xpbnNlcnQgW2xpbmRleCAkcm93aWRsaXN0ICR5XSAkeCAkb2lkXQoJbHNldCByb3dvZmZzZXRzICR5IFtsaW5zZXJ0IFtsaW5kZXggJHJvd29mZnNldHMgJHldICR4ICR6XQogICAgfQogICAgc2V0IHRtcCBbbHJlcGxhY2UgW2xpbmRleCAkcm93b2Zmc2V0cyAkeV0gJHggJHgge31dCiAgICBsc2V0IHJvd29mZnNldHMgJHkgW2luY3JhbmdlICR0bXAgW2V4cHIgeyR4KzF9XSAtMV0KICAgIGxhcHBlbmQgaWRyb3dyYW5nZXMoJG9pZCkgJHkKfQoKcHJvYyBpbml0bGF5b3V0IHt9IHsKICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cyBkaXNwbGF5b3JkZXIgY29tbWl0bGlzdGVkCiAgICBnbG9iYWwgcm93bGFpZG91dCByb3dvcHRpbQogICAgZ2xvYmFsIGlkaW5saXN0IHJvd2NoayByb3dyYW5nZWxpc3QgaWRyb3dyYW5nZXMKICAgIGdsb2JhbCBudW1jb21taXRzIGNhbnZ4bWF4IGNhbnYKICAgIGdsb2JhbCBuZXh0Y29sb3IKICAgIGdsb2JhbCBwYXJlbnRsaXN0IGNoaWxkbGlzdCBjaGlsZHJlbgogICAgZ2xvYmFsIGNvbG9ybWFwIHJvd3RleHR4CiAgICBnbG9iYWwgbGluZXNlZ2VuZHMKCiAgICBzZXQgbnVtY29tbWl0cyAwCiAgICBzZXQgZGlzcGxheW9yZGVyIHt9CiAgICBzZXQgY29tbWl0bGlzdGVkIHt9CiAgICBzZXQgcGFyZW50bGlzdCB7fQogICAgc2V0IGNoaWxkbGlzdCB7fQogICAgc2V0IHJvd3JhbmdlbGlzdCB7fQogICAgc2V0IG5leHRjb2xvciAwCiAgICBzZXQgcm93aWRsaXN0IHt7fX0KICAgIHNldCByb3dvZmZzZXRzIHt7fX0KICAgIGNhdGNoIHt1bnNldCBpZGlubGlzdH0KICAgIGNhdGNoIHt1bnNldCByb3djaGt9CiAgICBzZXQgcm93bGFpZG91dCAwCiAgICBzZXQgcm93b3B0aW0gMAogICAgc2V0IGNhbnZ4bWF4IFskY2FudiBjZ2V0IC13aWR0aF0KICAgIGNhdGNoIHt1bnNldCBjb2xvcm1hcH0KICAgIGNhdGNoIHt1bnNldCByb3d0ZXh0eH0KICAgIGNhdGNoIHt1bnNldCBpZHJvd3Jhbmdlc30KICAgIHNldCBsaW5lc2VnZW5kcyB7fQp9Cgpwcm9jIHNldGNhbnZzY3JvbGwge30gewogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMgbnVtY29tbWl0cyBsaW5lc3BjIGNhbnZ4bWF4IGNhbnZ5MAoKICAgIHNldCB5bWF4IFtleHByIHskY2FudnkwICsgKCRudW1jb21taXRzIC0gMC41KSAqICRsaW5lc3BjICsgMn1dCiAgICAkY2FudiBjb25mIC1zY3JvbGxyZWdpb24gW2xpc3QgMCAwICRjYW52eG1heCAkeW1heF0KICAgICRjYW52MiBjb25mIC1zY3JvbGxyZWdpb24gW2xpc3QgMCAwIDAgJHltYXhdCiAgICAkY2FudjMgY29uZiAtc2Nyb2xscmVnaW9uIFtsaXN0IDAgMCAwICR5bWF4XQp9Cgpwcm9jIHZpc2libGVyb3dzIHt9IHsKICAgIGdsb2JhbCBjYW52IG51bWNvbW1pdHMgbGluZXNwYwoKICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIGlmIHskeW1heCBlcSB7fSB8fCAkeW1heCA9PSAwfSByZXR1cm4KICAgIHNldCBmIFskY2FudiB5dmlld10KICAgIHNldCB5MCBbZXhwciB7aW50KFtsaW5kZXggJGYgMF0gKiAkeW1heCl9XQogICAgc2V0IHIwIFtleHByIHtpbnQoKCR5MCAtIDMpIC8gJGxpbmVzcGMpIC0gMX1dCiAgICBpZiB7JHIwIDwgMH0gewoJc2V0IHIwIDAKICAgIH0KICAgIHNldCB5MSBbZXhwciB7aW50KFtsaW5kZXggJGYgMV0gKiAkeW1heCl9XQogICAgc2V0IHIxIFtleHByIHtpbnQoKCR5MSAtIDMpIC8gJGxpbmVzcGMpICsgMX1dCiAgICBpZiB7JHIxID49ICRudW1jb21taXRzfSB7CglzZXQgcjEgW2V4cHIgeyRudW1jb21taXRzIC0gMX1dCiAgICB9CiAgICByZXR1cm4gW2xpc3QgJHIwICRyMV0KfQoKcHJvYyBsYXlvdXRtb3JlIHt0bWF4fSB7CiAgICBnbG9iYWwgcm93bGFpZG91dCByb3dvcHRpbSBjb21taXRpZHggbnVtY29tbWl0cyBvcHRpbV9kZWxheQogICAgZ2xvYmFsIHVwYXJyb3dsZW4gY3VydmlldwoKICAgIHdoaWxlIHsxfSB7CglpZiB7JHJvd29wdGltIC0gJG9wdGltX2RlbGF5ID4gJG51bWNvbW1pdHN9IHsKCSAgICBzaG93c3R1ZmYgW2V4cHIgeyRyb3dvcHRpbSAtICRvcHRpbV9kZWxheX1dCgl9IGVsc2VpZiB7JHJvd2xhaWRvdXQgLSAkdXBhcnJvd2xlbiAtIDEgPiAkcm93b3B0aW19IHsKCSAgICBzZXQgbnIgW2V4cHIgeyRyb3dsYWlkb3V0IC0gJHVwYXJyb3dsZW4gLSAxIC0gJHJvd29wdGltfV0KCSAgICBpZiB7JG5yID4gMTAwfSB7CgkJc2V0IG5yIDEwMAoJICAgIH0KCSAgICBvcHRpbWl6ZV9yb3dzICRyb3dvcHRpbSAwIFtleHByIHskcm93b3B0aW0gKyAkbnJ9XQoJICAgIGluY3Igcm93b3B0aW0gJG5yCgl9IGVsc2VpZiB7JGNvbW1pdGlkeCgkY3VydmlldykgPiAkcm93bGFpZG91dH0gewoJICAgIHNldCBuciBbZXhwciB7JGNvbW1pdGlkeCgkY3VydmlldykgLSAkcm93bGFpZG91dH1dCgkgICAgIyBtYXkgbmVlZCB0byBpbmNyZWFzZSB0aGlzIHRocmVzaG9sZCBpZiB1cGFycm93bGVuIG9yCgkgICAgIyBtaW5nYXBsZW4gYXJlIGluY3JlYXNlZC4uLgoJICAgIGlmIHskbnIgPiAxNTB9IHsKCQlzZXQgbnIgMTUwCgkgICAgfQoJICAgIHNldCByb3cgJHJvd2xhaWRvdXQKCSAgICBzZXQgcm93bGFpZG91dCBbbGF5b3V0cm93cyAkcm93IFtleHByIHskcm93ICsgJG5yfV0gMF0KCSAgICBpZiB7JHJvd2xhaWRvdXQgPT0gJHJvd30gewoJCXJldHVybiAwCgkgICAgfQoJfSBlbHNlIHsKCSAgICByZXR1cm4gMAoJfQoJaWYgeyR0bWF4IG5lIHt9ICYmIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJHRtYXh9IHsKCSAgICByZXR1cm4gMQoJfQogICAgfQp9Cgpwcm9jIHNob3dzdHVmZiB7Y2Fuc2hvd30gewogICAgZ2xvYmFsIG51bWNvbW1pdHMgY29tbWl0cm93IHBlbmRpbmdfc2VsZWN0IHNlbGVjdGVkbGluZQogICAgZ2xvYmFsIGxpbmVzZWdlbmRzIGlkcm93cmFuZ2VzIGlkcmFuZ2VkcmF3biBjdXJ2aWV3CgogICAgaWYgeyRudW1jb21taXRzID09IDB9IHsKCWdsb2JhbCBwaGFzZQoJc2V0IHBoYXNlICJpbmNyZHJhdyIKCWFsbGNhbnZzIGRlbGV0ZSBhbGwKICAgIH0KICAgIHNldCByb3cgJG51bWNvbW1pdHMKICAgIHNldCBudW1jb21taXRzICRjYW5zaG93CiAgICBzZXRjYW52c2Nyb2xsCiAgICBzZXQgcm93cyBbdmlzaWJsZXJvd3NdCiAgICBzZXQgcjAgW2xpbmRleCAkcm93cyAwXQogICAgc2V0IHIxIFtsaW5kZXggJHJvd3MgMV0KICAgIHNldCBzZWxyb3cgLTEKICAgIGZvciB7c2V0IHIgJHJvd30geyRyIDwgJGNhbnNob3d9IHtpbmNyIHJ9IHsKCWZvcmVhY2ggaWQgW2xpbmRleCAkbGluZXNlZ2VuZHMgW2V4cHIgeyRyKzF9XV0gewoJICAgIHNldCBpIC0xCgkgICAgZm9yZWFjaCB7cyBlfSBbcm93cmFuZ2VzICRpZF0gewoJCWluY3IgaQoJCWlmIHskZSBuZSB7fSAmJiAkZSA8ICRudW1jb21taXRzICYmICRzIDw9ICRyMSAmJiAkZSA+PSAkcjAKCQkgICAgJiYgIVtpbmZvIGV4aXN0cyBpZHJhbmdlZHJhd24oJGlkLCRpKV19IHsKCQkgICAgZHJhd2xpbmVzZWcgJGlkICRpCgkJICAgIHNldCBpZHJhbmdlZHJhd24oJGlkLCRpKSAxCgkJfQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHskY2Fuc2hvdyA+ICRyMX0gewoJc2V0IGNhbnNob3cgJHIxCiAgICB9CiAgICB3aGlsZSB7JHJvdyA8ICRjYW5zaG93fSB7CglkcmF3Y21pdHJvdyAkcm93CglpbmNyIHJvdwogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBwZW5kaW5nX3NlbGVjdF0gJiYKCVtpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJHBlbmRpbmdfc2VsZWN0KV0gJiYKCSRjb21taXRyb3coJGN1cnZpZXcsJHBlbmRpbmdfc2VsZWN0KSA8ICRudW1jb21taXRzfSB7CglzZWxlY3RsaW5lICRjb21taXRyb3coJGN1cnZpZXcsJHBlbmRpbmdfc2VsZWN0KSAxCiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdICYmICFbaW5mbyBleGlzdHMgcGVuZGluZ19zZWxlY3RdfSB7CglzZWxlY3RsaW5lIDAgMQogICAgfQp9Cgpwcm9jIGxheW91dHJvd3Mge3JvdyBlbmRyb3cgbGFzdH0gewogICAgZ2xvYmFsIHJvd2lkbGlzdCByb3dvZmZzZXRzIGRpc3BsYXlvcmRlcgogICAgZ2xvYmFsIHVwYXJyb3dsZW4gZG93bmFycm93bGVuIG1heHdpZHRoIG1pbmdhcGxlbgogICAgZ2xvYmFsIGNoaWxkbGlzdCBwYXJlbnRsaXN0CiAgICBnbG9iYWwgaWRyb3dyYW5nZXMgbGluZXNlZ2VuZHMKICAgIGdsb2JhbCBjb21taXRpZHggY3VydmlldwogICAgZ2xvYmFsIGlkaW5saXN0IHJvd2NoayByb3dyYW5nZWxpc3QKCiAgICBzZXQgaWRsaXN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XQogICAgc2V0IG9mZnMgW2xpbmRleCAkcm93b2Zmc2V0cyAkcm93XQogICAgd2hpbGUgeyRyb3cgPCAkZW5kcm93fSB7CglzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyb3ddCglzZXQgb2xkb2xkcyB7fQoJc2V0IG5ld29sZHMge30KCWZvcmVhY2ggcCBbbGluZGV4ICRwYXJlbnRsaXN0ICRyb3ddIHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBpZGlubGlzdCgkcCldfSB7CgkJbGFwcGVuZCBuZXdvbGRzICRwCgkgICAgfSBlbHNlaWYgeyEkaWRpbmxpc3QoJHApfSB7CgkJbGFwcGVuZCBvbGRvbGRzICRwCgkgICAgfQoJfQoJc2V0IGxzZSB7fQoJc2V0IG5ldiBbZXhwciB7W2xsZW5ndGggJGlkbGlzdF0gKyBbbGxlbmd0aCAkbmV3b2xkc10KCQkgICAgICAgKyBbbGxlbmd0aCAkb2xkb2xkc10gLSAkbWF4d2lkdGggKyAxfV0KCWlmIHskbmV2ID4gMH0gewoJICAgIGlmIHshJGxhc3QgJiYKCQkkcm93ICsgJHVwYXJyb3dsZW4gKyAkbWluZ2FwbGVuID49ICRjb21taXRpZHgoJGN1cnZpZXcpfSBicmVhawoJICAgIGZvciB7c2V0IHggW2xsZW5ndGggJGlkbGlzdF19IHtbaW5jciB4IC0xXSA+PSAwfSB7fSB7CgkJc2V0IGkgW2xpbmRleCAkaWRsaXN0ICR4XQoJCWlmIHshW2luZm8gZXhpc3RzIHJvd2NoaygkaSldIHx8ICRyb3cgPj0gJHJvd2NoaygkaSl9IHsKCQkgICAgc2V0IHIgW3VzZWRpbnJhbmdlICRpIFtleHByIHskcm93IC0gJGRvd25hcnJvd2xlbn1dIFwKCQkJICAgICAgIFtleHByIHskcm93ICsgJHVwYXJyb3dsZW4gKyAkbWluZ2FwbGVufV1dCgkJICAgIGlmIHskciA9PSAwfSB7CgkJCXNldCBpZGxpc3QgW2xyZXBsYWNlICRpZGxpc3QgJHggJHhdCgkJCXNldCBvZmZzIFtscmVwbGFjZSAkb2ZmcyAkeCAkeF0KCQkJc2V0IG9mZnMgW2luY3JhbmdlICRvZmZzICR4IDFdCgkJCXNldCBpZGlubGlzdCgkaSkgMAoJCQlzZXQgcm0xIFtleHByIHskcm93IC0gMX1dCgkJCWxhcHBlbmQgbHNlICRpCgkJCWxhcHBlbmQgaWRyb3dyYW5nZXMoJGkpICRybTEKCQkJaWYge1tpbmNyIG5ldiAtMV0gPD0gMH0gYnJlYWsKCQkJY29udGludWUKCQkgICAgfQoJCSAgICBzZXQgcm93Y2hrKCRpZCkgW2V4cHIgeyRyb3cgKyAkcn1dCgkJfQoJICAgIH0KCSAgICBsc2V0IHJvd2lkbGlzdCAkcm93ICRpZGxpc3QKCSAgICBsc2V0IHJvd29mZnNldHMgJHJvdyAkb2ZmcwoJfQoJbGFwcGVuZCBsaW5lc2VnZW5kcyAkbHNlCglzZXQgY29sIFtsc2VhcmNoIC1leGFjdCAkaWRsaXN0ICRpZF0KCWlmIHskY29sIDwgMH0gewoJICAgIHNldCBjb2wgW2xsZW5ndGggJGlkbGlzdF0KCSAgICBsYXBwZW5kIGlkbGlzdCAkaWQKCSAgICBsc2V0IHJvd2lkbGlzdCAkcm93ICRpZGxpc3QKCSAgICBzZXQgeiB7fQoJICAgIGlmIHtbbGluZGV4ICRjaGlsZGxpc3QgJHJvd10gbmUge319IHsKCQlzZXQgeiBbZXhwciB7W2xsZW5ndGggW2xpbmRleCAkcm93aWRsaXN0IFtleHByIHskcm93LTF9XV1dIC0gJGNvbH1dCgkJdW5zZXQgaWRpbmxpc3QoJGlkKQoJICAgIH0KCSAgICBsYXBwZW5kIG9mZnMgJHoKCSAgICBsc2V0IHJvd29mZnNldHMgJHJvdyAkb2ZmcwoJICAgIGlmIHskeiBuZSB7fX0gewoJCW1ha2V1cGFycm93ICRpZCAkY29sICRyb3cgJHoKCSAgICB9Cgl9IGVsc2UgewoJICAgIHVuc2V0IGlkaW5saXN0KCRpZCkKCX0KCXNldCByYW5nZXMge30KCWlmIHtbaW5mbyBleGlzdHMgaWRyb3dyYW5nZXMoJGlkKV19IHsKCSAgICBzZXQgcmFuZ2VzICRpZHJvd3JhbmdlcygkaWQpCgkgICAgbGFwcGVuZCByYW5nZXMgJHJvdwoJICAgIHVuc2V0IGlkcm93cmFuZ2VzKCRpZCkKCX0KCWxhcHBlbmQgcm93cmFuZ2VsaXN0ICRyYW5nZXMKCWluY3Igcm93CglzZXQgb2ZmcyBbbnRpbWVzIFtsbGVuZ3RoICRpZGxpc3RdIDBdCglzZXQgbCBbbGxlbmd0aCAkbmV3b2xkc10KCXNldCBpZGxpc3QgW2V2YWwgbHJlcGxhY2UgXCRpZGxpc3QgJGNvbCAkY29sICRuZXdvbGRzXQoJc2V0IG8gMAoJaWYgeyRsICE9IDF9IHsKCSAgICBzZXQgb2ZmcyBbbHJhbmdlICRvZmZzIDAgW2V4cHIgeyRjb2wgLSAxfV1dCgkgICAgZm9yZWFjaCB4ICRuZXdvbGRzIHsKCQlsYXBwZW5kIG9mZnMge30KCQlpbmNyIG8gLTEKCSAgICB9CgkgICAgaW5jciBvCgkgICAgc2V0IHRtcCBbZXhwciB7W2xsZW5ndGggJGlkbGlzdF0gLSBbbGxlbmd0aCAkb2Zmc119XQoJICAgIGlmIHskdG1wID4gMH0gewoJCXNldCBvZmZzIFtjb25jYXQgJG9mZnMgW250aW1lcyAkdG1wICRvXV0KCSAgICB9Cgl9IGVsc2UgewoJICAgIGxzZXQgb2ZmcyAkY29sIHt9Cgl9Cglmb3JlYWNoIGkgJG5ld29sZHMgewoJICAgIHNldCBpZGlubGlzdCgkaSkgMQoJICAgIHNldCBpZHJvd3JhbmdlcygkaSkgJHJvdwoJfQoJaW5jciBjb2wgJGwKCWZvcmVhY2ggb2lkICRvbGRvbGRzIHsKCSAgICBzZXQgaWRpbmxpc3QoJG9pZCkgMQoJICAgIHNldCBpZGxpc3QgW2xpbnNlcnQgJGlkbGlzdCAkY29sICRvaWRdCgkgICAgc2V0IG9mZnMgW2xpbnNlcnQgJG9mZnMgJGNvbCAkb10KCSAgICBtYWtldXBhcnJvdyAkb2lkICRjb2wgJHJvdyAkbwoJICAgIGluY3IgY29sCgl9CglsYXBwZW5kIHJvd2lkbGlzdCAkaWRsaXN0CglsYXBwZW5kIHJvd29mZnNldHMgJG9mZnMKICAgIH0KICAgIHJldHVybiAkcm93Cn0KCnByb2MgYWRkZXh0cmFpZCB7aWQgcm93fSB7CiAgICBnbG9iYWwgZGlzcGxheW9yZGVyIGNvbW1pdHJvdyBjb21taXRpbmZvCiAgICBnbG9iYWwgY29tbWl0aWR4IGNvbW1pdGxpc3RlZAogICAgZ2xvYmFsIHBhcmVudGxpc3QgY2hpbGRsaXN0IGNoaWxkcmVuIGN1cnZpZXcKCiAgICBpbmNyIGNvbW1pdGlkeCgkY3VydmlldykKICAgIGxhcHBlbmQgZGlzcGxheW9yZGVyICRpZAogICAgbGFwcGVuZCBjb21taXRsaXN0ZWQgMAogICAgbGFwcGVuZCBwYXJlbnRsaXN0IHt9CiAgICBzZXQgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkgJHJvdwogICAgcmVhZGNvbW1pdCAkaWQKICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV19IHsKCXNldCBjb21taXRpbmZvKCRpZCkgeyJObyBjb21taXQgaW5mb3JtYXRpb24gYXZhaWxhYmxlIn0KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIGNoaWxkcmVuKCRjdXJ2aWV3LCRpZCldfSB7CglzZXQgY2hpbGRyZW4oJGN1cnZpZXcsJGlkKSB7fQogICAgfQogICAgbGFwcGVuZCBjaGlsZGxpc3QgJGNoaWxkcmVuKCRjdXJ2aWV3LCRpZCkKfQoKcHJvYyBsYXlvdXR0YWlsIHt9IHsKICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cyBpZGlubGlzdCBjb21taXRpZHggY3VydmlldwogICAgZ2xvYmFsIGlkcm93cmFuZ2VzIHJvd3JhbmdlbGlzdAoKICAgIHNldCByb3cgJGNvbW1pdGlkeCgkY3VydmlldykKICAgIHNldCBpZGxpc3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddCiAgICB3aGlsZSB7JGlkbGlzdCBuZSB7fX0gewoJc2V0IGNvbCBbZXhwciB7W2xsZW5ndGggJGlkbGlzdF0gLSAxfV0KCXNldCBpZCBbbGluZGV4ICRpZGxpc3QgJGNvbF0KCWFkZGV4dHJhaWQgJGlkICRyb3cKCXVuc2V0IGlkaW5saXN0KCRpZCkKCWxhcHBlbmQgaWRyb3dyYW5nZXMoJGlkKSAkcm93CglsYXBwZW5kIHJvd3JhbmdlbGlzdCAkaWRyb3dyYW5nZXMoJGlkKQoJdW5zZXQgaWRyb3dyYW5nZXMoJGlkKQoJaW5jciByb3cKCXNldCBvZmZzIFtudGltZXMgJGNvbCAwXQoJc2V0IGlkbGlzdCBbbHJlcGxhY2UgJGlkbGlzdCAkY29sICRjb2xdCglsYXBwZW5kIHJvd2lkbGlzdCAkaWRsaXN0CglsYXBwZW5kIHJvd29mZnNldHMgJG9mZnMKICAgIH0KCiAgICBmb3JlYWNoIGlkIFthcnJheSBuYW1lcyBpZGlubGlzdF0gewoJYWRkZXh0cmFpZCAkaWQgJHJvdwoJbHNldCByb3dpZGxpc3QgJHJvdyBbbGlzdCAkaWRdCglsc2V0IHJvd29mZnNldHMgJHJvdyAwCgltYWtldXBhcnJvdyAkaWQgMCAkcm93IDAKCWxhcHBlbmQgaWRyb3dyYW5nZXMoJGlkKSAkcm93CglsYXBwZW5kIHJvd3JhbmdlbGlzdCAkaWRyb3dyYW5nZXMoJGlkKQoJdW5zZXQgaWRyb3dyYW5nZXMoJGlkKQoJaW5jciByb3cKCWxhcHBlbmQgcm93aWRsaXN0IHt9CglsYXBwZW5kIHJvd29mZnNldHMge30KICAgIH0KfQoKcHJvYyBpbnNlcnRfcGFkIHtyb3cgY29sIG5wYWR9IHsKICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cwoKICAgIHNldCBwYWQgW250aW1lcyAkbnBhZCB7fV0KICAgIGxzZXQgcm93aWRsaXN0ICRyb3cgW2V2YWwgbGluc2VydCBbbGlzdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd11dICRjb2wgJHBhZF0KICAgIHNldCB0bXAgW2V2YWwgbGluc2VydCBbbGlzdCBbbGluZGV4ICRyb3dvZmZzZXRzICRyb3ddXSAkY29sICRwYWRdCiAgICBsc2V0IHJvd29mZnNldHMgJHJvdyBbaW5jcmFuZ2UgJHRtcCBbZXhwciB7JGNvbCArICRucGFkfV0gW2V4cHIgey0kbnBhZH1dXQp9Cgpwcm9jIG9wdGltaXplX3Jvd3Mge3JvdyBjb2wgZW5kcm93fSB7CiAgICBnbG9iYWwgcm93aWRsaXN0IHJvd29mZnNldHMgaWRyb3dyYW5nZXMgZGlzcGxheW9yZGVyCgogICAgZm9yIHt9IHskcm93IDwgJGVuZHJvd30ge2luY3Igcm93fSB7CglzZXQgaWRsaXN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XQoJc2V0IG9mZnMgW2xpbmRleCAkcm93b2Zmc2V0cyAkcm93XQoJc2V0IGhhc3BhZCAwCglmb3Ige30geyRjb2wgPCBbbGxlbmd0aCAkb2Zmc119IHtpbmNyIGNvbH0gewoJICAgIGlmIHtbbGluZGV4ICRpZGxpc3QgJGNvbF0gZXEge319IHsKCQlzZXQgaGFzcGFkIDEKCQljb250aW51ZQoJICAgIH0KCSAgICBzZXQgeiBbbGluZGV4ICRvZmZzICRjb2xdCgkgICAgaWYgeyR6IGVxIHt9fSBjb250aW51ZQoJICAgIHNldCBpc2Fycm93IDAKCSAgICBzZXQgeDAgW2V4cHIgeyRjb2wgKyAken1dCgkgICAgc2V0IHkwIFtleHByIHskcm93IC0gMX1dCgkgICAgc2V0IHowIFtsaW5kZXggJHJvd29mZnNldHMgJHkwICR4MF0KCSAgICBpZiB7JHowIGVxIHt9fSB7CgkJc2V0IGlkIFtsaW5kZXggJGlkbGlzdCAkY29sXQoJCXNldCByYW5nZXMgW3Jvd3JhbmdlcyAkaWRdCgkJaWYgeyRyYW5nZXMgbmUge30gJiYgJHkwID4gW2xpbmRleCAkcmFuZ2VzIDBdfSB7CgkJICAgIHNldCBpc2Fycm93IDEKCQl9CgkgICAgfQoJICAgIGlmIHskeiA8IC0xIHx8ICgkeiA8IDAgJiYgJGlzYXJyb3cpfSB7CgkJc2V0IG5wYWQgW2V4cHIgey0xIC0gJHogKyAkaXNhcnJvd31dCgkJc2V0IG9mZnMgW2luY3JhbmdlICRvZmZzICRjb2wgJG5wYWRdCgkJaW5zZXJ0X3BhZCAkeTAgJHgwICRucGFkCgkJaWYgeyR5MCA+IDB9IHsKCQkgICAgb3B0aW1pemVfcm93cyAkeTAgJHgwICRyb3cKCQl9CgkJc2V0IHogW2xpbmRleCAkb2ZmcyAkY29sXQoJCXNldCB4MCBbZXhwciB7JGNvbCArICR6fV0KCQlzZXQgejAgW2xpbmRleCAkcm93b2Zmc2V0cyAkeTAgJHgwXQoJICAgIH0gZWxzZWlmIHskeiA+IDEgfHwgKCR6ID4gMCAmJiAkaXNhcnJvdyl9IHsKCQlzZXQgbnBhZCBbZXhwciB7JHogLSAxICsgJGlzYXJyb3d9XQoJCXNldCB5MSBbZXhwciB7JHJvdyArIDF9XQoJCXNldCBvZmZzMiBbbGluZGV4ICRyb3dvZmZzZXRzICR5MV0KCQlzZXQgeDEgLTEKCQlmb3JlYWNoIHogJG9mZnMyIHsKCQkgICAgaW5jciB4MQoJCSAgICBpZiB7JHogZXEge30gfHwgJHgxICsgJHogPCAkY29sfSBjb250aW51ZQoJCSAgICBpZiB7JHgxICsgJHogPiAkY29sfSB7CgkJCWluY3IgbnBhZAoJCSAgICB9CgkJICAgIGxzZXQgcm93b2Zmc2V0cyAkeTEgW2luY3JhbmdlICRvZmZzMiAkeDEgJG5wYWRdCgkJICAgIGJyZWFrCgkJfQoJCXNldCBwYWQgW250aW1lcyAkbnBhZCB7fV0KCQlzZXQgaWRsaXN0IFtldmFsIGxpbnNlcnQgXCRpZGxpc3QgJGNvbCAkcGFkXQoJCXNldCB0bXAgW2V2YWwgbGluc2VydCBcJG9mZnMgJGNvbCAkcGFkXQoJCWluY3IgY29sICRucGFkCgkJc2V0IG9mZnMgW2luY3JhbmdlICR0bXAgJGNvbCBbZXhwciB7LSRucGFkfV1dCgkJc2V0IHogW2xpbmRleCAkb2ZmcyAkY29sXQoJCXNldCBoYXNwYWQgMQoJICAgIH0KCSAgICBpZiB7JHowIGVxIHt9ICYmICEkaXNhcnJvd30gewoJCSMgdGhpcyBsaW5lIGxpbmtzIHRvIGl0cyBmaXJzdCBjaGlsZCBvbiByb3cgJHJvdy0yCgkJc2V0IHJtMiBbZXhwciB7JHJvdyAtIDJ9XQoJCXNldCBpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHJtMl0KCQlzZXQgeGMgW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm0yXSAkaWRdCgkJaWYgeyR4YyA+PSAwfSB7CgkJICAgIHNldCB6MCBbZXhwciB7JHhjIC0gJHgwfV0KCQl9CgkgICAgfQoJICAgIGlmIHskejAgbmUge30gJiYgJHogPCAwICYmICR6MCA+IDB9IHsKCQlpbnNlcnRfcGFkICR5MCAkeDAgMQoJCXNldCBvZmZzIFtpbmNyYW5nZSAkb2ZmcyAkY29sIDFdCgkJb3B0aW1pemVfcm93cyAkeTAgW2V4cHIgeyR4MCArIDF9XSAkcm93CgkgICAgfQoJfQoJaWYgeyEkaGFzcGFkfSB7CgkgICAgc2V0IG8ge30KCSAgICBmb3Ige3NldCBjb2wgW2xsZW5ndGggJGlkbGlzdF19IHtbaW5jciBjb2wgLTFdID49IDB9IHt9IHsKCQlzZXQgbyBbbGluZGV4ICRvZmZzICRjb2xdCgkJaWYgeyRvIGVxIHt9fSB7CgkJICAgICMgY2hlY2sgaWYgdGhpcyBpcyB0aGUgbGluayB0byB0aGUgZmlyc3QgY2hpbGQKCQkgICAgc2V0IGlkIFtsaW5kZXggJGlkbGlzdCAkY29sXQoJCSAgICBzZXQgcmFuZ2VzIFtyb3dyYW5nZXMgJGlkXQoJCSAgICBpZiB7JHJhbmdlcyBuZSB7fSAmJiAkcm93ID09IFtsaW5kZXggJHJhbmdlcyAwXX0gewoJCQkjIGl0IGlzLCB3b3JrIG91dCBvZmZzZXQgdG8gY2hpbGQKCQkJc2V0IHkwIFtleHByIHskcm93IC0gMX1dCgkJCXNldCBpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHkwXQoJCQlzZXQgeDAgW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCAkeTBdICRpZF0KCQkJaWYgeyR4MCA+PSAwfSB7CgkJCSAgICBzZXQgbyBbZXhwciB7JHgwIC0gJGNvbH1dCgkJCX0KCQkgICAgfQoJCX0KCQlpZiB7JG8gZXEge30gfHwgJG8gPD0gMH0gYnJlYWsKCSAgICB9CgkgICAgaWYgeyRvIG5lIHt9ICYmIFtpbmNyIGNvbF0gPCBbbGxlbmd0aCAkaWRsaXN0XX0gewoJCXNldCB5MSBbZXhwciB7JHJvdyArIDF9XQoJCXNldCBvZmZzMiBbbGluZGV4ICRyb3dvZmZzZXRzICR5MV0KCQlzZXQgeDEgLTEKCQlmb3JlYWNoIHogJG9mZnMyIHsKCQkgICAgaW5jciB4MQoJCSAgICBpZiB7JHogZXEge30gfHwgJHgxICsgJHogPCAkY29sfSBjb250aW51ZQoJCSAgICBsc2V0IHJvd29mZnNldHMgJHkxIFtpbmNyYW5nZSAkb2ZmczIgJHgxIDFdCgkJICAgIGJyZWFrCgkJfQoJCXNldCBpZGxpc3QgW2xpbnNlcnQgJGlkbGlzdCAkY29sIHt9XQoJCXNldCB0bXAgW2xpbnNlcnQgJG9mZnMgJGNvbCB7fV0KCQlpbmNyIGNvbAoJCXNldCBvZmZzIFtpbmNyYW5nZSAkdG1wICRjb2wgLTFdCgkgICAgfQoJfQoJbHNldCByb3dpZGxpc3QgJHJvdyAkaWRsaXN0Cglsc2V0IHJvd29mZnNldHMgJHJvdyAkb2ZmcwoJc2V0IGNvbCAwCiAgICB9Cn0KCnByb2MgeGMge3JvdyBjb2x9IHsKICAgIGdsb2JhbCBjYW52eDAgbGluZXNwYwogICAgcmV0dXJuIFtleHByIHskY2FudngwICsgJGNvbCAqICRsaW5lc3BjfV0KfQoKcHJvYyB5YyB7cm93fSB7CiAgICBnbG9iYWwgY2FudnkwIGxpbmVzcGMKICAgIHJldHVybiBbZXhwciB7JGNhbnZ5MCArICRyb3cgKiAkbGluZXNwY31dCn0KCnByb2MgbGluZXdpZHRoIHtpZH0gewogICAgZ2xvYmFsIHRoaWNrZXJsaW5lIGx0aGlja25lc3MKCiAgICBzZXQgd2lkICRsdGhpY2tuZXNzCiAgICBpZiB7W2luZm8gZXhpc3RzIHRoaWNrZXJsaW5lXSAmJiAkaWQgZXEgJHRoaWNrZXJsaW5lfSB7CglzZXQgd2lkIFtleHByIHsyICogJGx0aGlja25lc3N9XQogICAgfQogICAgcmV0dXJuICR3aWQKfQoKcHJvYyByb3dyYW5nZXMge2lkfSB7CiAgICBnbG9iYWwgcGhhc2UgaWRyb3dyYW5nZXMgY29tbWl0cm93IHJvd2xhaWRvdXQgcm93cmFuZ2VsaXN0IGN1cnZpZXcKCiAgICBzZXQgcmFuZ2VzIHt9CiAgICBpZiB7JHBoYXNlIGVxIHt9IHx8CgkoW2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXQoJICYmICRjb21taXRyb3coJGN1cnZpZXcsJGlkKSA8ICRyb3dsYWlkb3V0KX0gewoJc2V0IHJhbmdlcyBbbGluZGV4ICRyb3dyYW5nZWxpc3QgJGNvbW1pdHJvdygkY3VydmlldywkaWQpXQogICAgfSBlbHNlaWYge1tpbmZvIGV4aXN0cyBpZHJvd3JhbmdlcygkaWQpXX0gewoJc2V0IHJhbmdlcyAkaWRyb3dyYW5nZXMoJGlkKQogICAgfQogICAgcmV0dXJuICRyYW5nZXMKfQoKcHJvYyBkcmF3bGluZXNlZyB7aWQgaX0gewogICAgZ2xvYmFsIHJvd29mZnNldHMgcm93aWRsaXN0CiAgICBnbG9iYWwgZGlzcGxheW9yZGVyCiAgICBnbG9iYWwgY2FudiBjb2xvcm1hcCBsaW5lc3BjCiAgICBnbG9iYWwgbnVtY29tbWl0cyBjb21taXRyb3cgY3VydmlldwoKICAgIHNldCByYW5nZXMgW3Jvd3JhbmdlcyAkaWRdCiAgICBzZXQgZG93bmFycm93IDEKICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCldCgkmJiAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkgPCAkbnVtY29tbWl0c30gewoJc2V0IGRvd25hcnJvdyBbZXhwciB7JGkgPCBbbGxlbmd0aCAkcmFuZ2VzXSAvIDIgLSAxfV0KICAgIH0gZWxzZSB7CglzZXQgZG93bmFycm93IDEKICAgIH0KICAgIHNldCBzdGFydHJvdyBbbGluZGV4ICRyYW5nZXMgW2V4cHIgezIgKiAkaX1dXQogICAgc2V0IHJvdyBbbGluZGV4ICRyYW5nZXMgW2V4cHIgezIgKiAkaSArIDF9XV0KICAgIGlmIHskc3RhcnRyb3cgPT0gJHJvd30gcmV0dXJuCiAgICBhc3NpZ25jb2xvciAkaWQKICAgIHNldCBjb29yZHMge30KICAgIHNldCBjb2wgW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XSAkaWRdCiAgICBpZiB7JGNvbCA8IDB9IHsKCXB1dHMgIm9vcHM6IGRyYXdsaW5lOiBpZCAkaWQgbm90IG9uIHJvdyAkcm93IgoJcmV0dXJuCiAgICB9CiAgICBzZXQgbGFzdG8ge30KICAgIHNldCBucyAwCiAgICB3aGlsZSB7MX0gewoJc2V0IG8gW2xpbmRleCAkcm93b2Zmc2V0cyAkcm93ICRjb2xdCglpZiB7JG8gZXEge319IGJyZWFrCglpZiB7JG8gbmUgJGxhc3RvfSB7CgkgICAgIyBjaGFuZ2luZyBkaXJlY3Rpb24KCSAgICBzZXQgeCBbeGMgJHJvdyAkY29sXQoJICAgIHNldCB5IFt5YyAkcm93XQoJICAgIGxhcHBlbmQgY29vcmRzICR4ICR5CgkgICAgc2V0IGxhc3RvICRvCgl9CglpbmNyIGNvbCAkbwoJaW5jciByb3cgLTEKICAgIH0KICAgIHNldCB4IFt4YyAkcm93ICRjb2xdCiAgICBzZXQgeSBbeWMgJHJvd10KICAgIGxhcHBlbmQgY29vcmRzICR4ICR5CiAgICBpZiB7JGkgPT0gMH0gewoJIyBkcmF3IHRoZSBsaW5rIHRvIHRoZSBmaXJzdCBjaGlsZCBhcyBwYXJ0IG9mIHRoaXMgbGluZQoJaW5jciByb3cgLTEKCXNldCBjaGlsZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHJvd10KCXNldCBjY29sIFtsc2VhcmNoIC1leGFjdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10gJGNoaWxkXQoJaWYgeyRjY29sID49IDB9IHsKCSAgICBzZXQgeCBbeGMgJHJvdyAkY2NvbF0KCSAgICBzZXQgeSBbeWMgJHJvd10KCSAgICBpZiB7JGNjb2wgPCAkY29sIC0gMX0gewoJCWxhcHBlbmQgY29vcmRzIFt4YyAkcm93IFtleHByIHskY29sIC0gMX1dXSBbeWMgJHJvd10KCSAgICB9IGVsc2VpZiB7JGNjb2wgPiAkY29sICsgMX0gewoJCWxhcHBlbmQgY29vcmRzIFt4YyAkcm93IFtleHByIHskY29sICsgMX1dXSBbeWMgJHJvd10KCSAgICB9CgkgICAgbGFwcGVuZCBjb29yZHMgJHggJHkKCX0KICAgIH0KICAgIGlmIHtbbGxlbmd0aCAkY29vcmRzXSA8IDR9IHJldHVybgogICAgaWYgeyRkb3duYXJyb3d9IHsKCSMgVGhpcyBsaW5lIGhhcyBhbiBhcnJvdyBhdCB0aGUgbG93ZXIgZW5kOiBjaGVjayBpZiB0aGUgYXJyb3cgaXMKCSMgb24gYSBkaWFnb25hbCBzZWdtZW50LCBhbmQgaWYgc28sIHdvcmsgYXJvdW5kIHRoZSBUayA4LjQKCSMgcmVmdXNhbCB0byBkcmF3IGFycm93cyBvbiBkaWFnb25hbCBsaW5lcy4KCXNldCB4MCBbbGluZGV4ICRjb29yZHMgMF0KCXNldCB4MSBbbGluZGV4ICRjb29yZHMgMl0KCWlmIHskeDAgIT0gJHgxfSB7CgkgICAgc2V0IHkwIFtsaW5kZXggJGNvb3JkcyAxXQoJICAgIHNldCB5MSBbbGluZGV4ICRjb29yZHMgM10KCSAgICBpZiB7JHkwIC0gJHkxIDw9IDIgKiAkbGluZXNwYyAmJiAkeDEgPT0gW2xpbmRleCAkY29vcmRzIDRdfSB7CgkJIyB3ZSBoYXZlIGEgbmVhcmJ5IHZlcnRpY2FsIHNlZ21lbnQsIGp1c3QgdHJpbSBvZmYgdGhlIGRpYWcgYml0CgkJc2V0IGNvb3JkcyBbbHJhbmdlICRjb29yZHMgMiBlbmRdCgkgICAgfSBlbHNlIHsKCQlzZXQgc2xvcGUgW2V4cHIgeygkeDAgLSAkeDEpIC8gKCR5MCAtICR5MSl9XQoJCXNldCB4aSBbZXhwciB7JHgwIC0gJHNsb3BlICogJGxpbmVzcGMgLyAyfV0KCQlzZXQgeWkgW2V4cHIgeyR5MCAtICRsaW5lc3BjIC8gMn1dCgkJc2V0IGNvb3JkcyBbbHJlcGxhY2UgJGNvb3JkcyAwIDEgJHhpICR5MCAkeGkgJHlpXQoJICAgIH0KCX0KICAgIH0KICAgIHNldCBhcnJvdyBbZXhwciB7MiAqICgkaSA+IDApICsgJGRvd25hcnJvd31dCiAgICBzZXQgYXJyb3cgW2xpbmRleCB7bm9uZSBmaXJzdCBsYXN0IGJvdGh9ICRhcnJvd10KICAgIHNldCB0IFskY2FudiBjcmVhdGUgbGluZSAkY29vcmRzIC13aWR0aCBbbGluZXdpZHRoICRpZF0gXAoJICAgICAgIC1maWxsICRjb2xvcm1hcCgkaWQpIC10YWdzIGxpbmVzLiRpZCAtYXJyb3cgJGFycm93XQogICAgJGNhbnYgbG93ZXIgJHQKICAgIGJpbmRsaW5lICR0ICRpZAp9Cgpwcm9jIGRyYXdwYXJlbnRsaW5rcyB7aWQgcm93IGNvbCBvbGRzfSB7CiAgICBnbG9iYWwgcm93aWRsaXN0IGNhbnYgY29sb3JtYXAKCiAgICBzZXQgcm93MiBbZXhwciB7JHJvdyArIDF9XQogICAgc2V0IHggW3hjICRyb3cgJGNvbF0KICAgIHNldCB5IFt5YyAkcm93XQogICAgc2V0IHkyIFt5YyAkcm93Ml0KICAgIHNldCBpZHMgW2xpbmRleCAkcm93aWRsaXN0ICRyb3cyXQogICAgIyBybXggPSByaWdodC1tb3N0IFggY29vcmQgdXNlZAogICAgc2V0IHJteCAwCiAgICBmb3JlYWNoIHAgJG9sZHMgewoJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRpZHMgJHBdCglpZiB7JGkgPCAwfSB7CgkgICAgcHV0cyAib29wcywgcGFyZW50ICRwIG9mICRpZCBub3QgaW4gbGlzdCIKCSAgICBjb250aW51ZQoJfQoJc2V0IHgyIFt4YyAkcm93MiAkaV0KCWlmIHskeDIgPiAkcm14fSB7CgkgICAgc2V0IHJteCAkeDIKCX0KCXNldCByYW5nZXMgW3Jvd3JhbmdlcyAkcF0KCWlmIHskcmFuZ2VzIG5lIHt9ICYmICRyb3cyID09IFtsaW5kZXggJHJhbmdlcyAwXQoJICAgICYmICRyb3cyIDwgW2xpbmRleCAkcmFuZ2VzIDFdfSB7CgkgICAgIyBkcmF3bGluZXNlZyB3aWxsIGRvIHRoaXMgb25lIGZvciB1cwoJICAgIGNvbnRpbnVlCgl9Cglhc3NpZ25jb2xvciAkcAoJIyBzaG91bGQgaGFuZGxlIGR1cGxpY2F0ZWQgcGFyZW50cyBoZXJlLi4uCglzZXQgY29vcmRzIFtsaXN0ICR4ICR5XQoJaWYgeyRpIDwgJGNvbCAtIDF9IHsKCSAgICBsYXBwZW5kIGNvb3JkcyBbeGMgJHJvdyBbZXhwciB7JGkgKyAxfV1dICR5Cgl9IGVsc2VpZiB7JGkgPiAkY29sICsgMX0gewoJICAgIGxhcHBlbmQgY29vcmRzIFt4YyAkcm93IFtleHByIHskaSAtIDF9XV0gJHkKCX0KCWxhcHBlbmQgY29vcmRzICR4MiAkeTIKCXNldCB0IFskY2FudiBjcmVhdGUgbGluZSAkY29vcmRzIC13aWR0aCBbbGluZXdpZHRoICRwXSBcCgkJICAgLWZpbGwgJGNvbG9ybWFwKCRwKSAtdGFncyBsaW5lcy4kcF0KCSRjYW52IGxvd2VyICR0CgliaW5kbGluZSAkdCAkcAogICAgfQogICAgcmV0dXJuICRybXgKfQoKcHJvYyBkcmF3bGluZXMge2lkfSB7CiAgICBnbG9iYWwgY29sb3JtYXAgY2FudgogICAgZ2xvYmFsIGlkcmFuZ2VkcmF3bgogICAgZ2xvYmFsIGNoaWxkcmVuIGlkZHJhd24gY29tbWl0cm93IHJvd2lkbGlzdCBjdXJ2aWV3CgogICAgJGNhbnYgZGVsZXRlIGxpbmVzLiRpZAogICAgc2V0IG5yIFtleHByIHtbbGxlbmd0aCBbcm93cmFuZ2VzICRpZF1dIC8gMn1dCiAgICBmb3Ige3NldCBpIDB9IHskaSA8ICRucn0ge2luY3IgaX0gewoJaWYge1tpbmZvIGV4aXN0cyBpZHJhbmdlZHJhd24oJGlkLCRpKV19IHsKCSAgICBkcmF3bGluZXNlZyAkaWQgJGkKCX0KICAgIH0KICAgIGZvcmVhY2ggY2hpbGQgJGNoaWxkcmVuKCRjdXJ2aWV3LCRpZCkgewoJaWYge1tpbmZvIGV4aXN0cyBpZGRyYXduKCRjaGlsZCldfSB7CgkgICAgc2V0IHJvdyAkY29tbWl0cm93KCRjdXJ2aWV3LCRjaGlsZCkKCSAgICBzZXQgY29sIFtsc2VhcmNoIC1leGFjdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10gJGNoaWxkXQoJICAgIGlmIHskY29sID49IDB9IHsKCQlkcmF3cGFyZW50bGlua3MgJGNoaWxkICRyb3cgJGNvbCBbbGlzdCAkaWRdCgkgICAgfQoJfQogICAgfQp9Cgpwcm9jIGRyYXdjbWl0dGV4dCB7aWQgcm93IGNvbCBybXh9IHsKICAgIGdsb2JhbCBsaW5lc3BjIGNhbnYgY2FudjIgY2FudjMgY2FudnkwIGZnY29sb3IKICAgIGdsb2JhbCBjb21taXRsaXN0ZWQgY29tbWl0aW5mbyByb3dpZGxpc3QKICAgIGdsb2JhbCByb3d0ZXh0eCBpZHBvcyBpZHRhZ3MgaWRoZWFkcyBpZG90aGVycmVmcwogICAgZ2xvYmFsIGxpbmVodGFnIGxpbmVudGFnIGxpbmVkdGFnCiAgICBnbG9iYWwgbWFpbmZvbnQgY2FudnhtYXggYm9sZHJvd3MgYm9sZG5hbWVyb3dzIGZnY29sb3IKCiAgICBzZXQgb2ZpbGwgW2V4cHIge1tsaW5kZXggJGNvbW1pdGxpc3RlZCAkcm93XT8gImJsdWUiOiAid2hpdGUifV0KICAgIHNldCB4IFt4YyAkcm93ICRjb2xdCiAgICBzZXQgeSBbeWMgJHJvd10KICAgIHNldCBvcmFkIFtleHByIHskbGluZXNwYyAvIDN9XQogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSBvdmFsIFtleHByIHskeCAtICRvcmFkfV0gW2V4cHIgeyR5IC0gJG9yYWR9XSBcCgkgICAgICAgW2V4cHIgeyR4ICsgJG9yYWQgLSAxfV0gW2V4cHIgeyR5ICsgJG9yYWQgLSAxfV0gXAoJICAgICAgIC1maWxsICRvZmlsbCAtb3V0bGluZSAkZmdjb2xvciAtd2lkdGggMSAtdGFncyBjaXJjbGVdCiAgICAkY2FudiByYWlzZSAkdAogICAgJGNhbnYgYmluZCAkdCA8MT4ge3NlbGNhbnZsaW5lIHt9ICV4ICV5fQogICAgc2V0IHh0IFt4YyAkcm93IFtsbGVuZ3RoIFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XV1dCiAgICBpZiB7JHh0IDwgJHJteH0gewoJc2V0IHh0ICRybXgKICAgIH0KICAgIHNldCByb3d0ZXh0eCgkcm93KSAkeHQKICAgIHNldCBpZHBvcygkaWQpIFtsaXN0ICR4ICR4dCAkeV0KICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldIHx8IFtpbmZvIGV4aXN0cyBpZGhlYWRzKCRpZCldCgl8fCBbaW5mbyBleGlzdHMgaWRvdGhlcnJlZnMoJGlkKV19IHsKCXNldCB4dCBbZHJhd3RhZ3MgJGlkICR4ICR4dCAkeV0KICAgIH0KICAgIHNldCBoZWFkbGluZSBbbGluZGV4ICRjb21taXRpbmZvKCRpZCkgMF0KICAgIHNldCBuYW1lIFtsaW5kZXggJGNvbW1pdGluZm8oJGlkKSAxXQogICAgc2V0IGRhdGUgW2xpbmRleCAkY29tbWl0aW5mbygkaWQpIDJdCiAgICBzZXQgZGF0ZSBbZm9ybWF0ZGF0ZSAkZGF0ZV0KICAgIHNldCBmb250ICRtYWluZm9udAogICAgc2V0IG5mb250ICRtYWluZm9udAogICAgc2V0IGlzYm9sZCBbaXNoaWdobGlnaHRlZCAkcm93XQogICAgaWYgeyRpc2JvbGQgPiAwfSB7CglsYXBwZW5kIGJvbGRyb3dzICRyb3cKCWxhcHBlbmQgZm9udCBib2xkCglpZiB7JGlzYm9sZCA+IDF9IHsKCSAgICBsYXBwZW5kIGJvbGRuYW1lcm93cyAkcm93CgkgICAgbGFwcGVuZCBuZm9udCBib2xkCgl9CiAgICB9CiAgICBzZXQgbGluZWh0YWcoJHJvdykgWyRjYW52IGNyZWF0ZSB0ZXh0ICR4dCAkeSAtYW5jaG9yIHcgLWZpbGwgJGZnY29sb3IgXAoJCQkgICAgLXRleHQgJGhlYWRsaW5lIC1mb250ICRmb250IC10YWdzIHRleHRdCiAgICAkY2FudiBiaW5kICRsaW5laHRhZygkcm93KSA8QnV0dG9uLTM+ICJyb3dtZW51ICVYICVZICRpZCIKICAgIHNldCBsaW5lbnRhZygkcm93KSBbJGNhbnYyIGNyZWF0ZSB0ZXh0IDMgJHkgLWFuY2hvciB3IC1maWxsICRmZ2NvbG9yIFwKCQkJICAgIC10ZXh0ICRuYW1lIC1mb250ICRuZm9udCAtdGFncyB0ZXh0XQogICAgc2V0IGxpbmVkdGFnKCRyb3cpIFskY2FudjMgY3JlYXRlIHRleHQgMyAkeSAtYW5jaG9yIHcgLWZpbGwgJGZnY29sb3IgXAoJCQkgICAgLXRleHQgJGRhdGUgLWZvbnQgJG1haW5mb250IC10YWdzIHRleHRdCiAgICBzZXQgeHIgW2V4cHIgeyR4dCArIFtmb250IG1lYXN1cmUgJG1haW5mb250ICRoZWFkbGluZV19XQogICAgaWYgeyR4ciA+ICRjYW52eG1heH0gewoJc2V0IGNhbnZ4bWF4ICR4cgoJc2V0Y2FudnNjcm9sbAogICAgfQp9Cgpwcm9jIGRyYXdjbWl0cm93IHtyb3d9IHsKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgcm93aWRsaXN0CiAgICBnbG9iYWwgaWRyYW5nZWRyYXduIGlkZHJhd24KICAgIGdsb2JhbCBjb21taXRpbmZvIHBhcmVudGxpc3QgbnVtY29tbWl0cwogICAgZ2xvYmFsIGZpbGVoaWdobGlnaHQgZmhpZ2hsaWdodHMgZmluZHN0cmluZyBuaGlnaGxpZ2h0cwogICAgZ2xvYmFsIGhsdmlldyB2aGlnaGxpZ2h0cwogICAgZ2xvYmFsIGhpZ2hsaWdodF9yZWxhdGVkIHJoaWdobGlnaHRzCgogICAgaWYgeyRyb3cgPj0gJG51bWNvbW1pdHN9IHJldHVybgogICAgZm9yZWFjaCBpZCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10gewoJaWYgeyRpZCBlcSB7fX0gY29udGludWUKCXNldCBpIC0xCglmb3JlYWNoIHtzIGV9IFtyb3dyYW5nZXMgJGlkXSB7CgkgICAgaW5jciBpCgkgICAgaWYgeyRyb3cgPCAkc30gY29udGludWUKCSAgICBpZiB7JGUgZXEge319IGJyZWFrCgkgICAgaWYgeyRyb3cgPD0gJGV9IHsKCQlpZiB7JGUgPCAkbnVtY29tbWl0cyAmJiAhW2luZm8gZXhpc3RzIGlkcmFuZ2VkcmF3bigkaWQsJGkpXX0gewoJCSAgICBkcmF3bGluZXNlZyAkaWQgJGkKCQkgICAgc2V0IGlkcmFuZ2VkcmF3bigkaWQsJGkpIDEKCQl9CgkJYnJlYWsKCSAgICB9Cgl9CiAgICB9CgogICAgc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcm93XQogICAgaWYge1tpbmZvIGV4aXN0cyBobHZpZXddICYmICFbaW5mbyBleGlzdHMgdmhpZ2hsaWdodHMoJHJvdyldfSB7Cglhc2t2aGlnaGxpZ2h0ICRyb3cgJGlkCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGZpbGVoaWdobGlnaHRdICYmICFbaW5mbyBleGlzdHMgZmhpZ2hsaWdodHMoJHJvdyldfSB7Cglhc2tmaWxlaGlnaGxpZ2h0ICRyb3cgJGlkCiAgICB9CiAgICBpZiB7JGZpbmRzdHJpbmcgbmUge30gJiYgIVtpbmZvIGV4aXN0cyBuaGlnaGxpZ2h0cygkcm93KV19IHsKCWFza2ZpbmRoaWdobGlnaHQgJHJvdyAkaWQKICAgIH0KICAgIGlmIHskaGlnaGxpZ2h0X3JlbGF0ZWQgbmUgIk5vbmUiICYmICFbaW5mbyBleGlzdHMgcmhpZ2hsaWdodHMoJHJvdyldfSB7Cglhc2tyZWxoaWdobGlnaHQgJHJvdyAkaWQKICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRkcmF3bigkaWQpXX0gcmV0dXJuCiAgICBzZXQgY29sIFtsc2VhcmNoIC1leGFjdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10gJGlkXQogICAgaWYgeyRjb2wgPCAwfSB7CglwdXRzICJvb3BzLCByb3cgJHJvdyBpZCAkaWQgbm90IGluIGxpc3QiCglyZXR1cm4KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV19IHsKCWdldGNvbW1pdCAkaWQKICAgIH0KICAgIGFzc2lnbmNvbG9yICRpZAogICAgc2V0IG9sZHMgW2xpbmRleCAkcGFyZW50bGlzdCAkcm93XQogICAgaWYgeyRvbGRzIG5lIHt9fSB7CglzZXQgcm14IFtkcmF3cGFyZW50bGlua3MgJGlkICRyb3cgJGNvbCAkb2xkc10KICAgIH0gZWxzZSB7CglzZXQgcm14IDAKICAgIH0KICAgIGRyYXdjbWl0dGV4dCAkaWQgJHJvdyAkY29sICRybXgKICAgIHNldCBpZGRyYXduKCRpZCkgMQp9Cgpwcm9jIGRyYXdmcmFjIHtmMCBmMX0gewogICAgZ2xvYmFsIG51bWNvbW1pdHMgY2FudgogICAgZ2xvYmFsIGxpbmVzcGMKCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggZXEge30gfHwgJHltYXggPT0gMH0gcmV0dXJuCiAgICBzZXQgeTAgW2V4cHIge2ludCgkZjAgKiAkeW1heCl9XQogICAgc2V0IHJvdyBbZXhwciB7aW50KCgkeTAgLSAzKSAvICRsaW5lc3BjKSAtIDF9XQogICAgaWYgeyRyb3cgPCAwfSB7CglzZXQgcm93IDAKICAgIH0KICAgIHNldCB5MSBbZXhwciB7aW50KCRmMSAqICR5bWF4KX1dCiAgICBzZXQgZW5kcm93IFtleHByIHtpbnQoKCR5MSAtIDMpIC8gJGxpbmVzcGMpICsgMX1dCiAgICBpZiB7JGVuZHJvdyA+PSAkbnVtY29tbWl0c30gewoJc2V0IGVuZHJvdyBbZXhwciB7JG51bWNvbW1pdHMgLSAxfV0KICAgIH0KICAgIGZvciB7fSB7JHJvdyA8PSAkZW5kcm93fSB7aW5jciByb3d9IHsKCWRyYXdjbWl0cm93ICRyb3cKICAgIH0KfQoKcHJvYyBkcmF3dmlzaWJsZSB7fSB7CiAgICBnbG9iYWwgY2FudgogICAgZXZhbCBkcmF3ZnJhYyBbJGNhbnYgeXZpZXddCn0KCnByb2MgY2xlYXJfZGlzcGxheSB7fSB7CiAgICBnbG9iYWwgaWRkcmF3biBpZHJhbmdlZHJhd24KICAgIGdsb2JhbCB2aGlnaGxpZ2h0cyBmaGlnaGxpZ2h0cyBuaGlnaGxpZ2h0cyByaGlnaGxpZ2h0cwoKICAgIGFsbGNhbnZzIGRlbGV0ZSBhbGwKICAgIGNhdGNoIHt1bnNldCBpZGRyYXdufQogICAgY2F0Y2gge3Vuc2V0IGlkcmFuZ2VkcmF3bn0KICAgIGNhdGNoIHt1bnNldCB2aGlnaGxpZ2h0c30KICAgIGNhdGNoIHt1bnNldCBmaGlnaGxpZ2h0c30KICAgIGNhdGNoIHt1bnNldCBuaGlnaGxpZ2h0c30KICAgIGNhdGNoIHt1bnNldCByaGlnaGxpZ2h0c30KfQoKcHJvYyBmaW5kY3Jvc3NpbmdzIHtpZH0gewogICAgZ2xvYmFsIHJvd2lkbGlzdCBwYXJlbnRsaXN0IG51bWNvbW1pdHMgcm93b2Zmc2V0cyBkaXNwbGF5b3JkZXIKCiAgICBzZXQgY3Jvc3Mge30KICAgIHNldCBjY3Jvc3Mge30KICAgIGZvcmVhY2gge3MgZX0gW3Jvd3JhbmdlcyAkaWRdIHsKCWlmIHskZSA+PSAkbnVtY29tbWl0c30gewoJICAgIHNldCBlIFtleHByIHskbnVtY29tbWl0cyAtIDF9XQoJfQoJaWYgeyRlIDw9ICRzfSBjb250aW51ZQoJc2V0IHggW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCAkZV0gJGlkXQoJaWYgeyR4IDwgMH0gewoJICAgIHB1dHMgImZpbmRjcm9zc2luZ3M6IG9vcHMsIG5vIFtzaG9ydGlkcyAkaWRdIGluIHJvdyAkZSIKCSAgICBjb250aW51ZQoJfQoJZm9yIHtzZXQgcm93ICRlfSB7W2luY3Igcm93IC0xXSA+PSAkc30ge30gewoJICAgIHNldCBvbGRzIFtsaW5kZXggJHBhcmVudGxpc3QgJHJvd10KCSAgICBzZXQga2lkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcm93XQoJICAgIHNldCBraWR4IFtsc2VhcmNoIC1leGFjdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10gJGtpZF0KCSAgICBpZiB7JGtpZHggPCAwfSBjb250aW51ZQoJICAgIHNldCBuZXh0cm93IFtsaW5kZXggJHJvd2lkbGlzdCBbZXhwciB7JHJvdyArIDF9XV0KCSAgICBmb3JlYWNoIHAgJG9sZHMgewoJCXNldCBweCBbbHNlYXJjaCAtZXhhY3QgJG5leHRyb3cgJHBdCgkJaWYgeyRweCA8IDB9IGNvbnRpbnVlCgkJaWYgeygka2lkeCA8ICR4ICYmICR4IDwgJHB4KSB8fCAoJHB4IDwgJHggJiYgJHggPCAka2lkeCl9IHsKCQkgICAgaWYge1tsc2VhcmNoIC1leGFjdCAkY2Nyb3NzICRwXSA+PSAwfSBjb250aW51ZQoJCSAgICBpZiB7JHggPT0gJHB4ICsgKCRraWR4IDwgJHB4PyAtMTogMSl9IHsKCQkJbGFwcGVuZCBjY3Jvc3MgJHAKCQkgICAgfSBlbHNlaWYge1tsc2VhcmNoIC1leGFjdCAkY3Jvc3MgJHBdIDwgMH0gewoJCQlsYXBwZW5kIGNyb3NzICRwCgkJICAgIH0KCQl9CgkgICAgfQoJICAgIHNldCBpbmMgW2xpbmRleCAkcm93b2Zmc2V0cyAkcm93ICR4XQoJICAgIGlmIHskaW5jIGVxIHt9fSBicmVhawoJICAgIGluY3IgeCAkaW5jCgl9CiAgICB9CiAgICByZXR1cm4gW2NvbmNhdCAkY2Nyb3NzIHt7fX0gJGNyb3NzXQp9Cgpwcm9jIGFzc2lnbmNvbG9yIHtpZH0gewogICAgZ2xvYmFsIGNvbG9ybWFwIGNvbG9ycyBuZXh0Y29sb3IKICAgIGdsb2JhbCBjb21taXRyb3cgcGFyZW50bGlzdCBjaGlsZHJlbiBjaGlsZHJlbiBjdXJ2aWV3CgogICAgaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkaWQpXX0gcmV0dXJuCiAgICBzZXQgbmNvbG9ycyBbbGxlbmd0aCAkY29sb3JzXQogICAgaWYge1tpbmZvIGV4aXN0cyBjaGlsZHJlbigkY3VydmlldywkaWQpXX0gewoJc2V0IGtpZHMgJGNoaWxkcmVuKCRjdXJ2aWV3LCRpZCkKICAgIH0gZWxzZSB7CglzZXQga2lkcyB7fQogICAgfQogICAgaWYge1tsbGVuZ3RoICRraWRzXSA9PSAxfSB7CglzZXQgY2hpbGQgW2xpbmRleCAka2lkcyAwXQoJaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkY2hpbGQpXQoJICAgICYmIFtsbGVuZ3RoIFtsaW5kZXggJHBhcmVudGxpc3QgJGNvbW1pdHJvdygkY3VydmlldywkY2hpbGQpXV0gPT0gMX0gewoJICAgIHNldCBjb2xvcm1hcCgkaWQpICRjb2xvcm1hcCgkY2hpbGQpCgkgICAgcmV0dXJuCgl9CiAgICB9CiAgICBzZXQgYmFkY29sb3JzIHt9CiAgICBzZXQgb3JpZ2JhZCB7fQogICAgZm9yZWFjaCB4IFtmaW5kY3Jvc3NpbmdzICRpZF0gewoJaWYgeyR4IGVxIHt9fSB7CgkgICAgIyBkZWxpbWl0ZXIgYmV0d2VlbiBjb3JuZXIgY3Jvc3NpbmdzIGFuZCBvdGhlciBjcm9zc2luZ3MKCSAgICBpZiB7W2xsZW5ndGggJGJhZGNvbG9yc10gPj0gJG5jb2xvcnMgLSAxfSBicmVhawoJICAgIHNldCBvcmlnYmFkICRiYWRjb2xvcnMKCX0KCWlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJHgpXQoJICAgICYmIFtsc2VhcmNoIC1leGFjdCAkYmFkY29sb3JzICRjb2xvcm1hcCgkeCldIDwgMH0gewoJICAgIGxhcHBlbmQgYmFkY29sb3JzICRjb2xvcm1hcCgkeCkKCX0KICAgIH0KICAgIGlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA+PSAkbmNvbG9yc30gewoJc2V0IGJhZGNvbG9ycyAkb3JpZ2JhZAogICAgfQogICAgc2V0IG9yaWdiYWQgJGJhZGNvbG9ycwogICAgaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdIDwgJG5jb2xvcnMgLSAxfSB7Cglmb3JlYWNoIGNoaWxkICRraWRzIHsKCSAgICBpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCRjaGlsZCldCgkJJiYgW2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNvbG9ybWFwKCRjaGlsZCldIDwgMH0gewoJCWxhcHBlbmQgYmFkY29sb3JzICRjb2xvcm1hcCgkY2hpbGQpCgkgICAgfQoJICAgIGZvcmVhY2ggcCBbbGluZGV4ICRwYXJlbnRsaXN0ICRjb21taXRyb3coJGN1cnZpZXcsJGNoaWxkKV0gewoJCWlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJHApXQoJCSAgICAmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJHApXSA8IDB9IHsKCQkgICAgbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCRwKQoJCX0KCSAgICB9Cgl9CglpZiB7W2xsZW5ndGggJGJhZGNvbG9yc10gPj0gJG5jb2xvcnN9IHsKCSAgICBzZXQgYmFkY29sb3JzICRvcmlnYmFkCgl9CiAgICB9CiAgICBmb3Ige3NldCBpIDB9IHskaSA8PSAkbmNvbG9yc30ge2luY3IgaX0gewoJc2V0IGMgW2xpbmRleCAkY29sb3JzICRuZXh0Y29sb3JdCglpZiB7W2luY3IgbmV4dGNvbG9yXSA+PSAkbmNvbG9yc30gewoJICAgIHNldCBuZXh0Y29sb3IgMAoJfQoJaWYge1tsc2VhcmNoIC1leGFjdCAkYmFkY29sb3JzICRjXX0gYnJlYWsKICAgIH0KICAgIHNldCBjb2xvcm1hcCgkaWQpICRjCn0KCnByb2MgYmluZGxpbmUge3QgaWR9IHsKICAgIGdsb2JhbCBjYW52CgogICAgJGNhbnYgYmluZCAkdCA8RW50ZXI+ICJsaW5lZW50ZXIgJXggJXkgJGlkIgogICAgJGNhbnYgYmluZCAkdCA8TW90aW9uPiAibGluZW1vdGlvbiAleCAleSAkaWQiCiAgICAkY2FudiBiaW5kICR0IDxMZWF2ZT4gImxpbmVsZWF2ZSAkaWQiCiAgICAkY2FudiBiaW5kICR0IDxCdXR0b24tMT4gImxpbmVjbGljayAleCAleSAkaWQgMSIKfQoKcHJvYyBkcmF3dGFncyB7aWQgeCB4dCB5MX0gewogICAgZ2xvYmFsIGlkdGFncyBpZGhlYWRzIGlkb3RoZXJyZWZzIG1haW5oZWFkCiAgICBnbG9iYWwgbGluZXNwYyBsdGhpY2tuZXNzCiAgICBnbG9iYWwgY2FudiBtYWluZm9udCBjb21taXRyb3cgcm93dGV4dHggY3VydmlldyBmZ2NvbG9yIGJnY29sb3IKCiAgICBzZXQgbWFya3Mge30KICAgIHNldCBudGFncyAwCiAgICBzZXQgbmhlYWRzIDAKICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CglzZXQgbWFya3MgJGlkdGFncygkaWQpCglzZXQgbnRhZ3MgW2xsZW5ndGggJG1hcmtzXQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGhlYWRzKCRpZCldfSB7CglzZXQgbWFya3MgW2NvbmNhdCAkbWFya3MgJGlkaGVhZHMoJGlkKV0KCXNldCBuaGVhZHMgW2xsZW5ndGggJGlkaGVhZHMoJGlkKV0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgaWRvdGhlcnJlZnMoJGlkKV19IHsKCXNldCBtYXJrcyBbY29uY2F0ICRtYXJrcyAkaWRvdGhlcnJlZnMoJGlkKV0KICAgIH0KICAgIGlmIHskbWFya3MgZXEge319IHsKCXJldHVybiAkeHQKICAgIH0KCiAgICBzZXQgZGVsdGEgW2V4cHIge2ludCgwLjUgKiAoJGxpbmVzcGMgLSAkbHRoaWNrbmVzcykpfV0KICAgIHNldCB5dCBbZXhwciB7JHkxIC0gMC41ICogJGxpbmVzcGN9XQogICAgc2V0IHliIFtleHByIHskeXQgKyAkbGluZXNwYyAtIDF9XQogICAgc2V0IHh2YWxzIHt9CiAgICBzZXQgd3ZhbHMge30KICAgIHNldCBpIC0xCiAgICBmb3JlYWNoIHRhZyAkbWFya3MgewoJaW5jciBpCglpZiB7JGkgPj0gJG50YWdzICYmICRpIDwgJG50YWdzICsgJG5oZWFkcyAmJiAkdGFnIGVxICRtYWluaGVhZH0gewoJICAgIHNldCB3aWQgW2ZvbnQgbWVhc3VyZSBbY29uY2F0ICRtYWluZm9udCBib2xkXSAkdGFnXQoJfSBlbHNlIHsKCSAgICBzZXQgd2lkIFtmb250IG1lYXN1cmUgJG1haW5mb250ICR0YWddCgl9CglsYXBwZW5kIHh2YWxzICR4dAoJbGFwcGVuZCB3dmFscyAkd2lkCglzZXQgeHQgW2V4cHIgeyR4dCArICRkZWx0YSArICR3aWQgKyAkbHRoaWNrbmVzcyArICRsaW5lc3BjfV0KICAgIH0KICAgIHNldCB0IFskY2FudiBjcmVhdGUgbGluZSAkeCAkeTEgW2xpbmRleCAkeHZhbHMgZW5kXSAkeTEgXAoJICAgICAgIC13aWR0aCAkbHRoaWNrbmVzcyAtZmlsbCBibGFjayAtdGFncyB0YWcuJGlkXQogICAgJGNhbnYgbG93ZXIgJHQKICAgIGZvcmVhY2ggdGFnICRtYXJrcyB4ICR4dmFscyB3aWQgJHd2YWxzIHsKCXNldCB4bCBbZXhwciB7JHggKyAkZGVsdGF9XQoJc2V0IHhyIFtleHByIHskeCArICRkZWx0YSArICR3aWQgKyAkbHRoaWNrbmVzc31dCglzZXQgZm9udCAkbWFpbmZvbnQKCWlmIHtbaW5jciBudGFncyAtMV0gPj0gMH0gewoJICAgICMgZHJhdyBhIHRhZwoJICAgIHNldCB0IFskY2FudiBjcmVhdGUgcG9seWdvbiAkeCBbZXhwciB7JHl0ICsgJGRlbHRhfV0gJHhsICR5dCBcCgkJICAgICAgICR4ciAkeXQgJHhyICR5YiAkeGwgJHliICR4IFtleHByIHskeWIgLSAkZGVsdGF9XSBcCgkJICAgICAgIC13aWR0aCAxIC1vdXRsaW5lIGJsYWNrIC1maWxsIHllbGxvdyAtdGFncyB0YWcuJGlkXQoJICAgICRjYW52IGJpbmQgJHQgPDE+IFtsaXN0IHNob3d0YWcgJHRhZyAxXQoJICAgIHNldCByb3d0ZXh0eCgkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkpIFtleHByIHskeHIgKyAkbGluZXNwY31dCgl9IGVsc2UgewoJICAgICMgZHJhdyBhIGhlYWQgb3Igb3RoZXIgcmVmCgkgICAgaWYge1tpbmNyIG5oZWFkcyAtMV0gPj0gMH0gewoJCXNldCBjb2wgZ3JlZW4KCQlpZiB7JHRhZyBlcSAkbWFpbmhlYWR9IHsKCQkgICAgbGFwcGVuZCBmb250IGJvbGQKCQl9CgkgICAgfSBlbHNlIHsKCQlzZXQgY29sICIjZGRkZGZmIgoJICAgIH0KCSAgICBzZXQgeGwgW2V4cHIgeyR4bCAtICRkZWx0YS8yfV0KCSAgICAkY2FudiBjcmVhdGUgcG9seWdvbiAkeCAkeXQgJHhyICR5dCAkeHIgJHliICR4ICR5YiBcCgkJLXdpZHRoIDEgLW91dGxpbmUgYmxhY2sgLWZpbGwgJGNvbCAtdGFncyB0YWcuJGlkCgkgICAgaWYge1tyZWdleHAge14ocmVtb3Rlcy8uKi98cmVtb3Rlcy8pfSAkdGFnIG1hdGNoIHJlbW90ZXByZWZpeF19IHsKCSAgICAgICAgc2V0IHJ3aWQgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgJHJlbW90ZXByZWZpeF0KCQlzZXQgeGkgW2V4cHIgeyR4ICsgMX1dCgkJc2V0IHl0aSBbZXhwciB7JHl0ICsgMX1dCgkJc2V0IHhyaSBbZXhwciB7JHggKyAkcndpZH1dCgkJJGNhbnYgY3JlYXRlIHBvbHlnb24gJHhpICR5dGkgJHhyaSAkeXRpICR4cmkgJHliICR4aSAkeWIgXAoJCQktd2lkdGggMCAtZmlsbCAiI2ZmZGRhYSIgLXRhZ3MgdGFnLiRpZAoJICAgIH0KCX0KCXNldCB0IFskY2FudiBjcmVhdGUgdGV4dCAkeGwgJHkxIC1hbmNob3IgdyAtdGV4dCAkdGFnIC1maWxsICRmZ2NvbG9yIFwKCQkgICAtZm9udCAkZm9udCAtdGFncyBbbGlzdCB0YWcuJGlkIHRleHRdXQoJaWYgeyRudGFncyA+PSAwfSB7CgkgICAgJGNhbnYgYmluZCAkdCA8MT4gW2xpc3Qgc2hvd3RhZyAkdGFnIDFdCgl9IGVsc2VpZiB7JG5oZWFkcyA+PSAwfSB7CgkgICAgJGNhbnYgYmluZCAkdCA8QnV0dG9uLTM+IFtsaXN0IGhlYWRtZW51ICVYICVZICRpZCAkdGFnXQoJfQogICAgfQogICAgcmV0dXJuICR4dAp9Cgpwcm9jIHhjb29yZCB7aSBsZXZlbCBsbn0gewogICAgZ2xvYmFsIGNhbnZ4MCB4c3BjMSB4c3BjMgoKICAgIHNldCB4IFtleHByIHskY2FudngwICsgJGkgKiAkeHNwYzEoJGxuKX1dCiAgICBpZiB7JGkgPiAwICYmICRpID09ICRsZXZlbH0gewoJc2V0IHggW2V4cHIgeyR4ICsgMC41ICogKCR4c3BjMiAtICR4c3BjMSgkbG4pKX1dCiAgICB9IGVsc2VpZiB7JGkgPiAkbGV2ZWx9IHsKCXNldCB4IFtleHByIHskeCArICR4c3BjMiAtICR4c3BjMSgkbG4pfV0KICAgIH0KICAgIHJldHVybiAkeAp9Cgpwcm9jIHNob3dfc3RhdHVzIHttc2d9IHsKICAgIGdsb2JhbCBjYW52IG1haW5mb250IGZnY29sb3IKCiAgICBjbGVhcl9kaXNwbGF5CiAgICAkY2FudiBjcmVhdGUgdGV4dCAzIDMgLWFuY2hvciBudyAtdGV4dCAkbXNnIC1mb250ICRtYWluZm9udCBcCgktdGFncyB0ZXh0IC1maWxsICRmZ2NvbG9yCn0KCnByb2MgZmluaXNoY29tbWl0cyB7fSB7CiAgICBnbG9iYWwgY29tbWl0aWR4IHBoYXNlIGN1cnZpZXcKICAgIGdsb2JhbCBwZW5kaW5nX3NlbGVjdAoKICAgIGlmIHskY29tbWl0aWR4KCRjdXJ2aWV3KSA+IDB9IHsKCWRyYXdyZXN0CiAgICB9IGVsc2UgewoJc2hvd19zdGF0dXMgIk5vIGNvbW1pdHMgc2VsZWN0ZWQiCiAgICB9CiAgICBzZXQgcGhhc2Uge30KICAgIGNhdGNoIHt1bnNldCBwZW5kaW5nX3NlbGVjdH0KfQoKIyBJbnNlcnQgYSBuZXcgY29tbWl0IGFzIHRoZSBjaGlsZCBvZiB0aGUgY29tbWl0IG9uIHJvdyAkcm93LgojIFRoZSBuZXcgY29tbWl0IHdpbGwgYmUgZGlzcGxheWVkIG9uIHJvdyAkcm93IGFuZCB0aGUgY29tbWl0cwojIG9uIHRoYXQgcm93IGFuZCBiZWxvdyB3aWxsIG1vdmUgZG93biBvbmUgcm93Lgpwcm9jIGluc2VydHJvdyB7cm93IG5ld2NtaXR9IHsKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgcGFyZW50bGlzdCBjaGlsZGxpc3QgY29tbWl0bGlzdGVkCiAgICBnbG9iYWwgY29tbWl0cm93IGN1cnZpZXcgcm93aWRsaXN0IHJvd29mZnNldHMgbnVtY29tbWl0cwogICAgZ2xvYmFsIHJvd3JhbmdlbGlzdCBpZHJvd3JhbmdlcyByb3dsYWlkb3V0IHJvd29wdGltIG51bWNvbW1pdHMKICAgIGdsb2JhbCBsaW5lc2VnZW5kcyBzZWxlY3RlZGxpbmUKCiAgICBpZiB7JHJvdyA+PSAkbnVtY29tbWl0c30gewoJcHV0cyAib29wcywgaW5zZXJ0aW5nIG5ldyByb3cgJHJvdyBidXQgb25seSBoYXZlICRudW1jb21taXRzIHJvd3MiCglyZXR1cm4KICAgIH0KICAgIHNldCBwIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcm93XQogICAgc2V0IGRpc3BsYXlvcmRlciBbbGluc2VydCAkZGlzcGxheW9yZGVyICRyb3cgJG5ld2NtaXRdCiAgICBzZXQgcGFyZW50bGlzdCBbbGluc2VydCAkcGFyZW50bGlzdCAkcm93ICRwXQogICAgc2V0IGtpZHMgW2xpbmRleCAkY2hpbGRsaXN0ICRyb3ddCiAgICBsYXBwZW5kIGtpZHMgJG5ld2NtaXQKICAgIGxzZXQgY2hpbGRsaXN0ICRyb3cgJGtpZHMKICAgIHNldCBjaGlsZGxpc3QgW2xpbnNlcnQgJGNoaWxkbGlzdCAkcm93IHt9XQogICAgc2V0IGNvbW1pdGxpc3RlZCBbbGluc2VydCAkY29tbWl0bGlzdGVkICRyb3cgMV0KICAgIHNldCBsIFtsbGVuZ3RoICRkaXNwbGF5b3JkZXJdCiAgICBmb3Ige3NldCByICRyb3d9IHskciA8ICRsfSB7aW5jciByfSB7CglzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyXQoJc2V0IGNvbW1pdHJvdygkY3VydmlldywkaWQpICRyCiAgICB9CgogICAgc2V0IGlkbGlzdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10KICAgIHNldCBvZmZzIFtsaW5kZXggJHJvd29mZnNldHMgJHJvd10KICAgIHNldCBuZXdvZmZzIHt9CiAgICBmb3JlYWNoIHggJGlkbGlzdCB7CglpZiB7JHggZXEge30gfHwgKCR4IGVxICRwICYmIFtsbGVuZ3RoICRraWRzXSA9PSAxKX0gewoJICAgIGxhcHBlbmQgbmV3b2ZmcyB7fQoJfSBlbHNlIHsKCSAgICBsYXBwZW5kIG5ld29mZnMgMAoJfQogICAgfQogICAgaWYge1tsbGVuZ3RoICRraWRzXSA9PSAxfSB7CglzZXQgY29sIFtsc2VhcmNoIC1leGFjdCAkaWRsaXN0ICRwXQoJbHNldCBpZGxpc3QgJGNvbCAkbmV3Y21pdAogICAgfSBlbHNlIHsKCXNldCBjb2wgW2xsZW5ndGggJGlkbGlzdF0KCWxhcHBlbmQgaWRsaXN0ICRuZXdjbWl0CglsYXBwZW5kIG9mZnMge30KCWxzZXQgcm93b2Zmc2V0cyAkcm93ICRvZmZzCiAgICB9CiAgICBzZXQgcm93aWRsaXN0IFtsaW5zZXJ0ICRyb3dpZGxpc3QgJHJvdyAkaWRsaXN0XQogICAgc2V0IHJvd29mZnNldHMgW2xpbnNlcnQgJHJvd29mZnNldHMgW2V4cHIgeyRyb3crMX1dICRuZXdvZmZzXQoKICAgIHNldCByb3dyYW5nZWxpc3QgW2xpbnNlcnQgJHJvd3JhbmdlbGlzdCAkcm93IHt9XQogICAgc2V0IGwgW2xsZW5ndGggJHJvd3JhbmdlbGlzdF0KICAgIGZvciB7c2V0IHIgMH0geyRyIDwgJGx9IHtpbmNyIHJ9IHsKCXNldCByYW5nZXMgW2xpbmRleCAkcm93cmFuZ2VsaXN0ICRyXQoJaWYgeyRyYW5nZXMgbmUge30gJiYgW2xpbmRleCAkcmFuZ2VzIGVuZF0gPj0gJHJvd30gewoJICAgIHNldCBuZXdyYW5nZXMge30KCSAgICBmb3JlYWNoIHggJHJhbmdlcyB7CgkJaWYgeyR4ID49ICRyb3d9IHsKCQkgICAgbGFwcGVuZCBuZXdyYW5nZXMgW2V4cHIgeyR4ICsgMX1dCgkJfSBlbHNlIHsKCQkgICAgbGFwcGVuZCBuZXdyYW5nZXMgJHgKCQl9CgkgICAgfQoJICAgIGxzZXQgcm93cmFuZ2VsaXN0ICRyICRuZXdyYW5nZXMKCX0KICAgIH0KICAgIGlmIHtbbGxlbmd0aCAka2lkc10gPiAxfSB7CglzZXQgcnAxIFtleHByIHskcm93ICsgMX1dCglzZXQgcmFuZ2VzIFtsaW5kZXggJHJvd3JhbmdlbGlzdCAkcnAxXQoJaWYgeyRyYW5nZXMgZXEge319IHsKCSAgICBzZXQgcmFuZ2VzIFtsaXN0ICRyb3cgJHJwMV0KCX0gZWxzZWlmIHtbbGluZGV4ICRyYW5nZXMgZW5kLTFdID09ICRycDF9IHsKCSAgICBsc2V0IHJhbmdlcyBlbmQtMSAkcm93Cgl9Cglsc2V0IHJvd3JhbmdlbGlzdCAkcnAxICRyYW5nZXMKICAgIH0KICAgIGZvcmVhY2ggaWQgW2FycmF5IG5hbWVzIGlkcm93cmFuZ2VzXSB7CglzZXQgcmFuZ2VzICRpZHJvd3JhbmdlcygkaWQpCglpZiB7JHJhbmdlcyBuZSB7fSAmJiBbbGluZGV4ICRyYW5nZXMgZW5kXSA+PSAkcm93fSB7CgkgICAgc2V0IG5ld3JhbmdlcyB7fQoJICAgIGZvcmVhY2ggeCAkcmFuZ2VzIHsKCQlpZiB7JHggPj0gJHJvd30gewoJCSAgICBsYXBwZW5kIG5ld3JhbmdlcyBbZXhwciB7JHggKyAxfV0KCQl9IGVsc2UgewoJCSAgICBsYXBwZW5kIG5ld3JhbmdlcyAkeAoJCX0KCSAgICB9CgkgICAgc2V0IGlkcm93cmFuZ2VzKCRpZCkgJG5ld3JhbmdlcwoJfQogICAgfQoKICAgIHNldCBsaW5lc2VnZW5kcyBbbGluc2VydCAkbGluZXNlZ2VuZHMgJHJvdyB7fV0KCiAgICBpbmNyIHJvd2xhaWRvdXQKICAgIGluY3Igcm93b3B0aW0KICAgIGluY3IgbnVtY29tbWl0cwoKICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXSAmJiAkc2VsZWN0ZWRsaW5lID49ICRyb3d9IHsKCWluY3Igc2VsZWN0ZWRsaW5lCiAgICB9CiAgICByZWRpc3BsYXkKfQoKIyBEb24ndCBjaGFuZ2UgdGhlIHRleHQgcGFuZSBjdXJzb3IgaWYgaXQgaXMgY3VycmVudGx5IHRoZSBoYW5kIGN1cnNvciwKIyBzaG93aW5nIHRoYXQgd2UgYXJlIG92ZXIgYSBzaGExIElEIGxpbmsuCnByb2Mgc2V0dGV4dGN1cnNvciB7Y30gewogICAgZ2xvYmFsIGN0ZXh0IGN1cnRleHRjdXJzb3IKCiAgICBpZiB7WyRjdGV4dCBjZ2V0IC1jdXJzb3JdID09ICRjdXJ0ZXh0Y3Vyc29yfSB7CgkkY3RleHQgY29uZmlnIC1jdXJzb3IgJGMKICAgIH0KICAgIHNldCBjdXJ0ZXh0Y3Vyc29yICRjCn0KCnByb2Mgbm93YnVzeSB7d2hhdH0gewogICAgZ2xvYmFsIGlzYnVzeQoKICAgIGlmIHtbYXJyYXkgbmFtZXMgaXNidXN5XSBlcSB7fX0gewoJLiBjb25maWcgLWN1cnNvciB3YXRjaAoJc2V0dGV4dGN1cnNvciB3YXRjaAogICAgfQogICAgc2V0IGlzYnVzeSgkd2hhdCkgMQp9Cgpwcm9jIG5vdGJ1c3kge3doYXR9IHsKICAgIGdsb2JhbCBpc2J1c3kgbWFpbmN1cnNvciB0ZXh0Y3Vyc29yCgogICAgY2F0Y2gge3Vuc2V0IGlzYnVzeSgkd2hhdCl9CiAgICBpZiB7W2FycmF5IG5hbWVzIGlzYnVzeV0gZXEge319IHsKCS4gY29uZmlnIC1jdXJzb3IgJG1haW5jdXJzb3IKCXNldHRleHRjdXJzb3IgJHRleHRjdXJzb3IKICAgIH0KfQoKcHJvYyBkcmF3cmVzdCB7fSB7CiAgICBnbG9iYWwgc3RhcnRtc2VjcwogICAgZ2xvYmFsIHJvd2xhaWRvdXQgY29tbWl0aWR4IGN1cnZpZXcKICAgIGdsb2JhbCBwZW5kaW5nX3NlbGVjdAoKICAgIHNldCByb3cgJHJvd2xhaWRvdXQKICAgIGxheW91dHJvd3MgJHJvd2xhaWRvdXQgJGNvbW1pdGlkeCgkY3VydmlldykgMQogICAgbGF5b3V0dGFpbAogICAgb3B0aW1pemVfcm93cyAkcm93IDAgJGNvbW1pdGlkeCgkY3VydmlldykKICAgIHNob3dzdHVmZiAkY29tbWl0aWR4KCRjdXJ2aWV3KQogICAgaWYge1tpbmZvIGV4aXN0cyBwZW5kaW5nX3NlbGVjdF19IHsKCXNlbGVjdGxpbmUgMCAxCiAgICB9CgogICAgc2V0IGRyYXdtc2VjcyBbZXhwciB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSAtICRzdGFydG1zZWNzfV0KICAgICNnbG9iYWwgbnVtY29tbWl0cwogICAgI3B1dHMgIm92ZXJhbGwgJGRyYXdtc2VjcyBtcyBmb3IgJG51bWNvbW1pdHMgY29tbWl0cyIKfQoKcHJvYyBmaW5kbWF0Y2hlcyB7Zn0gewogICAgZ2xvYmFsIGZpbmR0eXBlIGZvdW5kc3RyaW5nIGZvdW5kc3RybGVuCiAgICBpZiB7JGZpbmR0eXBlID09ICJSZWdleHAifSB7CglzZXQgbWF0Y2hlcyBbcmVnZXhwIC1pbmRpY2VzIC1hbGwgLWlubGluZSAkZm91bmRzdHJpbmcgJGZdCiAgICB9IGVsc2UgewoJaWYgeyRmaW5kdHlwZSA9PSAiSWduQ2FzZSJ9IHsKCSAgICBzZXQgc3RyIFtzdHJpbmcgdG9sb3dlciAkZl0KCX0gZWxzZSB7CgkgICAgc2V0IHN0ciAkZgoJfQoJc2V0IG1hdGNoZXMge30KCXNldCBpIDAKCXdoaWxlIHtbc2V0IGogW3N0cmluZyBmaXJzdCAkZm91bmRzdHJpbmcgJHN0ciAkaV1dID49IDB9IHsKCSAgICBsYXBwZW5kIG1hdGNoZXMgW2xpc3QgJGogW2V4cHIgeyRqKyRmb3VuZHN0cmxlbi0xfV1dCgkgICAgc2V0IGkgW2V4cHIgeyRqICsgJGZvdW5kc3RybGVufV0KCX0KICAgIH0KICAgIHJldHVybiAkbWF0Y2hlcwp9Cgpwcm9jIGRvZmluZCB7fSB7CiAgICBnbG9iYWwgZmluZHR5cGUgZmluZGxvYyBmaW5kc3RyaW5nIG1hcmtlZG1hdGNoZXMgY29tbWl0aW5mbwogICAgZ2xvYmFsIG51bWNvbW1pdHMgZGlzcGxheW9yZGVyIGxpbmVodGFnIGxpbmVudGFnIGxpbmVkdGFnCiAgICBnbG9iYWwgbWFpbmZvbnQgY2FudiBjYW52MiBjYW52MyBzZWxlY3RlZGxpbmUKICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIGZvdW5kc3RyaW5nIGZvdW5kc3RybGVuIG1hdGNoc3RyaW5nCiAgICBnbG9iYWwgY29tbWl0ZGF0YQoKICAgIHN0b3BmaW5kcHJvYwogICAgdW5tYXJrbWF0Y2hlcwogICAgY2FuY2VsX25leHRfaGlnaGxpZ2h0CiAgICBmb2N1cyAuCiAgICBzZXQgbWF0Y2hpbmdsaW5lcyB7fQogICAgaWYgeyRmaW5kdHlwZSA9PSAiSWduQ2FzZSJ9IHsKCXNldCBmb3VuZHN0cmluZyBbc3RyaW5nIHRvbG93ZXIgJGZpbmRzdHJpbmddCiAgICB9IGVsc2UgewoJc2V0IGZvdW5kc3RyaW5nICRmaW5kc3RyaW5nCiAgICB9CiAgICBzZXQgZm91bmRzdHJsZW4gW3N0cmluZyBsZW5ndGggJGZpbmRzdHJpbmddCiAgICBpZiB7JGZvdW5kc3RybGVuID09IDB9IHJldHVybgogICAgcmVnc3ViIC1hbGwge1sqP1xbXFxdfSAkZm91bmRzdHJpbmcge1xcJn0gbWF0Y2hzdHJpbmcKICAgIHNldCBtYXRjaHN0cmluZyAiKiRtYXRjaHN0cmluZyoiCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CglzZXQgb2xkc2VsIC0xCiAgICB9IGVsc2UgewoJc2V0IG9sZHNlbCAkc2VsZWN0ZWRsaW5lCiAgICB9CiAgICBzZXQgZGlkc2VsIDAKICAgIHNldCBmbGR0eXBlcyB7SGVhZGxpbmUgQXV0aG9yIERhdGUgQ29tbWl0dGVyIENEYXRlIENvbW1lbnRzfQogICAgc2V0IGwgLTEKICAgIGZvcmVhY2ggaWQgJGRpc3BsYXlvcmRlciB7CglzZXQgZCAkY29tbWl0ZGF0YSgkaWQpCglpbmNyIGwKCWlmIHskZmluZHR5cGUgPT0gIlJlZ2V4cCJ9IHsKCSAgICBzZXQgZG9lc21hdGNoIFtyZWdleHAgJGZvdW5kc3RyaW5nICRkXQoJfSBlbHNlaWYgeyRmaW5kdHlwZSA9PSAiSWduQ2FzZSJ9IHsKCSAgICBzZXQgZG9lc21hdGNoIFtzdHJpbmcgbWF0Y2ggLW5vY2FzZSAkbWF0Y2hzdHJpbmcgJGRdCgl9IGVsc2UgewoJICAgIHNldCBkb2VzbWF0Y2ggW3N0cmluZyBtYXRjaCAkbWF0Y2hzdHJpbmcgJGRdCgl9CglpZiB7ISRkb2VzbWF0Y2h9IGNvbnRpbnVlCglpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSB7CgkgICAgZ2V0Y29tbWl0ICRpZAoJfQoJc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQoJc2V0IGRvZXNtYXRjaCAwCglmb3JlYWNoIGYgJGluZm8gdHkgJGZsZHR5cGVzIHsKCSAgICBpZiB7JGZpbmRsb2MgIT0gIkFsbCBmaWVsZHMiICYmICRmaW5kbG9jICE9ICR0eX0gewoJCWNvbnRpbnVlCgkgICAgfQoJICAgIHNldCBtYXRjaGVzIFtmaW5kbWF0Y2hlcyAkZl0KCSAgICBpZiB7JG1hdGNoZXMgPT0ge319IGNvbnRpbnVlCgkgICAgc2V0IGRvZXNtYXRjaCAxCgkgICAgaWYgeyR0eSA9PSAiSGVhZGxpbmUifSB7CgkJZHJhd2NtaXRyb3cgJGwKCQltYXJrbWF0Y2hlcyAkY2FudiAkbCAkZiAkbGluZWh0YWcoJGwpICRtYXRjaGVzICRtYWluZm9udAoJICAgIH0gZWxzZWlmIHskdHkgPT0gIkF1dGhvciJ9IHsKCQlkcmF3Y21pdHJvdyAkbAoJCW1hcmttYXRjaGVzICRjYW52MiAkbCAkZiAkbGluZW50YWcoJGwpICRtYXRjaGVzICRtYWluZm9udAoJICAgIH0gZWxzZWlmIHskdHkgPT0gIkRhdGUifSB7CgkJZHJhd2NtaXRyb3cgJGwKCQltYXJrbWF0Y2hlcyAkY2FudjMgJGwgJGYgJGxpbmVkdGFnKCRsKSAkbWF0Y2hlcyAkbWFpbmZvbnQKCSAgICB9Cgl9CglpZiB7JGRvZXNtYXRjaH0gewoJICAgIGxhcHBlbmQgbWF0Y2hpbmdsaW5lcyAkbAoJICAgIGlmIHshJGRpZHNlbCAmJiAkbCA+ICRvbGRzZWx9IHsKCQlmaW5kc2VsZWN0bGluZSAkbAoJCXNldCBkaWRzZWwgMQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHskbWF0Y2hpbmdsaW5lcyA9PSB7fX0gewoJYmVsbAogICAgfSBlbHNlaWYgeyEkZGlkc2VsfSB7CglmaW5kc2VsZWN0bGluZSBbbGluZGV4ICRtYXRjaGluZ2xpbmVzIDBdCiAgICB9Cn0KCnByb2MgZmluZHNlbGVjdGxpbmUge2x9IHsKICAgIGdsb2JhbCBmaW5kbG9jIGNvbW1lbnRlbmQgY3RleHQKICAgIHNlbGVjdGxpbmUgJGwgMQogICAgaWYgeyRmaW5kbG9jID09ICJBbGwgZmllbGRzIiB8fCAkZmluZGxvYyA9PSAiQ29tbWVudHMifSB7CgkjIGhpZ2hsaWdodCB0aGUgbWF0Y2hlcyBpbiB0aGUgY29tbWVudHMKCXNldCBmIFskY3RleHQgZ2V0IDEuMCAkY29tbWVudGVuZF0KCXNldCBtYXRjaGVzIFtmaW5kbWF0Y2hlcyAkZl0KCWZvcmVhY2ggbWF0Y2ggJG1hdGNoZXMgewoJICAgIHNldCBzdGFydCBbbGluZGV4ICRtYXRjaCAwXQoJICAgIHNldCBlbmQgW2V4cHIge1tsaW5kZXggJG1hdGNoIDFdICsgMX1dCgkgICAgJGN0ZXh0IHRhZyBhZGQgZm91bmQgIjEuMCArICRzdGFydCBjIiAiMS4wICsgJGVuZCBjIgoJfQogICAgfQp9Cgpwcm9jIGZpbmRuZXh0IHtyZXN0YXJ0fSB7CiAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyBzZWxlY3RlZGxpbmUKICAgIGlmIHshW2luZm8gZXhpc3RzIG1hdGNoaW5nbGluZXNdfSB7CglpZiB7JHJlc3RhcnR9IHsKCSAgICBkb2ZpbmQKCX0KCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBmb3JlYWNoIGwgJG1hdGNoaW5nbGluZXMgewoJaWYgeyRsID4gJHNlbGVjdGVkbGluZX0gewoJICAgIGZpbmRzZWxlY3RsaW5lICRsCgkgICAgcmV0dXJuCgl9CiAgICB9CiAgICBiZWxsCn0KCnByb2MgZmluZHByZXYge30gewogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgc2VsZWN0ZWRsaW5lCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBtYXRjaGluZ2xpbmVzXX0gewoJZG9maW5kCglyZXR1cm4KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgc2V0IHByZXYge30KICAgIGZvcmVhY2ggbCAkbWF0Y2hpbmdsaW5lcyB7CglpZiB7JGwgPj0gJHNlbGVjdGVkbGluZX0gYnJlYWsKCXNldCBwcmV2ICRsCiAgICB9CiAgICBpZiB7JHByZXYgIT0ge319IHsKCWZpbmRzZWxlY3RsaW5lICRwcmV2CiAgICB9IGVsc2UgewoJYmVsbAogICAgfQp9Cgpwcm9jIHN0b3BmaW5kcHJvYyB7e2RvbmUgMH19IHsKICAgIGdsb2JhbCBmaW5kcHJvY3BpZCBmaW5kcHJvY2ZpbGUgZmluZGlkcwogICAgZ2xvYmFsIGN0ZXh0IGZpbmRvbGRjdXJzb3IgcGhhc2UgbWFpbmN1cnNvciB0ZXh0Y3Vyc29yCiAgICBnbG9iYWwgZmluZGlucHJvZ3Jlc3MKCiAgICBjYXRjaCB7dW5zZXQgZmluZGlkc30KICAgIGlmIHtbaW5mbyBleGlzdHMgZmluZHByb2NwaWRdfSB7CglpZiB7ISRkb25lfSB7CgkgICAgY2F0Y2gge2V4ZWMga2lsbCAkZmluZHByb2NwaWR9Cgl9CgljYXRjaCB7Y2xvc2UgJGZpbmRwcm9jZmlsZX0KCXVuc2V0IGZpbmRwcm9jcGlkCiAgICB9CiAgICBjYXRjaCB7dW5zZXQgZmluZGlucHJvZ3Jlc3N9CiAgICBub3RidXN5IGZpbmQKfQoKIyBtYXJrIGEgY29tbWl0IGFzIG1hdGNoaW5nIGJ5IHB1dHRpbmcgYSB5ZWxsb3cgYmFja2dyb3VuZAojIGJlaGluZCB0aGUgaGVhZGxpbmUKcHJvYyBtYXJraGVhZGxpbmUge2wgaWR9IHsKICAgIGdsb2JhbCBjYW52IG1haW5mb250IGxpbmVodGFnCgogICAgZHJhd2NtaXRyb3cgJGwKICAgIHNldCBiYm94IFskY2FudiBiYm94ICRsaW5laHRhZygkbCldCiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIHJlY3QgJGJib3ggLW91dGxpbmUge30gLXRhZ3MgbWF0Y2hlcyAtZmlsbCB5ZWxsb3ddCiAgICAkY2FudiBsb3dlciAkdAp9CgojIG1hcmsgdGhlIGJpdHMgb2YgYSBoZWFkbGluZSwgYXV0aG9yIG9yIGRhdGUgdGhhdCBtYXRjaCBhIGZpbmQgc3RyaW5nCnByb2MgbWFya21hdGNoZXMge2NhbnYgbCBzdHIgdGFnIG1hdGNoZXMgZm9udH0gewogICAgc2V0IGJib3ggWyRjYW52IGJib3ggJHRhZ10KICAgIHNldCB4MCBbbGluZGV4ICRiYm94IDBdCiAgICBzZXQgeTAgW2xpbmRleCAkYmJveCAxXQogICAgc2V0IHkxIFtsaW5kZXggJGJib3ggM10KICAgIGZvcmVhY2ggbWF0Y2ggJG1hdGNoZXMgewoJc2V0IHN0YXJ0IFtsaW5kZXggJG1hdGNoIDBdCglzZXQgZW5kIFtsaW5kZXggJG1hdGNoIDFdCglpZiB7JHN0YXJ0ID4gJGVuZH0gY29udGludWUKCXNldCB4b2ZmIFtmb250IG1lYXN1cmUgJGZvbnQgW3N0cmluZyByYW5nZSAkc3RyIDAgW2V4cHIgeyRzdGFydC0xfV1dXQoJc2V0IHhsZW4gW2ZvbnQgbWVhc3VyZSAkZm9udCBbc3RyaW5nIHJhbmdlICRzdHIgMCBbZXhwciB7JGVuZH1dXV0KCXNldCB0IFskY2FudiBjcmVhdGUgcmVjdCBbZXhwciB7JHgwKyR4b2ZmfV0gJHkwIFwKCQkgICBbZXhwciB7JHgwKyR4bGVuKzJ9XSAkeTEgXAoJCSAgIC1vdXRsaW5lIHt9IC10YWdzIG1hdGNoZXMgLWZpbGwgeWVsbG93XQoJJGNhbnYgbG93ZXIgJHQKICAgIH0KfQoKcHJvYyB1bm1hcmttYXRjaGVzIHt9IHsKICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIGZpbmRpZHMKICAgIGFsbGNhbnZzIGRlbGV0ZSBtYXRjaGVzCiAgICBjYXRjaCB7dW5zZXQgbWF0Y2hpbmdsaW5lc30KICAgIGNhdGNoIHt1bnNldCBmaW5kaWRzfQp9Cgpwcm9jIHNlbGNhbnZsaW5lIHt3IHggeX0gewogICAgZ2xvYmFsIGNhbnYgY2FudnkwIGN0ZXh0IGxpbmVzcGMKICAgIGdsb2JhbCByb3d0ZXh0eAogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgaWYgeyR5bWF4ID09IHt9fSByZXR1cm4KICAgIHNldCB5ZnJhYyBbbGluZGV4IFskY2FudiB5dmlld10gMF0KICAgIHNldCB5IFtleHByIHskeSArICR5ZnJhYyAqICR5bWF4fV0KICAgIHNldCBsIFtleHByIHtpbnQoKCR5IC0gJGNhbnZ5MCkgLyAkbGluZXNwYyArIDAuNSl9XQogICAgaWYgeyRsIDwgMH0gewoJc2V0IGwgMAogICAgfQogICAgaWYgeyR3IGVxICRjYW52fSB7CglpZiB7IVtpbmZvIGV4aXN0cyByb3d0ZXh0eCgkbCldIHx8ICR4IDwgJHJvd3RleHR4KCRsKX0gcmV0dXJuCiAgICB9CiAgICB1bm1hcmttYXRjaGVzCiAgICBzZWxlY3RsaW5lICRsIDEKfQoKcHJvYyBjb21taXRfZGVzY3JpcHRvciB7cH0gewogICAgZ2xvYmFsIGNvbW1pdGluZm8KICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJHApXX0gewoJZ2V0Y29tbWl0ICRwCiAgICB9CiAgICBzZXQgbCAiLi4uIgogICAgaWYge1tsbGVuZ3RoICRjb21taXRpbmZvKCRwKV0gPiAxfSB7CglzZXQgbCBbbGluZGV4ICRjb21taXRpbmZvKCRwKSAwXQogICAgfQogICAgcmV0dXJuICIkcCAoJGwpXG4iCn0KCiMgYXBwZW5kIHNvbWUgdGV4dCB0byB0aGUgY3RleHQgd2lkZ2V0LCBhbmQgbWFrZSBhbnkgU0hBMSBJRAojIHRoYXQgd2Uga25vdyBhYm91dCBiZSBhIGNsaWNrYWJsZSBsaW5rLgpwcm9jIGFwcGVuZHdpdGhsaW5rcyB7dGV4dCB0YWdzfSB7CiAgICBnbG9iYWwgY3RleHQgY29tbWl0cm93IGxpbmtudW0gY3VydmlldwoKICAgIHNldCBzdGFydCBbJGN0ZXh0IGluZGV4ICJlbmQgLSAxYyJdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAkdGV4dCAkdGFncwogICAgc2V0IGxpbmtzIFtyZWdleHAgLWluZGljZXMgLWFsbCAtaW5saW5lIHtbMC05YS1mXXs0MH19ICR0ZXh0XQogICAgZm9yZWFjaCBsICRsaW5rcyB7CglzZXQgcyBbbGluZGV4ICRsIDBdCglzZXQgZSBbbGluZGV4ICRsIDFdCglzZXQgbGlua2lkIFtzdHJpbmcgcmFuZ2UgJHRleHQgJHMgJGVdCglpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGxpbmtpZCldfSBjb250aW51ZQoJaW5jciBlCgkkY3RleHQgdGFnIGFkZCBsaW5rICIkc3RhcnQgKyAkcyBjIiAiJHN0YXJ0ICsgJGUgYyIKCSRjdGV4dCB0YWcgYWRkIGxpbmskbGlua251bSAiJHN0YXJ0ICsgJHMgYyIgIiRzdGFydCArICRlIGMiCgkkY3RleHQgdGFnIGJpbmQgbGluayRsaW5rbnVtIDwxPiBcCgkgICAgW2xpc3Qgc2VsZWN0bGluZSAkY29tbWl0cm93KCRjdXJ2aWV3LCRsaW5raWQpIDFdCglpbmNyIGxpbmtudW0KICAgIH0KICAgICRjdGV4dCB0YWcgY29uZiBsaW5rIC1mb3JlZ3JvdW5kIGJsdWUgLXVuZGVybGluZSAxCiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8RW50ZXI+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgaGFuZDIgfQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPExlYXZlPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yICRjdXJ0ZXh0Y3Vyc29yIH0KfQoKcHJvYyB2aWV3bmV4dGxpbmUge2Rpcn0gewogICAgZ2xvYmFsIGNhbnYgbGluZXNwYwoKICAgICRjYW52IGRlbGV0ZSBob3ZlcgogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgc2V0IHdub3cgWyRjYW52IHl2aWV3XQogICAgc2V0IHd0b3AgW2V4cHIge1tsaW5kZXggJHdub3cgMF0gKiAkeW1heH1dCiAgICBzZXQgbmV3dG9wIFtleHByIHskd3RvcCArICRkaXIgKiAkbGluZXNwY31dCiAgICBpZiB7JG5ld3RvcCA8IDB9IHsKCXNldCBuZXd0b3AgMAogICAgfSBlbHNlaWYgeyRuZXd0b3AgPiAkeW1heH0gewoJc2V0IG5ld3RvcCAkeW1heAogICAgfQogICAgYWxsY2FudnMgeXZpZXcgbW92ZXRvIFtleHByIHskbmV3dG9wICogMS4wIC8gJHltYXh9XQp9CgojIGFkZCBhIGxpc3Qgb2YgdGFnIG9yIGJyYW5jaCBuYW1lcyBhdCBwb3NpdGlvbiBwb3MKIyByZXR1cm5zIHRoZSBudW1iZXIgb2YgbmFtZXMgaW5zZXJ0ZWQKcHJvYyBhcHBlbmRyZWZzIHtwb3MgdGFncyB2YXJ9IHsKICAgIGdsb2JhbCBjdGV4dCBjb21taXRyb3cgbGlua251bSBjdXJ2aWV3ICR2YXIKCiAgICBpZiB7W2NhdGNoIHskY3RleHQgaW5kZXggJHBvc31dfSB7CglyZXR1cm4gMAogICAgfQogICAgc2V0IHRhZ3MgW2xzb3J0ICR0YWdzXQogICAgc2V0IHNlcCB7fQogICAgZm9yZWFjaCB0YWcgJHRhZ3MgewoJc2V0IGlkIFtzZXQgJHZhclwoJHRhZ1wpXQoJc2V0IGxrIGxpbmskbGlua251bQoJaW5jciBsaW5rbnVtCgkkY3RleHQgaW5zZXJ0ICRwb3MgJHNlcAoJJGN0ZXh0IGluc2VydCAkcG9zICR0YWcgJGxrCgkkY3RleHQgdGFnIGNvbmYgJGxrIC1mb3JlZ3JvdW5kIGJsdWUKCWlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCldfSB7CgkgICAgJGN0ZXh0IHRhZyBiaW5kICRsayA8MT4gXAoJCVtsaXN0IHNlbGVjdGxpbmUgJGNvbW1pdHJvdygkY3VydmlldywkaWQpIDFdCgkgICAgJGN0ZXh0IHRhZyBjb25mICRsayAtdW5kZXJsaW5lIDEKCSAgICAkY3RleHQgdGFnIGJpbmQgJGxrIDxFbnRlcj4geyAlVyBjb25maWd1cmUgLWN1cnNvciBoYW5kMiB9CgkgICAgJGN0ZXh0IHRhZyBiaW5kICRsayA8TGVhdmU+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgJGN1cnRleHRjdXJzb3IgfQoJfQoJc2V0IHNlcCAiLCAiCiAgICB9CiAgICByZXR1cm4gW2xsZW5ndGggJHRhZ3NdCn0KCnByb2MgdGFnbGlzdCB7aWRzfSB7CiAgICBnbG9iYWwgaWR0YWdzCgogICAgc2V0IHRhZ3Mge30KICAgIGZvcmVhY2ggaWQgJGlkcyB7Cglmb3JlYWNoIHRhZyAkaWR0YWdzKCRpZCkgewoJICAgIGxhcHBlbmQgdGFncyAkdGFnCgl9CiAgICB9CiAgICByZXR1cm4gJHRhZ3MKfQoKIyBjYWxsZWQgd2hlbiB3ZSBoYXZlIGZpbmlzaGVkIGNvbXB1dGluZyB0aGUgbmVhcmJ5IHRhZ3MKcHJvYyBkaXNwbmVhcnRhZ3Mge30gewogICAgZ2xvYmFsIHNlbGVjdGVkbGluZSBjdXJyZW50aWQgY3RleHQgYW5jX3RhZ3MgZGVzY190YWdzIHNob3duZWFydGFncwogICAgZ2xvYmFsIGRlc2NfaGVhZHMKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdIHx8ICEkc2hvd25lYXJ0YWdzfSByZXR1cm4KICAgIHNldCBpZCAkY3VycmVudGlkCiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBpZiB7W2luZm8gZXhpc3RzIGRlc2NfaGVhZHMoJGlkKV19IHsKCWlmIHtbYXBwZW5kcmVmcyBicmFuY2ggJGRlc2NfaGVhZHMoJGlkKSBoZWFkaWRzXSA+IDF9IHsKCSAgICAkY3RleHQgaW5zZXJ0ICJicmFuY2ggLTJjIiAiZXMiCgl9CiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGFuY190YWdzKCRpZCldfSB7CglhcHBlbmRyZWZzIGZvbGxvd3MgW3RhZ2xpc3QgJGFuY190YWdzKCRpZCldIHRhZ2lkcwogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBkZXNjX3RhZ3MoJGlkKV19IHsKCWFwcGVuZHJlZnMgcHJlY2VkZXMgW3RhZ2xpc3QgJGRlc2NfdGFncygkaWQpXSB0YWdpZHMKICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAp9Cgpwcm9jIHNlbGVjdGxpbmUge2wgaXNuZXd9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIGN0ZXh0IGNvbW1pdGluZm8gc2VsZWN0ZWRsaW5lCiAgICBnbG9iYWwgZGlzcGxheW9yZGVyIGxpbmVodGFnIGxpbmVudGFnIGxpbmVkdGFnCiAgICBnbG9iYWwgY2FudnkwIGxpbmVzcGMgcGFyZW50bGlzdCBjaGlsZGxpc3QKICAgIGdsb2JhbCBjdXJyZW50aWQgc2hhMWVudHJ5CiAgICBnbG9iYWwgY29tbWVudGVuZCBpZHRhZ3MgbGlua251bQogICAgZ2xvYmFsIG1lcmdlbWF4IG51bWNvbW1pdHMgcGVuZGluZ19zZWxlY3QKICAgIGdsb2JhbCBjbWl0bW9kZSBkZXNjX3RhZ3MgYW5jX3RhZ3Mgc2hvd25lYXJ0YWdzIGFsbGNvbW1pdHMgZGVzY19oZWFkcwoKICAgIGNhdGNoIHt1bnNldCBwZW5kaW5nX3NlbGVjdH0KICAgICRjYW52IGRlbGV0ZSBob3ZlcgogICAgbm9ybWFsbGluZQogICAgY2FuY2VsX25leHRfaGlnaGxpZ2h0CiAgICBpZiB7JGwgPCAwIHx8ICRsID49ICRudW1jb21taXRzfSByZXR1cm4KICAgIHNldCB5IFtleHByIHskY2FudnkwICsgJGwgKiAkbGluZXNwY31dCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBzZXQgeXRvcCBbZXhwciB7JHkgLSAkbGluZXNwYyAtIDF9XQogICAgc2V0IHlib3QgW2V4cHIgeyR5ICsgJGxpbmVzcGMgKyAxfV0KICAgIHNldCB3bm93IFskY2FudiB5dmlld10KICAgIHNldCB3dG9wIFtleHByIHtbbGluZGV4ICR3bm93IDBdICogJHltYXh9XQogICAgc2V0IHdib3QgW2V4cHIge1tsaW5kZXggJHdub3cgMV0gKiAkeW1heH1dCiAgICBzZXQgd2ggW2V4cHIgeyR3Ym90IC0gJHd0b3B9XQogICAgc2V0IG5ld3RvcCAkd3RvcAogICAgaWYgeyR5dG9wIDwgJHd0b3B9IHsKCWlmIHskeWJvdCA8ICR3dG9wfSB7CgkgICAgc2V0IG5ld3RvcCBbZXhwciB7JHkgLSAkd2ggLyAyLjB9XQoJfSBlbHNlIHsKCSAgICBzZXQgbmV3dG9wICR5dG9wCgkgICAgaWYgeyRuZXd0b3AgPiAkd3RvcCAtICRsaW5lc3BjfSB7CgkJc2V0IG5ld3RvcCBbZXhwciB7JHd0b3AgLSAkbGluZXNwY31dCgkgICAgfQoJfQogICAgfSBlbHNlaWYgeyR5Ym90ID4gJHdib3R9IHsKCWlmIHskeXRvcCA+ICR3Ym90fSB7CgkgICAgc2V0IG5ld3RvcCBbZXhwciB7JHkgLSAkd2ggLyAyLjB9XQoJfSBlbHNlIHsKCSAgICBzZXQgbmV3dG9wIFtleHByIHskeWJvdCAtICR3aH1dCgkgICAgaWYgeyRuZXd0b3AgPCAkd3RvcCArICRsaW5lc3BjfSB7CgkJc2V0IG5ld3RvcCBbZXhwciB7JHd0b3AgKyAkbGluZXNwY31dCgkgICAgfQoJfQogICAgfQogICAgaWYgeyRuZXd0b3AgIT0gJHd0b3B9IHsKCWlmIHskbmV3dG9wIDwgMH0gewoJICAgIHNldCBuZXd0b3AgMAoJfQoJYWxsY2FudnMgeXZpZXcgbW92ZXRvIFtleHByIHskbmV3dG9wICogMS4wIC8gJHltYXh9XQoJZHJhd3Zpc2libGUKICAgIH0KCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBsaW5laHRhZygkbCldfSByZXR1cm4KICAgICRjYW52IGRlbGV0ZSBzZWNzZWwKICAgIHNldCB0IFtldmFsICRjYW52IGNyZWF0ZSByZWN0IFskY2FudiBiYm94ICRsaW5laHRhZygkbCldIC1vdXRsaW5lIHt7fX0gXAoJICAgICAgIC10YWdzIHNlY3NlbCAtZmlsbCBbJGNhbnYgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCiAgICAkY2FudiBsb3dlciAkdAogICAgJGNhbnYyIGRlbGV0ZSBzZWNzZWwKICAgIHNldCB0IFtldmFsICRjYW52MiBjcmVhdGUgcmVjdCBbJGNhbnYyIGJib3ggJGxpbmVudGFnKCRsKV0gLW91dGxpbmUge3t9fSBcCgkgICAgICAgLXRhZ3Mgc2Vjc2VsIC1maWxsIFskY2FudjIgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCiAgICAkY2FudjIgbG93ZXIgJHQKICAgICRjYW52MyBkZWxldGUgc2Vjc2VsCiAgICBzZXQgdCBbZXZhbCAkY2FudjMgY3JlYXRlIHJlY3QgWyRjYW52MyBiYm94ICRsaW5lZHRhZygkbCldIC1vdXRsaW5lIHt7fX0gXAoJICAgICAgIC10YWdzIHNlY3NlbCAtZmlsbCBbJGNhbnYzIGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQogICAgJGNhbnYzIGxvd2VyICR0CgogICAgaWYgeyRpc25ld30gewoJYWRkdG9oaXN0b3J5IFtsaXN0IHNlbGVjdGxpbmUgJGwgMF0KICAgIH0KCiAgICBzZXQgc2VsZWN0ZWRsaW5lICRsCgogICAgc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkbF0KICAgIHNldCBjdXJyZW50aWQgJGlkCiAgICAkc2hhMWVudHJ5IGRlbGV0ZSAwIGVuZAogICAgJHNoYTFlbnRyeSBpbnNlcnQgMCAkaWQKICAgICRzaGExZW50cnkgc2VsZWN0aW9uIGZyb20gMAogICAgJHNoYTFlbnRyeSBzZWxlY3Rpb24gdG8gZW5kCiAgICByaGlnaGxpZ2h0X3NlbCAkaWQKCiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBjbGVhcl9jdGV4dAogICAgc2V0IGxpbmtudW0gMAogICAgc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQogICAgc2V0IGRhdGUgW2Zvcm1hdGRhdGUgW2xpbmRleCAkaW5mbyAyXV0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJBdXRob3I6IFtsaW5kZXggJGluZm8gMV0gICRkYXRlXG4iCiAgICBzZXQgZGF0ZSBbZm9ybWF0ZGF0ZSBbbGluZGV4ICRpbmZvIDRdXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIkNvbW1pdHRlcjogW2xpbmRleCAkaW5mbyAzXSAgJGRhdGVcbiIKICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiVGFnczoiCglmb3JlYWNoIHRhZyAkaWR0YWdzKCRpZCkgewoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIgJHRhZyIKCX0KCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgIH0KIAogICAgc2V0IGhlYWRlcnMge30KICAgIHNldCBvbGRzIFtsaW5kZXggJHBhcmVudGxpc3QgJGxdCiAgICBpZiB7W2xsZW5ndGggJG9sZHNdID4gMX0gewoJc2V0IG5wIDAKCWZvcmVhY2ggcCAkb2xkcyB7CgkgICAgaWYgeyRucCA+PSAkbWVyZ2VtYXh9IHsKCQlzZXQgdGFnIG1tYXgKCSAgICB9IGVsc2UgewoJCXNldCB0YWcgbSRucAoJICAgIH0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiUGFyZW50OiAiICR0YWcKCSAgICBhcHBlbmR3aXRobGlua3MgW2NvbW1pdF9kZXNjcmlwdG9yICRwXSB7fQoJICAgIGluY3IgbnAKCX0KICAgIH0gZWxzZSB7Cglmb3JlYWNoIHAgJG9sZHMgewoJICAgIGFwcGVuZCBoZWFkZXJzICJQYXJlbnQ6IFtjb21taXRfZGVzY3JpcHRvciAkcF0iCgl9CiAgICB9CgogICAgZm9yZWFjaCBjIFtsaW5kZXggJGNoaWxkbGlzdCAkbF0gewoJYXBwZW5kIGhlYWRlcnMgIkNoaWxkOiAgW2NvbW1pdF9kZXNjcmlwdG9yICRjXSIKICAgIH0KCiAgICAjIG1ha2UgYW55dGhpbmcgdGhhdCBsb29rcyBsaWtlIGEgU0hBMSBJRCBiZSBhIGNsaWNrYWJsZSBsaW5rCiAgICBhcHBlbmR3aXRobGlua3MgJGhlYWRlcnMge30KICAgIGlmIHskc2hvd25lYXJ0YWdzfSB7CglpZiB7IVtpbmZvIGV4aXN0cyBhbGxjb21taXRzXX0gewoJICAgIGdldGFsbGNvbW1pdHMKCX0KCSRjdGV4dCBpbnNlcnQgZW5kICJCcmFuY2g6ICIKCSRjdGV4dCBtYXJrIHNldCBicmFuY2ggImVuZCAtMWMiCgkkY3RleHQgbWFyayBncmF2aXR5IGJyYW5jaCBsZWZ0CglpZiB7W2luZm8gZXhpc3RzIGRlc2NfaGVhZHMoJGlkKV19IHsKCSAgICBpZiB7W2FwcGVuZHJlZnMgYnJhbmNoICRkZXNjX2hlYWRzKCRpZCkgaGVhZGlkc10gPiAxfSB7CgkJIyB0dXJuICJCcmFuY2giIGludG8gIkJyYW5jaGVzIgoJCSRjdGV4dCBpbnNlcnQgImJyYW5jaCAtMmMiICJlcyIKCSAgICB9Cgl9CgkkY3RleHQgaW5zZXJ0IGVuZCAiXG5Gb2xsb3dzOiAiCgkkY3RleHQgbWFyayBzZXQgZm9sbG93cyAiZW5kIC0xYyIKCSRjdGV4dCBtYXJrIGdyYXZpdHkgZm9sbG93cyBsZWZ0CglpZiB7W2luZm8gZXhpc3RzIGFuY190YWdzKCRpZCldfSB7CgkgICAgYXBwZW5kcmVmcyBmb2xsb3dzIFt0YWdsaXN0ICRhbmNfdGFncygkaWQpXSB0YWdpZHMKCX0KCSRjdGV4dCBpbnNlcnQgZW5kICJcblByZWNlZGVzOiAiCgkkY3RleHQgbWFyayBzZXQgcHJlY2VkZXMgImVuZCAtMWMiCgkkY3RleHQgbWFyayBncmF2aXR5IHByZWNlZGVzIGxlZnQKCWlmIHtbaW5mbyBleGlzdHMgZGVzY190YWdzKCRpZCldfSB7CgkgICAgYXBwZW5kcmVmcyBwcmVjZWRlcyBbdGFnbGlzdCAkZGVzY190YWdzKCRpZCldIHRhZ2lkcwoJfQoJJGN0ZXh0IGluc2VydCBlbmQgIlxuIgogICAgfQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuIgogICAgYXBwZW5kd2l0aGxpbmtzIFtsaW5kZXggJGluZm8gNV0ge2NvbW1lbnR9CgogICAgJGN0ZXh0IHRhZyBkZWxldGUgQ29tbWVudHMKICAgICRjdGV4dCB0YWcgcmVtb3ZlIGZvdW5kIDEuMCBlbmQKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgc2V0IGNvbW1lbnRlbmQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoKICAgIGluaXRfZmxpc3QgIkNvbW1lbnRzIgogICAgaWYgeyRjbWl0bW9kZSBlcSAidHJlZSJ9IHsKCWdldHRyZWUgJGlkCiAgICB9IGVsc2VpZiB7W2xsZW5ndGggJG9sZHNdIDw9IDF9IHsKCXN0YXJ0ZGlmZiAkaWQKICAgIH0gZWxzZSB7CgltZXJnZWRpZmYgJGlkICRsCiAgICB9Cn0KCnByb2Mgc2VsZmlyc3RsaW5lIHt9IHsKICAgIHVubWFya21hdGNoZXMKICAgIHNlbGVjdGxpbmUgMCAxCn0KCnByb2Mgc2VsbGFzdGxpbmUge30gewogICAgZ2xvYmFsIG51bWNvbW1pdHMKICAgIHVubWFya21hdGNoZXMKICAgIHNldCBsIFtleHByIHskbnVtY29tbWl0cyAtIDF9XQogICAgc2VsZWN0bGluZSAkbCAxCn0KCnByb2Mgc2VsbmV4dGxpbmUge2Rpcn0gewogICAgZ2xvYmFsIHNlbGVjdGVkbGluZQogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBzZXQgbCBbZXhwciB7JHNlbGVjdGVkbGluZSArICRkaXJ9XQogICAgdW5tYXJrbWF0Y2hlcwogICAgc2VsZWN0bGluZSAkbCAxCn0KCnByb2Mgc2VsbmV4dHBhZ2Uge2Rpcn0gewogICAgZ2xvYmFsIGNhbnYgbGluZXNwYyBzZWxlY3RlZGxpbmUgbnVtY29tbWl0cwoKICAgIHNldCBscHAgW2V4cHIgeyhbd2luZm8gaGVpZ2h0ICRjYW52XSAtIDIpIC8gJGxpbmVzcGN9XQogICAgaWYgeyRscHAgPCAxfSB7CglzZXQgbHBwIDEKICAgIH0KICAgIGFsbGNhbnZzIHl2aWV3IHNjcm9sbCBbZXhwciB7JGRpciAqICRscHB9XSB1bml0cwogICAgZHJhd3Zpc2libGUKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgc2V0IGwgW2V4cHIgeyRzZWxlY3RlZGxpbmUgKyAkZGlyICogJGxwcH1dCiAgICBpZiB7JGwgPCAwfSB7CglzZXQgbCAwCiAgICB9IGVsc2VpZiB7JGwgPj0gJG51bWNvbW1pdHN9IHsKICAgICAgICBzZXQgbCBbZXhwciAkbnVtY29tbWl0cyAtIDFdCiAgICB9CiAgICB1bm1hcmttYXRjaGVzCiAgICBzZWxlY3RsaW5lICRsIDEgICAgCn0KCnByb2MgdW5zZWxlY3RsaW5lIHt9IHsKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUgY3VycmVudGlkCgogICAgY2F0Y2gge3Vuc2V0IHNlbGVjdGVkbGluZX0KICAgIGNhdGNoIHt1bnNldCBjdXJyZW50aWR9CiAgICBhbGxjYW52cyBkZWxldGUgc2Vjc2VsCiAgICByaGlnaGxpZ2h0X25vbmUKICAgIGNhbmNlbF9uZXh0X2hpZ2hsaWdodAp9Cgpwcm9jIHJlc2VsZWN0bGluZSB7fSB7CiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lCgogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CglzZWxlY3RsaW5lICRzZWxlY3RlZGxpbmUgMAogICAgfQp9Cgpwcm9jIGFkZHRvaGlzdG9yeSB7Y21kfSB7CiAgICBnbG9iYWwgaGlzdG9yeSBoaXN0b3J5aW5kZXggY3VydmlldwoKICAgIHNldCBlbHQgW2xpc3QgJGN1cnZpZXcgJGNtZF0KICAgIGlmIHskaGlzdG9yeWluZGV4ID4gMAoJJiYgW2xpbmRleCAkaGlzdG9yeSBbZXhwciB7JGhpc3RvcnlpbmRleCAtIDF9XV0gPT0gJGVsdH0gewoJcmV0dXJuCiAgICB9CgogICAgaWYgeyRoaXN0b3J5aW5kZXggPCBbbGxlbmd0aCAkaGlzdG9yeV19IHsKCXNldCBoaXN0b3J5IFtscmVwbGFjZSAkaGlzdG9yeSAkaGlzdG9yeWluZGV4IGVuZCAkZWx0XQogICAgfSBlbHNlIHsKCWxhcHBlbmQgaGlzdG9yeSAkZWx0CiAgICB9CiAgICBpbmNyIGhpc3RvcnlpbmRleAogICAgaWYgeyRoaXN0b3J5aW5kZXggPiAxfSB7CgkuY3RvcC50b3AuYmFyLmxlZnRidXQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICB9IGVsc2UgewoJLmN0b3AudG9wLmJhci5sZWZ0YnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICB9CiAgICAuY3RvcC50b3AuYmFyLnJpZ2h0YnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkCn0KCnByb2MgZ29kbyB7ZWx0fSB7CiAgICBnbG9iYWwgY3VydmlldwoKICAgIHNldCB2aWV3IFtsaW5kZXggJGVsdCAwXQogICAgc2V0IGNtZCBbbGluZGV4ICRlbHQgMV0KICAgIGlmIHskY3VydmlldyAhPSAkdmlld30gewoJc2hvd3ZpZXcgJHZpZXcKICAgIH0KICAgIGV2YWwgJGNtZAp9Cgpwcm9jIGdvYmFjayB7fSB7CiAgICBnbG9iYWwgaGlzdG9yeSBoaXN0b3J5aW5kZXgKCiAgICBpZiB7JGhpc3RvcnlpbmRleCA+IDF9IHsKCWluY3IgaGlzdG9yeWluZGV4IC0xCglnb2RvIFtsaW5kZXggJGhpc3RvcnkgW2V4cHIgeyRoaXN0b3J5aW5kZXggLSAxfV1dCgkuY3RvcC50b3AuYmFyLnJpZ2h0YnV0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgfQogICAgaWYgeyRoaXN0b3J5aW5kZXggPD0gMX0gewoJLmN0b3AudG9wLmJhci5sZWZ0YnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICB9Cn0KCnByb2MgZ29mb3J3IHt9IHsKICAgIGdsb2JhbCBoaXN0b3J5IGhpc3RvcnlpbmRleAoKICAgIGlmIHskaGlzdG9yeWluZGV4IDwgW2xsZW5ndGggJGhpc3RvcnldfSB7CglzZXQgY21kIFtsaW5kZXggJGhpc3RvcnkgJGhpc3RvcnlpbmRleF0KCWluY3IgaGlzdG9yeWluZGV4Cglnb2RvICRjbWQKCS5jdG9wLnRvcC5iYXIubGVmdGJ1dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIH0KICAgIGlmIHskaGlzdG9yeWluZGV4ID49IFtsbGVuZ3RoICRoaXN0b3J5XX0gewoJLmN0b3AudG9wLmJhci5yaWdodGJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgfQp9Cgpwcm9jIGdldHRyZWUge2lkfSB7CiAgICBnbG9iYWwgdHJlZWZpbGVsaXN0IHRyZWVpZGxpc3QgZGlmZmlkcyBkaWZmbWVyZ2VpZCB0cmVlcGVuZGluZwoKICAgIHNldCBkaWZmaWRzICRpZAogICAgY2F0Y2gge3Vuc2V0IGRpZmZtZXJnZWlkfQogICAgaWYgeyFbaW5mbyBleGlzdHMgdHJlZWZpbGVsaXN0KCRpZCldfSB7CglpZiB7IVtpbmZvIGV4aXN0cyB0cmVlcGVuZGluZ119IHsKCSAgICBpZiB7W2NhdGNoIHtzZXQgZ3RmIFtvcGVuIFtjb25jYXQgfCBnaXQgbHMtdHJlZSAtciAkaWRdIHJdfV19IHsKCQlyZXR1cm4KCSAgICB9CgkgICAgc2V0IHRyZWVwZW5kaW5nICRpZAoJICAgIHNldCB0cmVlZmlsZWxpc3QoJGlkKSB7fQoJICAgIHNldCB0cmVlaWRsaXN0KCRpZCkge30KCSAgICBmY29uZmlndXJlICRndGYgLWJsb2NraW5nIDAKCSAgICBmaWxlZXZlbnQgJGd0ZiByZWFkYWJsZSBbbGlzdCBnZXR0cmVlbGluZSAkZ3RmICRpZF0KCX0KICAgIH0gZWxzZSB7CglzZXRmaWxlbGlzdCAkaWQKICAgIH0KfQoKcHJvYyBnZXR0cmVlbGluZSB7Z3RmIGlkfSB7CiAgICBnbG9iYWwgdHJlZWZpbGVsaXN0IHRyZWVpZGxpc3QgdHJlZXBlbmRpbmcgY21pdG1vZGUgZGlmZmlkcwoKICAgIHdoaWxlIHtbZ2V0cyAkZ3RmIGxpbmVdID49IDB9IHsKCWlmIHtbbGluZGV4ICRsaW5lIDFdIG5lICJibG9iIn0gY29udGludWUKCXNldCBzaGExIFtsaW5kZXggJGxpbmUgMl0KCXNldCBmbmFtZSBbbGluZGV4ICRsaW5lIDNdCglsYXBwZW5kIHRyZWVmaWxlbGlzdCgkaWQpICRmbmFtZQoJbGFwcGVuZCB0cmVlaWRsaXN0KCRpZCkgJHNoYTEKICAgIH0KICAgIGlmIHshW2VvZiAkZ3RmXX0gcmV0dXJuCiAgICBjbG9zZSAkZ3RmCiAgICB1bnNldCB0cmVlcGVuZGluZwogICAgaWYgeyRjbWl0bW9kZSBuZSAidHJlZSJ9IHsKCWlmIHshW2luZm8gZXhpc3RzIGRpZmZtZXJnZWlkXX0gewoJICAgIGdldHRyZWVkaWZmcyAkZGlmZmlkcwoJfQogICAgfSBlbHNlaWYgeyRpZCBuZSAkZGlmZmlkc30gewoJZ2V0dHJlZSAkZGlmZmlkcwogICAgfSBlbHNlIHsKCXNldGZpbGVsaXN0ICRpZAogICAgfQp9Cgpwcm9jIHNob3dmaWxlIHtmfSB7CiAgICBnbG9iYWwgdHJlZWZpbGVsaXN0IHRyZWVpZGxpc3QgZGlmZmlkcwogICAgZ2xvYmFsIGN0ZXh0IGNvbW1lbnRlbmQKCiAgICBzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJHRyZWVmaWxlbGlzdCgkZGlmZmlkcykgJGZdCiAgICBpZiB7JGkgPCAwfSB7CglwdXRzICJvb3BzLCAkZiBub3QgaW4gbGlzdCBmb3IgaWQgJGRpZmZpZHMiCglyZXR1cm4KICAgIH0KICAgIHNldCBibG9iIFtsaW5kZXggJHRyZWVpZGxpc3QoJGRpZmZpZHMpICRpXQogICAgaWYge1tjYXRjaCB7c2V0IGJmIFtvcGVuIFtjb25jYXQgfCBnaXQgY2F0LWZpbGUgYmxvYiAkYmxvYl0gcl19IGVycl19IHsKCXB1dHMgIm9vcHMsIGVycm9yIHJlYWRpbmcgYmxvYiAkYmxvYjogJGVyciIKCXJldHVybgogICAgfQogICAgZmNvbmZpZ3VyZSAkYmYgLWJsb2NraW5nIDAKICAgIGZpbGVldmVudCAkYmYgcmVhZGFibGUgW2xpc3QgZ2V0YmxvYmxpbmUgJGJmICRkaWZmaWRzXQogICAgJGN0ZXh0IGNvbmZpZyAtc3RhdGUgbm9ybWFsCiAgICBjbGVhcl9jdGV4dCAkY29tbWVudGVuZAogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuIgogICAgJGN0ZXh0IGluc2VydCBlbmQgIiRmXG4iIGZpbGVzZXAKICAgICRjdGV4dCBjb25maWcgLXN0YXRlIGRpc2FibGVkCiAgICAkY3RleHQgeXZpZXcgJGNvbW1lbnRlbmQKfQoKcHJvYyBnZXRibG9ibGluZSB7YmYgaWR9IHsKICAgIGdsb2JhbCBkaWZmaWRzIGNtaXRtb2RlIGN0ZXh0CgogICAgaWYgeyRpZCBuZSAkZGlmZmlkcyB8fCAkY21pdG1vZGUgbmUgInRyZWUifSB7CgljYXRjaCB7Y2xvc2UgJGJmfQoJcmV0dXJuCiAgICB9CiAgICAkY3RleHQgY29uZmlnIC1zdGF0ZSBub3JtYWwKICAgIHdoaWxlIHtbZ2V0cyAkYmYgbGluZV0gPj0gMH0gewoJJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iCiAgICB9CiAgICBpZiB7W2VvZiAkYmZdfSB7CgkjIGRlbGV0ZSBsYXN0IG5ld2xpbmUKCSRjdGV4dCBkZWxldGUgImVuZCAtIDJjIiAiZW5kIC0gMWMiCgljbG9zZSAkYmYKICAgIH0KICAgICRjdGV4dCBjb25maWcgLXN0YXRlIGRpc2FibGVkCn0KCnByb2MgbWVyZ2VkaWZmIHtpZCBsfSB7CiAgICBnbG9iYWwgZGlmZm1lcmdlaWQgZGlmZm9wdHMgbWRpZmZmZAogICAgZ2xvYmFsIGRpZmZpZHMKICAgIGdsb2JhbCBwYXJlbnRsaXN0CgogICAgc2V0IGRpZmZtZXJnZWlkICRpZAogICAgc2V0IGRpZmZpZHMgJGlkCiAgICAjIHRoaXMgZG9lc24ndCBzZWVtIHRvIGFjdHVhbGx5IGFmZmVjdCBhbnl0aGluZy4uLgogICAgc2V0IGVudihHSVRfRElGRl9PUFRTKSAkZGlmZm9wdHMKICAgIHNldCBjbWQgW2NvbmNhdCB8IGdpdCBkaWZmLXRyZWUgLS1uby1jb21taXQtaWQgLS1jYyAkaWRdCiAgICBpZiB7W2NhdGNoIHtzZXQgbWRmIFtvcGVuICRjbWQgcl19IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciBnZXR0aW5nIG1lcmdlIGRpZmZzOiAkZXJyIgoJcmV0dXJuCiAgICB9CiAgICBmY29uZmlndXJlICRtZGYgLWJsb2NraW5nIDAKICAgIHNldCBtZGlmZmZkKCRpZCkgJG1kZgogICAgc2V0IG5wIFtsbGVuZ3RoIFtsaW5kZXggJHBhcmVudGxpc3QgJGxdXQogICAgZmlsZWV2ZW50ICRtZGYgcmVhZGFibGUgW2xpc3QgZ2V0bWVyZ2VkaWZmbGluZSAkbWRmICRpZCAkbnBdCiAgICBzZXQgbmV4dHVwZGF0ZSBbZXhwciB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSArIDEwMH1dCn0KCnByb2MgZ2V0bWVyZ2VkaWZmbGluZSB7bWRmIGlkIG5wfSB7CiAgICBnbG9iYWwgZGlmZm1lcmdlaWQgY3RleHQgY2ZsaXN0IG5leHR1cGRhdGUgbWVyZ2VtYXgKICAgIGdsb2JhbCBkaWZmZmlsZXN0YXJ0IG1kaWZmZmQKCiAgICBzZXQgbiBbZ2V0cyAkbWRmIGxpbmVdCiAgICBpZiB7JG4gPCAwfSB7CglpZiB7W2VvZiAkbWRmXX0gewoJICAgIGNsb3NlICRtZGYKCX0KCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgZGlmZm1lcmdlaWRdIHx8ICRpZCAhPSAkZGlmZm1lcmdlaWQKCXx8ICRtZGYgIT0gJG1kaWZmZmQoJGlkKX0gewoJcmV0dXJuCiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBpZiB7W3JlZ2V4cCB7XmRpZmYgLS1jYyAoLiopfSAkbGluZSBtYXRjaCBmbmFtZV19IHsKCSMgc3RhcnQgb2YgYSBuZXcgZmlsZQoJJGN0ZXh0IGluc2VydCBlbmQgIlxuIgoJc2V0IGhlcmUgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJbGFwcGVuZCBkaWZmZmlsZXN0YXJ0ICRoZXJlCglhZGRfZmxpc3QgW2xpc3QgJGZuYW1lXQoJc2V0IGwgW2V4cHIgeyg3OCAtIFtzdHJpbmcgbGVuZ3RoICRmbmFtZV0pIC8gMn1dCglzZXQgcGFkIFtzdHJpbmcgcmFuZ2UgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIDEgJGxdCgkkY3RleHQgaW5zZXJ0IGVuZCAiJHBhZCAkZm5hbWUgJHBhZFxuIiBmaWxlc2VwCiAgICB9IGVsc2VpZiB7W3JlZ2V4cCB7XkBAfSAkbGluZV19IHsKCSRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBodW5rc2VwCiAgICB9IGVsc2VpZiB7W3JlZ2V4cCB7XlswLTlhLWZdezQwfSR9ICRsaW5lXSB8fCBbcmVnZXhwIHteaW5kZXh9ICRsaW5lXX0gewoJIyBkbyBub3RoaW5nCiAgICB9IGVsc2UgewoJIyBwYXJzZSB0aGUgcHJlZml4IC0gb25lICcgJywgJy0nIG9yICcrJyBmb3IgZWFjaCBwYXJlbnQKCXNldCBzcGFjZXMge30KCXNldCBtaW51c2VzIHt9CglzZXQgcGx1c2VzIHt9CglzZXQgaXNiYWQgMAoJZm9yIHtzZXQgaiAwfSB7JGogPCAkbnB9IHtpbmNyIGp9IHsKCSAgICBzZXQgYyBbc3RyaW5nIHJhbmdlICRsaW5lICRqICRqXQoJICAgIGlmIHskYyA9PSAiICJ9IHsKCQlsYXBwZW5kIHNwYWNlcyAkagoJICAgIH0gZWxzZWlmIHskYyA9PSAiLSJ9IHsKCQlsYXBwZW5kIG1pbnVzZXMgJGoKCSAgICB9IGVsc2VpZiB7JGMgPT0gIisifSB7CgkJbGFwcGVuZCBwbHVzZXMgJGoKCSAgICB9IGVsc2UgewoJCXNldCBpc2JhZCAxCgkJYnJlYWsKCSAgICB9Cgl9CglzZXQgdGFncyB7fQoJc2V0IG51bSB7fQoJaWYgeyEkaXNiYWQgJiYgJG1pbnVzZXMgbmUge30gJiYgJHBsdXNlcyBlcSB7fX0gewoJICAgICMgbGluZSBkb2Vzbid0IGFwcGVhciBpbiByZXN1bHQsIHBhcmVudHMgaW4gJG1pbnVzZXMgaGF2ZSB0aGUgbGluZQoJICAgIHNldCBudW0gW2xpbmRleCAkbWludXNlcyAwXQoJfSBlbHNlaWYgeyEkaXNiYWQgJiYgJHBsdXNlcyBuZSB7fSAmJiAkbWludXNlcyBlcSB7fX0gewoJICAgICMgbGluZSBhcHBlYXJzIGluIHJlc3VsdCwgcGFyZW50cyBpbiAkcGx1c2VzIGRvbid0IGhhdmUgdGhlIGxpbmUKCSAgICBsYXBwZW5kIHRhZ3MgbXJlc3VsdAoJICAgIHNldCBudW0gW2xpbmRleCAkc3BhY2VzIDBdCgl9CglpZiB7JG51bSBuZSB7fX0gewoJICAgIGlmIHskbnVtID49ICRtZXJnZW1heH0gewoJCXNldCBudW0gIm1heCIKCSAgICB9CgkgICAgbGFwcGVuZCB0YWdzIG0kbnVtCgl9CgkkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgJHRhZ3MKICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJG5leHR1cGRhdGV9IHsKCWluY3IgbmV4dHVwZGF0ZSAxMDAKCWZpbGVldmVudCAkbWRmIHJlYWRhYmxlIHt9Cgl1cGRhdGUKCWZpbGVldmVudCAkbWRmIHJlYWRhYmxlIFtsaXN0IGdldG1lcmdlZGlmZmxpbmUgJG1kZiAkaWQgJG5wXQogICAgfQp9Cgpwcm9jIHN0YXJ0ZGlmZiB7aWRzfSB7CiAgICBnbG9iYWwgdHJlZWRpZmZzIGRpZmZpZHMgdHJlZXBlbmRpbmcgZGlmZm1lcmdlaWQKCiAgICBzZXQgZGlmZmlkcyAkaWRzCiAgICBjYXRjaCB7dW5zZXQgZGlmZm1lcmdlaWR9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyB0cmVlZGlmZnMoJGlkcyldfSB7CglpZiB7IVtpbmZvIGV4aXN0cyB0cmVlcGVuZGluZ119IHsKCSAgICBnZXR0cmVlZGlmZnMgJGlkcwoJfQogICAgfSBlbHNlIHsKCWFkZHRvY2ZsaXN0ICRpZHMKICAgIH0KfQoKcHJvYyBhZGR0b2NmbGlzdCB7aWRzfSB7CiAgICBnbG9iYWwgdHJlZWRpZmZzIGNmbGlzdAogICAgYWRkX2ZsaXN0ICR0cmVlZGlmZnMoJGlkcykKICAgIGdldGJsb2JkaWZmcyAkaWRzCn0KCnByb2MgZ2V0dHJlZWRpZmZzIHtpZHN9IHsKICAgIGdsb2JhbCB0cmVlZGlmZiB0cmVlcGVuZGluZwogICAgc2V0IHRyZWVwZW5kaW5nICRpZHMKICAgIHNldCB0cmVlZGlmZiB7fQogICAgaWYge1tjYXRjaCBcCgkge3NldCBnZHRmIFtvcGVuIFtjb25jYXQgfCBnaXQgZGlmZi10cmVlIC0tbm8tY29tbWl0LWlkIC1yICRpZHNdIHJdfSBcCgldfSByZXR1cm4KICAgIGZjb25maWd1cmUgJGdkdGYgLWJsb2NraW5nIDAKICAgIGZpbGVldmVudCAkZ2R0ZiByZWFkYWJsZSBbbGlzdCBnZXR0cmVlZGlmZmxpbmUgJGdkdGYgJGlkc10KfQoKcHJvYyBnZXR0cmVlZGlmZmxpbmUge2dkdGYgaWRzfSB7CiAgICBnbG9iYWwgdHJlZWRpZmYgdHJlZWRpZmZzIHRyZWVwZW5kaW5nIGRpZmZpZHMgZGlmZm1lcmdlaWQKICAgIGdsb2JhbCBjbWl0bW9kZQoKICAgIHNldCBuIFtnZXRzICRnZHRmIGxpbmVdCiAgICBpZiB7JG4gPCAwfSB7CglpZiB7IVtlb2YgJGdkdGZdfSByZXR1cm4KCWNsb3NlICRnZHRmCglzZXQgdHJlZWRpZmZzKCRpZHMpICR0cmVlZGlmZgoJdW5zZXQgdHJlZXBlbmRpbmcKCWlmIHskY21pdG1vZGUgZXEgInRyZWUifSB7CgkgICAgZ2V0dHJlZSAkZGlmZmlkcwoJfSBlbHNlaWYgeyRpZHMgIT0gJGRpZmZpZHN9IHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBkaWZmbWVyZ2VpZF19IHsKCQlnZXR0cmVlZGlmZnMgJGRpZmZpZHMKCSAgICB9Cgl9IGVsc2UgewoJICAgIGFkZHRvY2ZsaXN0ICRpZHMKCX0KCXJldHVybgogICAgfQogICAgc2V0IGZpbGUgW2xpbmRleCAkbGluZSA1XQogICAgbGFwcGVuZCB0cmVlZGlmZiAkZmlsZQp9Cgpwcm9jIGdldGJsb2JkaWZmcyB7aWRzfSB7CiAgICBnbG9iYWwgZGlmZm9wdHMgYmxvYmRpZmZmZCBkaWZmaWRzIGVudiBjdXJkaWZmdGFnIGN1cnRhZ3N0YXJ0CiAgICBnbG9iYWwgbmV4dHVwZGF0ZSBkaWZmaW5oZHIgdHJlZWRpZmZzCgogICAgc2V0IGVudihHSVRfRElGRl9PUFRTKSAkZGlmZm9wdHMKICAgIHNldCBjbWQgW2NvbmNhdCB8IGdpdCBkaWZmLXRyZWUgLS1uby1jb21taXQtaWQgLXIgLXAgLUMgJGlkc10KICAgIGlmIHtbY2F0Y2gge3NldCBiZGYgW29wZW4gJGNtZCByXX0gZXJyXX0gewoJcHV0cyAiZXJyb3IgZ2V0dGluZyBkaWZmczogJGVyciIKCXJldHVybgogICAgfQogICAgc2V0IGRpZmZpbmhkciAwCiAgICBmY29uZmlndXJlICRiZGYgLWJsb2NraW5nIDAKICAgIHNldCBibG9iZGlmZmZkKCRpZHMpICRiZGYKICAgIHNldCBjdXJkaWZmdGFnIENvbW1lbnRzCiAgICBzZXQgY3VydGFnc3RhcnQgMC4wCiAgICBmaWxlZXZlbnQgJGJkZiByZWFkYWJsZSBbbGlzdCBnZXRibG9iZGlmZmxpbmUgJGJkZiAkZGlmZmlkc10KICAgIHNldCBuZXh0dXBkYXRlIFtleHByIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdICsgMTAwfV0KfQoKcHJvYyBzZXRpbmxpc3Qge3ZhciBpIHZhbH0gewogICAgZ2xvYmFsICR2YXIKCiAgICB3aGlsZSB7W2xsZW5ndGggW3NldCAkdmFyXV0gPCAkaX0gewoJbGFwcGVuZCAkdmFyIHt9CiAgICB9CiAgICBpZiB7W2xsZW5ndGggW3NldCAkdmFyXV0gPT0gJGl9IHsKCWxhcHBlbmQgJHZhciAkdmFsCiAgICB9IGVsc2UgewoJbHNldCAkdmFyICRpICR2YWwKICAgIH0KfQoKcHJvYyBnZXRibG9iZGlmZmxpbmUge2JkZiBpZHN9IHsKICAgIGdsb2JhbCBkaWZmaWRzIGJsb2JkaWZmZmQgY3RleHQgY3VyZGlmZnRhZyBjdXJ0YWdzdGFydAogICAgZ2xvYmFsIGRpZmZuZXh0aGVhZCBkaWZmbmV4dG5vdGUgZGlmZmZpbGVzdGFydAogICAgZ2xvYmFsIG5leHR1cGRhdGUgZGlmZmluaGRyIHRyZWVkaWZmcwoKICAgIHNldCBuIFtnZXRzICRiZGYgbGluZV0KICAgIGlmIHskbiA8IDB9IHsKCWlmIHtbZW9mICRiZGZdfSB7CgkgICAgY2xvc2UgJGJkZgoJICAgIGlmIHskaWRzID09ICRkaWZmaWRzICYmICRiZGYgPT0gJGJsb2JkaWZmZmQoJGlkcyl9IHsKCQkkY3RleHQgdGFnIGFkZCAkY3VyZGlmZnRhZyAkY3VydGFnc3RhcnQgZW5kCgkgICAgfQoJfQoJcmV0dXJuCiAgICB9CiAgICBpZiB7JGlkcyAhPSAkZGlmZmlkcyB8fCAkYmRmICE9ICRibG9iZGlmZmZkKCRpZHMpfSB7CglyZXR1cm4KICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIGlmIHtbcmVnZXhwIHteZGlmZiAtLWdpdCBhLyguKikgYi8oLiopfSAkbGluZSBtYXRjaCBmbmFtZSBuZXduYW1lXX0gewoJIyBzdGFydCBvZiBhIG5ldyBmaWxlCgkkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCgkkY3RleHQgdGFnIGFkZCAkY3VyZGlmZnRhZyAkY3VydGFnc3RhcnQgZW5kCglzZXQgaGVyZSBbJGN0ZXh0IGluZGV4ICJlbmQgLSAxYyJdCglzZXQgY3VydGFnc3RhcnQgJGhlcmUKCXNldCBoZWFkZXIgJG5ld25hbWUKCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkdHJlZWRpZmZzKCRpZHMpICRmbmFtZV0KCWlmIHskaSA+PSAwfSB7CgkgICAgc2V0aW5saXN0IGRpZmZmaWxlc3RhcnQgJGkgJGhlcmUKCX0KCWlmIHskbmV3bmFtZSBuZSAkZm5hbWV9IHsKCSAgICBzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJHRyZWVkaWZmcygkaWRzKSAkbmV3bmFtZV0KCSAgICBpZiB7JGkgPj0gMH0gewoJCXNldGlubGlzdCBkaWZmZmlsZXN0YXJ0ICRpICRoZXJlCgkgICAgfQoJfQoJc2V0IGN1cmRpZmZ0YWcgImY6JGZuYW1lIgoJJGN0ZXh0IHRhZyBkZWxldGUgJGN1cmRpZmZ0YWcKCXNldCBsIFtleHByIHsoNzggLSBbc3RyaW5nIGxlbmd0aCAkaGVhZGVyXSkgLyAyfV0KCXNldCBwYWQgW3N0cmluZyByYW5nZSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgMSAkbF0KCSRjdGV4dCBpbnNlcnQgZW5kICIkcGFkICRoZWFkZXIgJHBhZFxuIiBmaWxlc2VwCglzZXQgZGlmZmluaGRyIDEKICAgIH0gZWxzZWlmIHskZGlmZmluaGRyICYmIFtzdHJpbmcgY29tcGFyZSAtbGVuZ3RoIDMgJGxpbmUgIi0tLSJdID09IDB9IHsKCSMgZG8gbm90aGluZwogICAgfSBlbHNlaWYgeyRkaWZmaW5oZHIgJiYgW3N0cmluZyBjb21wYXJlIC1sZW5ndGggMyAkbGluZSAiKysrIl0gPT0gMH0gewoJc2V0IGRpZmZpbmhkciAwCiAgICB9IGVsc2VpZiB7W3JlZ2V4cCB7XkBAIC0oWzAtOV0rKSwoWzAtOV0rKSBcKyhbMC05XSspLChbMC05XSspIEBAKC4qKX0gXAoJCSAgICRsaW5lIG1hdGNoIGYxbCBmMWMgZjJsIGYyYyByZXN0XX0gewoJJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iIGh1bmtzZXAKCXNldCBkaWZmaW5oZHIgMAogICAgfSBlbHNlIHsKCXNldCB4IFtzdHJpbmcgcmFuZ2UgJGxpbmUgMCAwXQoJaWYgeyR4ID09ICItIiB8fCAkeCA9PSAiKyJ9IHsKCSAgICBzZXQgdGFnIFtleHByIHskeCA9PSAiKyJ9XQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBkJHRhZwoJfSBlbHNlaWYgeyR4ID09ICIgIn0gewoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIgoJfSBlbHNlaWYgeyRkaWZmaW5oZHIgfHwgJHggPT0gIlxcIn0gewoJICAgICMgZS5nLiAiXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlIgoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBmaWxlc2VwCgl9IGVsc2UgewoJICAgICMgU29tZXRoaW5nIGVsc2Ugd2UgZG9uJ3QgcmVjb2duaXplCgkgICAgaWYgeyRjdXJkaWZmdGFnICE9ICJDb21tZW50cyJ9IHsKCQkkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCgkJJGN0ZXh0IHRhZyBhZGQgJGN1cmRpZmZ0YWcgJGN1cnRhZ3N0YXJ0IGVuZAoJCXNldCBjdXJ0YWdzdGFydCBbJGN0ZXh0IGluZGV4ICJlbmQgLSAxYyJdCgkJc2V0IGN1cmRpZmZ0YWcgQ29tbWVudHMKCSAgICB9CgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iIGZpbGVzZXAKCX0KICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gPj0gJG5leHR1cGRhdGV9IHsKCWluY3IgbmV4dHVwZGF0ZSAxMDAKCWZpbGVldmVudCAkYmRmIHJlYWRhYmxlIHt9Cgl1cGRhdGUKCWZpbGVldmVudCAkYmRmIHJlYWRhYmxlICJnZXRibG9iZGlmZmxpbmUgJGJkZiB7JGlkc30iCiAgICB9Cn0KCnByb2MgcHJldmZpbGUge30gewogICAgZ2xvYmFsIGRpZmZmaWxlc3RhcnQgY3RleHQKICAgIHNldCBwcmV2IFtsaW5kZXggJGRpZmZmaWxlc3RhcnQgMF0KICAgIHNldCBoZXJlIFskY3RleHQgaW5kZXggQDAsMF0KICAgIGZvcmVhY2ggbG9jICRkaWZmZmlsZXN0YXJ0IHsKCWlmIHtbJGN0ZXh0IGNvbXBhcmUgJGxvYyA+PSAkaGVyZV19IHsKCSAgICAkY3RleHQgeXZpZXcgJHByZXYKCSAgICByZXR1cm4KCX0KCXNldCBwcmV2ICRsb2MKICAgIH0KICAgICRjdGV4dCB5dmlldyAkcHJldgp9Cgpwcm9jIG5leHRmaWxlIHt9IHsKICAgIGdsb2JhbCBkaWZmZmlsZXN0YXJ0IGN0ZXh0CiAgICBzZXQgaGVyZSBbJGN0ZXh0IGluZGV4IEAwLDBdCiAgICBmb3JlYWNoIGxvYyAkZGlmZmZpbGVzdGFydCB7CglpZiB7WyRjdGV4dCBjb21wYXJlICRsb2MgPiAkaGVyZV19IHsKCSAgICAkY3RleHQgeXZpZXcgJGxvYwoJICAgIHJldHVybgoJfQogICAgfQp9Cgpwcm9jIGNsZWFyX2N0ZXh0IHt7Zmlyc3QgMS4wfX0gewogICAgZ2xvYmFsIGN0ZXh0IHNtYXJrdG9wIHNtYXJrYm90CgogICAgc2V0IGwgW2xpbmRleCBbc3BsaXQgJGZpcnN0IC5dIDBdCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzbWFya3RvcF0gfHwgWyRjdGV4dCBjb21wYXJlICRmaXJzdCA8ICRzbWFya3RvcC4wXX0gewoJc2V0IHNtYXJrdG9wICRsCiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzbWFya2JvdF0gfHwgWyRjdGV4dCBjb21wYXJlICRmaXJzdCA8ICRzbWFya2JvdC4wXX0gewoJc2V0IHNtYXJrYm90ICRsCiAgICB9CiAgICAkY3RleHQgZGVsZXRlICRmaXJzdCBlbmQKfQoKcHJvYyBpbmNyc2VhcmNoIHtuYW1lIGl4IG9wfSB7CiAgICBnbG9iYWwgY3RleHQgc2VhcmNoc3RyaW5nIHNlYXJjaGRpcm4KCiAgICAkY3RleHQgdGFnIHJlbW92ZSBmb3VuZCAxLjAgZW5kCiAgICBpZiB7W2NhdGNoIHskY3RleHQgaW5kZXggYW5jaG9yfV19IHsKCSMgbm8gYW5jaG9yIHNldCwgdXNlIHN0YXJ0IG9mIHNlbGVjdGlvbiwgb3Igb2YgdmlzaWJsZSBhcmVhCglzZXQgc2VsIFskY3RleHQgdGFnIHJhbmdlcyBzZWxdCglpZiB7JHNlbCBuZSB7fX0gewoJICAgICRjdGV4dCBtYXJrIHNldCBhbmNob3IgW2xpbmRleCAkc2VsIDBdCgl9IGVsc2VpZiB7JHNlYXJjaGRpcm4gZXEgIi1mb3J3YXJkcyJ9IHsKCSAgICAkY3RleHQgbWFyayBzZXQgYW5jaG9yIEAwLDAKCX0gZWxzZSB7CgkgICAgJGN0ZXh0IG1hcmsgc2V0IGFuY2hvciBAMCxbd2luZm8gaGVpZ2h0ICRjdGV4dF0KCX0KICAgIH0KICAgIGlmIHskc2VhcmNoc3RyaW5nIG5lIHt9fSB7CglzZXQgaGVyZSBbJGN0ZXh0IHNlYXJjaCAkc2VhcmNoZGlybiAtLSAkc2VhcmNoc3RyaW5nIGFuY2hvcl0KCWlmIHskaGVyZSBuZSB7fX0gewoJICAgICRjdGV4dCBzZWUgJGhlcmUKCX0KCXNlYXJjaG1hcmt2aXNpYmxlIDEKICAgIH0KfQoKcHJvYyBkb3NlYXJjaCB7fSB7CiAgICBnbG9iYWwgc3N0cmluZyBjdGV4dCBzZWFyY2hzdHJpbmcgc2VhcmNoZGlybgoKICAgIGZvY3VzICRzc3RyaW5nCiAgICAkc3N0cmluZyBpY3Vyc29yIGVuZAogICAgc2V0IHNlYXJjaGRpcm4gLWZvcndhcmRzCiAgICBpZiB7JHNlYXJjaHN0cmluZyBuZSB7fX0gewoJc2V0IHNlbCBbJGN0ZXh0IHRhZyByYW5nZXMgc2VsXQoJaWYgeyRzZWwgbmUge319IHsKCSAgICBzZXQgc3RhcnQgIltsaW5kZXggJHNlbCAwXSArIDFjIgoJfSBlbHNlaWYge1tjYXRjaCB7c2V0IHN0YXJ0IFskY3RleHQgaW5kZXggYW5jaG9yXX1dfSB7CgkgICAgc2V0IHN0YXJ0ICJAMCwwIgoJfQoJc2V0IG1hdGNoIFskY3RleHQgc2VhcmNoIC1jb3VudCBtbGVuIC0tICRzZWFyY2hzdHJpbmcgJHN0YXJ0XQoJJGN0ZXh0IHRhZyByZW1vdmUgc2VsIDEuMCBlbmQKCWlmIHskbWF0Y2ggZXEge319IHsKCSAgICBiZWxsCgkgICAgcmV0dXJuCgl9CgkkY3RleHQgc2VlICRtYXRjaAoJc2V0IG1lbmQgIiRtYXRjaCArICRtbGVuIGMiCgkkY3RleHQgdGFnIGFkZCBzZWwgJG1hdGNoICRtZW5kCgkkY3RleHQgbWFyayB1bnNldCBhbmNob3IKICAgIH0KfQoKcHJvYyBkb3NlYXJjaGJhY2sge30gewogICAgZ2xvYmFsIHNzdHJpbmcgY3RleHQgc2VhcmNoc3RyaW5nIHNlYXJjaGRpcm4KCiAgICBmb2N1cyAkc3N0cmluZwogICAgJHNzdHJpbmcgaWN1cnNvciBlbmQKICAgIHNldCBzZWFyY2hkaXJuIC1iYWNrd2FyZHMKICAgIGlmIHskc2VhcmNoc3RyaW5nIG5lIHt9fSB7CglzZXQgc2VsIFskY3RleHQgdGFnIHJhbmdlcyBzZWxdCglpZiB7JHNlbCBuZSB7fX0gewoJICAgIHNldCBzdGFydCBbbGluZGV4ICRzZWwgMF0KCX0gZWxzZWlmIHtbY2F0Y2gge3NldCBzdGFydCBbJGN0ZXh0IGluZGV4IGFuY2hvcl19XX0gewoJICAgIHNldCBzdGFydCBAMCxbd2luZm8gaGVpZ2h0ICRjdGV4dF0KCX0KCXNldCBtYXRjaCBbJGN0ZXh0IHNlYXJjaCAtYmFja3dhcmRzIC1jb3VudCBtbCAtLSAkc2VhcmNoc3RyaW5nICRzdGFydF0KCSRjdGV4dCB0YWcgcmVtb3ZlIHNlbCAxLjAgZW5kCglpZiB7JG1hdGNoIGVxIHt9fSB7CgkgICAgYmVsbAoJICAgIHJldHVybgoJfQoJJGN0ZXh0IHNlZSAkbWF0Y2gKCXNldCBtZW5kICIkbWF0Y2ggKyAkbWwgYyIKCSRjdGV4dCB0YWcgYWRkIHNlbCAkbWF0Y2ggJG1lbmQKCSRjdGV4dCBtYXJrIHVuc2V0IGFuY2hvcgogICAgfQp9Cgpwcm9jIHNlYXJjaG1hcmsge2ZpcnN0IGxhc3R9IHsKICAgIGdsb2JhbCBjdGV4dCBzZWFyY2hzdHJpbmcKCiAgICBzZXQgbWVuZCAkZmlyc3QuMAogICAgd2hpbGUgezF9IHsKCXNldCBtYXRjaCBbJGN0ZXh0IHNlYXJjaCAtY291bnQgbWxlbiAtLSAkc2VhcmNoc3RyaW5nICRtZW5kICRsYXN0LmVuZF0KCWlmIHskbWF0Y2ggZXEge319IGJyZWFrCglzZXQgbWVuZCAiJG1hdGNoICsgJG1sZW4gYyIKCSRjdGV4dCB0YWcgYWRkIGZvdW5kICRtYXRjaCAkbWVuZAogICAgfQp9Cgpwcm9jIHNlYXJjaG1hcmt2aXNpYmxlIHtkb2FsbH0gewogICAgZ2xvYmFsIGN0ZXh0IHNtYXJrdG9wIHNtYXJrYm90CgogICAgc2V0IHRvcGxpbmUgW2xpbmRleCBbc3BsaXQgWyRjdGV4dCBpbmRleCBAMCwwXSAuXSAwXQogICAgc2V0IGJvdGxpbmUgW2xpbmRleCBbc3BsaXQgWyRjdGV4dCBpbmRleCBAMCxbd2luZm8gaGVpZ2h0ICRjdGV4dF1dIC5dIDBdCiAgICBpZiB7JGRvYWxsIHx8ICRib3RsaW5lIDwgJHNtYXJrdG9wIHx8ICR0b3BsaW5lID4gJHNtYXJrYm90fSB7CgkjIG5vIG92ZXJsYXAgd2l0aCBwcmV2aW91cwoJc2VhcmNobWFyayAkdG9wbGluZSAkYm90bGluZQoJc2V0IHNtYXJrdG9wICR0b3BsaW5lCglzZXQgc21hcmtib3QgJGJvdGxpbmUKICAgIH0gZWxzZSB7CglpZiB7JHRvcGxpbmUgPCAkc21hcmt0b3B9IHsKCSAgICBzZWFyY2htYXJrICR0b3BsaW5lIFtleHByIHskc21hcmt0b3AtMX1dCgkgICAgc2V0IHNtYXJrdG9wICR0b3BsaW5lCgl9CglpZiB7JGJvdGxpbmUgPiAkc21hcmtib3R9IHsKCSAgICBzZWFyY2htYXJrIFtleHByIHskc21hcmtib3QrMX1dICRib3RsaW5lCgkgICAgc2V0IHNtYXJrYm90ICRib3RsaW5lCgl9CiAgICB9Cn0KCnByb2Mgc2Nyb2xsdGV4dCB7ZjAgZjF9IHsKICAgIGdsb2JhbCBzZWFyY2hzdHJpbmcKCiAgICAuY3RvcC5jZGV0LmxlZnQuc2Igc2V0ICRmMCAkZjEKICAgIGlmIHskc2VhcmNoc3RyaW5nIG5lIHt9fSB7CglzZWFyY2htYXJrdmlzaWJsZSAwCiAgICB9Cn0KCnByb2Mgc2V0Y29vcmRzIHt9IHsKICAgIGdsb2JhbCBsaW5lc3BjIGNoYXJzcGMgY2FudngwIGNhbnZ5MCBtYWluZm9udAogICAgZ2xvYmFsIHhzcGMxIHhzcGMyIGx0aGlja25lc3MKCiAgICBzZXQgbGluZXNwYyBbZm9udCBtZXRyaWNzICRtYWluZm9udCAtbGluZXNwYWNlXQogICAgc2V0IGNoYXJzcGMgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgIm0iXQogICAgc2V0IGNhbnZ5MCBbZXhwciB7aW50KDMgKyAwLjUgKiAkbGluZXNwYyl9XQogICAgc2V0IGNhbnZ4MCBbZXhwciB7aW50KDMgKyAwLjUgKiAkbGluZXNwYyl9XQogICAgc2V0IGx0aGlja25lc3MgW2V4cHIge2ludCgkbGluZXNwYyAvIDkpICsgMX1dCiAgICBzZXQgeHNwYzEoMCkgJGxpbmVzcGMKICAgIHNldCB4c3BjMiAkbGluZXNwYwp9Cgpwcm9jIHJlZGlzcGxheSB7fSB7CiAgICBnbG9iYWwgY2FudgogICAgZ2xvYmFsIHNlbGVjdGVkbGluZQoKICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIGlmIHskeW1heCBlcSB7fSB8fCAkeW1heCA9PSAwfSByZXR1cm4KICAgIHNldCBzcGFuIFskY2FudiB5dmlld10KICAgIGNsZWFyX2Rpc3BsYXkKICAgIHNldGNhbnZzY3JvbGwKICAgIGFsbGNhbnZzIHl2aWV3IG1vdmV0byBbbGluZGV4ICRzcGFuIDBdCiAgICBkcmF3dmlzaWJsZQogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CglzZWxlY3RsaW5lICRzZWxlY3RlZGxpbmUgMAoJYWxsY2FudnMgeXZpZXcgbW92ZXRvIFtsaW5kZXggJHNwYW4gMF0KICAgIH0KfQoKcHJvYyBpbmNyZm9udCB7aW5jfSB7CiAgICBnbG9iYWwgbWFpbmZvbnQgdGV4dGZvbnQgY3RleHQgY2FudiBwaGFzZQogICAgZ2xvYmFsIHN0b3BwZWQgZW50cmllcwogICAgdW5tYXJrbWF0Y2hlcwogICAgc2V0IG1haW5mb250IFtscmVwbGFjZSAkbWFpbmZvbnQgMSAxIFtleHByIHtbbGluZGV4ICRtYWluZm9udCAxXSArICRpbmN9XV0KICAgIHNldCB0ZXh0Zm9udCBbbHJlcGxhY2UgJHRleHRmb250IDEgMSBbZXhwciB7W2xpbmRleCAkdGV4dGZvbnQgMV0gKyAkaW5jfV1dCiAgICBzZXRjb29yZHMKICAgICRjdGV4dCBjb25mIC1mb250ICR0ZXh0Zm9udAogICAgJGN0ZXh0IHRhZyBjb25mIGZpbGVzZXAgLWZvbnQgW2NvbmNhdCAkdGV4dGZvbnQgYm9sZF0KICAgIGZvcmVhY2ggZSAkZW50cmllcyB7CgkkZSBjb25mIC1mb250ICRtYWluZm9udAogICAgfQogICAgaWYgeyRwaGFzZSBlcSAiZ2V0Y29tbWl0cyJ9IHsKCSRjYW52IGl0ZW1jb25mIHRleHRpdGVtcyAtZm9udCAkbWFpbmZvbnQKICAgIH0KICAgIHJlZGlzcGxheQp9Cgpwcm9jIGNsZWFyc2hhMSB7fSB7CiAgICBnbG9iYWwgc2hhMWVudHJ5IHNoYTFzdHJpbmcKICAgIGlmIHtbc3RyaW5nIGxlbmd0aCAkc2hhMXN0cmluZ10gPT0gNDB9IHsKCSRzaGExZW50cnkgZGVsZXRlIDAgZW5kCiAgICB9Cn0KCnByb2Mgc2hhMWNoYW5nZSB7bjEgbjIgb3B9IHsKICAgIGdsb2JhbCBzaGExc3RyaW5nIGN1cnJlbnRpZCBzaGExYnV0CiAgICBpZiB7JHNoYTFzdHJpbmcgPT0ge30KCXx8IChbaW5mbyBleGlzdHMgY3VycmVudGlkXSAmJiAkc2hhMXN0cmluZyA9PSAkY3VycmVudGlkKX0gewoJc2V0IHN0YXRlIGRpc2FibGVkCiAgICB9IGVsc2UgewoJc2V0IHN0YXRlIG5vcm1hbAogICAgfQogICAgaWYge1skc2hhMWJ1dCBjZ2V0IC1zdGF0ZV0gPT0gJHN0YXRlfSByZXR1cm4KICAgIGlmIHskc3RhdGUgPT0gIm5vcm1hbCJ9IHsKCSRzaGExYnV0IGNvbmYgLXN0YXRlIG5vcm1hbCAtcmVsaWVmIHJhaXNlZCAtdGV4dCAiR290bzogIgogICAgfSBlbHNlIHsKCSRzaGExYnV0IGNvbmYgLXN0YXRlIGRpc2FibGVkIC1yZWxpZWYgZmxhdCAtdGV4dCAiU0hBMSBJRDogIgogICAgfQp9Cgpwcm9jIGdvdG9jb21taXQge30gewogICAgZ2xvYmFsIHNoYTFzdHJpbmcgY3VycmVudGlkIGNvbW1pdHJvdyB0YWdpZHMgaGVhZGlkcwogICAgZ2xvYmFsIGRpc3BsYXlvcmRlciBudW1jb21taXRzIGN1cnZpZXcKCiAgICBpZiB7JHNoYTFzdHJpbmcgPT0ge30KCXx8IChbaW5mbyBleGlzdHMgY3VycmVudGlkXSAmJiAkc2hhMXN0cmluZyA9PSAkY3VycmVudGlkKX0gcmV0dXJuCiAgICBpZiB7W2luZm8gZXhpc3RzIHRhZ2lkcygkc2hhMXN0cmluZyldfSB7CglzZXQgaWQgJHRhZ2lkcygkc2hhMXN0cmluZykKICAgIH0gZWxzZWlmIHtbaW5mbyBleGlzdHMgaGVhZGlkcygkc2hhMXN0cmluZyldfSB7CglzZXQgaWQgJGhlYWRpZHMoJHNoYTFzdHJpbmcpCiAgICB9IGVsc2UgewoJc2V0IGlkIFtzdHJpbmcgdG9sb3dlciAkc2hhMXN0cmluZ10KCWlmIHtbcmVnZXhwIHteWzAtOWEtZl17NCwzOX0kfSAkaWRdfSB7CgkgICAgc2V0IG1hdGNoZXMge30KCSAgICBmb3JlYWNoIGkgJGRpc3BsYXlvcmRlciB7CgkJaWYge1tzdHJpbmcgbWF0Y2ggJGlkKiAkaV19IHsKCQkgICAgbGFwcGVuZCBtYXRjaGVzICRpCgkJfQoJICAgIH0KCSAgICBpZiB7JG1hdGNoZXMgbmUge319IHsKCQlpZiB7W2xsZW5ndGggJG1hdGNoZXNdID4gMX0gewoJCSAgICBlcnJvcl9wb3B1cCAiU2hvcnQgU0hBMSBpZCAkaWQgaXMgYW1iaWd1b3VzIgoJCSAgICByZXR1cm4KCQl9CgkJc2V0IGlkIFtsaW5kZXggJG1hdGNoZXMgMF0KCSAgICB9Cgl9CiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXX0gewoJc2VsZWN0bGluZSAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkgMQoJcmV0dXJuCiAgICB9CiAgICBpZiB7W3JlZ2V4cCB7XlswLTlhLWZBLUZdezQsfSR9ICRzaGExc3RyaW5nXX0gewoJc2V0IHR5cGUgIlNIQTEgaWQiCiAgICB9IGVsc2UgewoJc2V0IHR5cGUgIlRhZy9IZWFkIgogICAgfQogICAgZXJyb3JfcG9wdXAgIiR0eXBlICRzaGExc3RyaW5nIGlzIG5vdCBrbm93biIKfQoKcHJvYyBsaW5lZW50ZXIge3ggeSBpZH0gewogICAgZ2xvYmFsIGhvdmVyeCBob3ZlcnkgaG92ZXJpZCBob3ZlcnRpbWVyCiAgICBnbG9iYWwgY29tbWl0aW5mbyBjYW52CgogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXSAmJiAhW2dldGNvbW1pdCAkaWRdfSByZXR1cm4KICAgIHNldCBob3ZlcnggJHgKICAgIHNldCBob3ZlcnkgJHkKICAgIHNldCBob3ZlcmlkICRpZAogICAgaWYge1tpbmZvIGV4aXN0cyBob3ZlcnRpbWVyXX0gewoJYWZ0ZXIgY2FuY2VsICRob3ZlcnRpbWVyCiAgICB9CiAgICBzZXQgaG92ZXJ0aW1lciBbYWZ0ZXIgNTAwIGxpbmVob3Zlcl0KICAgICRjYW52IGRlbGV0ZSBob3Zlcgp9Cgpwcm9jIGxpbmVtb3Rpb24ge3ggeSBpZH0gewogICAgZ2xvYmFsIGhvdmVyeCBob3ZlcnkgaG92ZXJpZCBob3ZlcnRpbWVyCgogICAgaWYge1tpbmZvIGV4aXN0cyBob3ZlcmlkXSAmJiAkaWQgPT0gJGhvdmVyaWR9IHsKCXNldCBob3ZlcnggJHgKCXNldCBob3ZlcnkgJHkKCWlmIHtbaW5mbyBleGlzdHMgaG92ZXJ0aW1lcl19IHsKCSAgICBhZnRlciBjYW5jZWwgJGhvdmVydGltZXIKCX0KCXNldCBob3ZlcnRpbWVyIFthZnRlciA1MDAgbGluZWhvdmVyXQogICAgfQp9Cgpwcm9jIGxpbmVsZWF2ZSB7aWR9IHsKICAgIGdsb2JhbCBob3ZlcmlkIGhvdmVydGltZXIgY2FudgoKICAgIGlmIHtbaW5mbyBleGlzdHMgaG92ZXJpZF0gJiYgJGlkID09ICRob3ZlcmlkfSB7CgkkY2FudiBkZWxldGUgaG92ZXIKCWlmIHtbaW5mbyBleGlzdHMgaG92ZXJ0aW1lcl19IHsKCSAgICBhZnRlciBjYW5jZWwgJGhvdmVydGltZXIKCSAgICB1bnNldCBob3ZlcnRpbWVyCgl9Cgl1bnNldCBob3ZlcmlkCiAgICB9Cn0KCnByb2MgbGluZWhvdmVyIHt9IHsKICAgIGdsb2JhbCBob3ZlcnggaG92ZXJ5IGhvdmVyaWQgaG92ZXJ0aW1lcgogICAgZ2xvYmFsIGNhbnYgbGluZXNwYyBsdGhpY2tuZXNzCiAgICBnbG9iYWwgY29tbWl0aW5mbyBtYWluZm9udAoKICAgIHNldCB0ZXh0IFtsaW5kZXggJGNvbW1pdGluZm8oJGhvdmVyaWQpIDBdCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggPT0ge319IHJldHVybgogICAgc2V0IHlmcmFjIFtsaW5kZXggWyRjYW52IHl2aWV3XSAwXQogICAgc2V0IHggW2V4cHIgeyRob3ZlcnggKyAyICogJGxpbmVzcGN9XQogICAgc2V0IHkgW2V4cHIgeyRob3ZlcnkgKyAkeWZyYWMgKiAkeW1heCAtICRsaW5lc3BjIC8gMn1dCiAgICBzZXQgeDAgW2V4cHIgeyR4IC0gMiAqICRsdGhpY2tuZXNzfV0KICAgIHNldCB5MCBbZXhwciB7JHkgLSAyICogJGx0aGlja25lc3N9XQogICAgc2V0IHgxIFtleHByIHskeCArIFtmb250IG1lYXN1cmUgJG1haW5mb250ICR0ZXh0XSArIDIgKiAkbHRoaWNrbmVzc31dCiAgICBzZXQgeTEgW2V4cHIgeyR5ICsgJGxpbmVzcGMgKyAyICogJGx0aGlja25lc3N9XQogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSByZWN0YW5nbGUgJHgwICR5MCAkeDEgJHkxIFwKCSAgICAgICAtZmlsbCBcI2ZmZmY4MCAtb3V0bGluZSBibGFjayAtd2lkdGggMSAtdGFncyBob3Zlcl0KICAgICRjYW52IHJhaXNlICR0CiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIHRleHQgJHggJHkgLWFuY2hvciBudyAtdGV4dCAkdGV4dCAtdGFncyBob3ZlciBcCgkgICAgICAgLWZvbnQgJG1haW5mb250XQogICAgJGNhbnYgcmFpc2UgJHQKfQoKcHJvYyBjbGlja2lzb25hcnJvdyB7aWQgeX0gewogICAgZ2xvYmFsIGx0aGlja25lc3MKCiAgICBzZXQgcmFuZ2VzIFtyb3dyYW5nZXMgJGlkXQogICAgc2V0IHRocmVzaCBbZXhwciB7MiAqICRsdGhpY2tuZXNzICsgNn1dCiAgICBzZXQgbiBbZXhwciB7W2xsZW5ndGggJHJhbmdlc10gLSAxfV0KICAgIGZvciB7c2V0IGkgMX0geyRpIDwgJG59IHtpbmNyIGl9IHsKCXNldCByb3cgW2xpbmRleCAkcmFuZ2VzICRpXQoJaWYge2FicyhbeWMgJHJvd10gLSAkeSkgPCAkdGhyZXNofSB7CgkgICAgcmV0dXJuICRpCgl9CiAgICB9CiAgICByZXR1cm4ge30KfQoKcHJvYyBhcnJvd2p1bXAge2lkIG4geX0gewogICAgZ2xvYmFsIGNhbnYKCiAgICAjIDEgPC0+IDIsIDMgPC0+IDQsIGV0Yy4uLgogICAgc2V0IG4gW2V4cHIgeygoJG4gLSAxKSBeIDEpICsgMX1dCiAgICBzZXQgcm93IFtsaW5kZXggW3Jvd3JhbmdlcyAkaWRdICRuXQogICAgc2V0IHl0IFt5YyAkcm93XQogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgaWYgeyR5bWF4IGVxIHt9IHx8ICR5bWF4IDw9IDB9IHJldHVybgogICAgc2V0IHZpZXcgWyRjYW52IHl2aWV3XQogICAgc2V0IHlzcGFuIFtleHByIHtbbGluZGV4ICR2aWV3IDFdIC0gW2xpbmRleCAkdmlldyAwXX1dCiAgICBzZXQgeWZyYWMgW2V4cHIgeyR5dCAvICR5bWF4IC0gJHlzcGFuIC8gMn1dCiAgICBpZiB7JHlmcmFjIDwgMH0gewoJc2V0IHlmcmFjIDAKICAgIH0KICAgIGFsbGNhbnZzIHl2aWV3IG1vdmV0byAkeWZyYWMKfQoKcHJvYyBsaW5lY2xpY2sge3ggeSBpZCBpc25ld30gewogICAgZ2xvYmFsIGN0ZXh0IGNvbW1pdGluZm8gY2hpbGRyZW4gY2FudiB0aGlja2VybGluZSBjdXJ2aWV3CgogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXSAmJiAhW2dldGNvbW1pdCAkaWRdfSByZXR1cm4KICAgIHVubWFya21hdGNoZXMKICAgIHVuc2VsZWN0bGluZQogICAgbm9ybWFsbGluZQogICAgJGNhbnYgZGVsZXRlIGhvdmVyCiAgICAjIGRyYXcgdGhpcyBsaW5lIHRoaWNrZXIgdGhhbiBub3JtYWwKICAgIHNldCB0aGlja2VybGluZSAkaWQKICAgIGRyYXdsaW5lcyAkaWQKICAgIGlmIHskaXNuZXd9IHsKCXNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KCWlmIHskeW1heCBlcSB7fX0gcmV0dXJuCglzZXQgeWZyYWMgW2xpbmRleCBbJGNhbnYgeXZpZXddIDBdCglzZXQgeSBbZXhwciB7JHkgKyAkeWZyYWMgKiAkeW1heH1dCiAgICB9CiAgICBzZXQgZGlybiBbY2xpY2tpc29uYXJyb3cgJGlkICR5XQogICAgaWYgeyRkaXJuIG5lIHt9fSB7CglhcnJvd2p1bXAgJGlkICRkaXJuICR5CglyZXR1cm4KICAgIH0KCiAgICBpZiB7JGlzbmV3fSB7CglhZGR0b2hpc3RvcnkgW2xpc3QgbGluZWNsaWNrICR4ICR5ICRpZCAwXQogICAgfQogICAgIyBmaWxsIHRoZSBkZXRhaWxzIHBhbmUgd2l0aCBpbmZvIGFib3V0IHRoaXMgbGluZQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgY2xlYXJfY3RleHQKICAgICRjdGV4dCB0YWcgY29uZiBsaW5rIC1mb3JlZ3JvdW5kIGJsdWUgLXVuZGVybGluZSAxCiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8RW50ZXI+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgaGFuZDIgfQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPExlYXZlPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yICRjdXJ0ZXh0Y3Vyc29yIH0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJQYXJlbnQ6XHQiCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAkaWQgW2xpc3QgbGluayBsaW5rMF0KICAgICRjdGV4dCB0YWcgYmluZCBsaW5rMCA8MT4gW2xpc3Qgc2VsYnlpZCAkaWRdCiAgICBzZXQgaW5mbyAkY29tbWl0aW5mbygkaWQpCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdFtsaW5kZXggJGluZm8gMF1cbiIKICAgICRjdGV4dCBpbnNlcnQgZW5kICJcdEF1dGhvcjpcdFtsaW5kZXggJGluZm8gMV1cbiIKICAgIHNldCBkYXRlIFtmb3JtYXRkYXRlIFtsaW5kZXggJGluZm8gMl1dCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXHREYXRlOlx0JGRhdGVcbiIKICAgIHNldCBraWRzICRjaGlsZHJlbigkY3VydmlldywkaWQpCiAgICBpZiB7JGtpZHMgbmUge319IHsKCSRjdGV4dCBpbnNlcnQgZW5kICJcbkNoaWxkcmVuOiIKCXNldCBpIDAKCWZvcmVhY2ggY2hpbGQgJGtpZHMgewoJICAgIGluY3IgaQoJICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGNoaWxkKV0gJiYgIVtnZXRjb21taXQgJGNoaWxkXX0gY29udGludWUKCSAgICBzZXQgaW5mbyAkY29tbWl0aW5mbygkY2hpbGQpCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHQiCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgJGNoaWxkIFtsaXN0IGxpbmsgbGluayRpXQoJICAgICRjdGV4dCB0YWcgYmluZCBsaW5rJGkgPDE+IFtsaXN0IHNlbGJ5aWQgJGNoaWxkXQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblx0W2xpbmRleCAkaW5mbyAwXSIKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdEF1dGhvcjpcdFtsaW5kZXggJGluZm8gMV0iCgkgICAgc2V0IGRhdGUgW2Zvcm1hdGRhdGUgW2xpbmRleCAkaW5mbyAyXV0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdERhdGU6XHQkZGF0ZVxuIgoJfQogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICBpbml0X2ZsaXN0IHt9Cn0KCnByb2Mgbm9ybWFsbGluZSB7fSB7CiAgICBnbG9iYWwgdGhpY2tlcmxpbmUKICAgIGlmIHtbaW5mbyBleGlzdHMgdGhpY2tlcmxpbmVdfSB7CglzZXQgaWQgJHRoaWNrZXJsaW5lCgl1bnNldCB0aGlja2VybGluZQoJZHJhd2xpbmVzICRpZAogICAgfQp9Cgpwcm9jIHNlbGJ5aWQge2lkfSB7CiAgICBnbG9iYWwgY29tbWl0cm93IGN1cnZpZXcKICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCldfSB7CglzZWxlY3RsaW5lICRjb21taXRyb3coJGN1cnZpZXcsJGlkKSAxCiAgICB9Cn0KCnByb2MgbXN0aW1lIHt9IHsKICAgIGdsb2JhbCBzdGFydG1zdGltZQogICAgaWYgeyFbaW5mbyBleGlzdHMgc3RhcnRtc3RpbWVdfSB7CglzZXQgc3RhcnRtc3RpbWUgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQogICAgfQogICAgcmV0dXJuIFtmb3JtYXQgIiUuM2YiIFtleHByIHsoW2Nsb2NrIGNsaWNrIC1taWxsaXNlY29uZHNdIC0gJHN0YXJ0bXN0aW1lKSAvIDEwMDAuMH1dXQp9Cgpwcm9jIHJvd21lbnUge3ggeSBpZH0gewogICAgZ2xvYmFsIHJvd2N0eG1lbnUgY29tbWl0cm93IHNlbGVjdGVkbGluZSByb3dtZW51aWQgY3VydmlldwoKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV0KCXx8ICRjb21taXRyb3coJGN1cnZpZXcsJGlkKSBlcSAkc2VsZWN0ZWRsaW5lfSB7CglzZXQgc3RhdGUgZGlzYWJsZWQKICAgIH0gZWxzZSB7CglzZXQgc3RhdGUgbm9ybWFsCiAgICB9CiAgICAkcm93Y3R4bWVudSBlbnRyeWNvbmZpZ3VyZSAwIC1zdGF0ZSAkc3RhdGUKICAgICRyb3djdHhtZW51IGVudHJ5Y29uZmlndXJlIDEgLXN0YXRlICRzdGF0ZQogICAgJHJvd2N0eG1lbnUgZW50cnljb25maWd1cmUgMiAtc3RhdGUgJHN0YXRlCiAgICBzZXQgcm93bWVudWlkICRpZAogICAgdGtfcG9wdXAgJHJvd2N0eG1lbnUgJHggJHkKfQoKcHJvYyBkaWZmdnNzZWwge2Rpcm59IHsKICAgIGdsb2JhbCByb3dtZW51aWQgc2VsZWN0ZWRsaW5lIGRpc3BsYXlvcmRlcgoKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgaWYgeyRkaXJufSB7CglzZXQgb2xkaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRzZWxlY3RlZGxpbmVdCglzZXQgbmV3aWQgJHJvd21lbnVpZAogICAgfSBlbHNlIHsKCXNldCBvbGRpZCAkcm93bWVudWlkCglzZXQgbmV3aWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRzZWxlY3RlZGxpbmVdCiAgICB9CiAgICBhZGR0b2hpc3RvcnkgW2xpc3QgZG9zZWxkaWZmICRvbGRpZCAkbmV3aWRdCiAgICBkb3NlbGRpZmYgJG9sZGlkICRuZXdpZAp9Cgpwcm9jIGRvc2VsZGlmZiB7b2xkaWQgbmV3aWR9IHsKICAgIGdsb2JhbCBjdGV4dAogICAgZ2xvYmFsIGNvbW1pdGluZm8KCiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBjbGVhcl9jdGV4dAogICAgaW5pdF9mbGlzdCAiVG9wIgogICAgJGN0ZXh0IGluc2VydCBlbmQgIkZyb20gIgogICAgJGN0ZXh0IHRhZyBjb25mIGxpbmsgLWZvcmVncm91bmQgYmx1ZSAtdW5kZXJsaW5lIDEKICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxFbnRlcj4geyAlVyBjb25maWd1cmUgLWN1cnNvciBoYW5kMiB9CiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8TGVhdmU+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgJGN1cnRleHRjdXJzb3IgfQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmswIDwxPiBbbGlzdCBzZWxieWlkICRvbGRpZF0KICAgICRjdGV4dCBpbnNlcnQgZW5kICRvbGRpZCBbbGlzdCBsaW5rIGxpbmswXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuICAgICAiCiAgICAkY3RleHQgaW5zZXJ0IGVuZCBbbGluZGV4ICRjb21taXRpbmZvKCRvbGRpZCkgMF0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblxuVG8gICAiCiAgICAkY3RleHQgdGFnIGJpbmQgbGluazEgPDE+IFtsaXN0IHNlbGJ5aWQgJG5ld2lkXQogICAgJGN0ZXh0IGluc2VydCBlbmQgJG5ld2lkIFtsaXN0IGxpbmsgbGluazFdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4gICAgICIKICAgICRjdGV4dCBpbnNlcnQgZW5kIFtsaW5kZXggJGNvbW1pdGluZm8oJG5ld2lkKSAwXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuIgogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICAkY3RleHQgdGFnIGRlbGV0ZSBDb21tZW50cwogICAgJGN0ZXh0IHRhZyByZW1vdmUgZm91bmQgMS4wIGVuZAogICAgc3RhcnRkaWZmIFtsaXN0ICRvbGRpZCAkbmV3aWRdCn0KCnByb2MgbWtwYXRjaCB7fSB7CiAgICBnbG9iYWwgcm93bWVudWlkIGN1cnJlbnRpZCBjb21taXRpbmZvIHBhdGNodG9wIHBhdGNobnVtCgogICAgaWYgeyFbaW5mbyBleGlzdHMgY3VycmVudGlkXX0gcmV0dXJuCiAgICBzZXQgb2xkaWQgJGN1cnJlbnRpZAogICAgc2V0IG9sZGhlYWQgW2xpbmRleCAkY29tbWl0aW5mbygkb2xkaWQpIDBdCiAgICBzZXQgbmV3aWQgJHJvd21lbnVpZAogICAgc2V0IG5ld2hlYWQgW2xpbmRleCAkY29tbWl0aW5mbygkbmV3aWQpIDBdCiAgICBzZXQgdG9wIC5wYXRjaAogICAgc2V0IHBhdGNodG9wICR0b3AKICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9CiAgICB0b3BsZXZlbCAkdG9wCiAgICBsYWJlbCAkdG9wLnRpdGxlIC10ZXh0ICJHZW5lcmF0ZSBwYXRjaCIKICAgIGdyaWQgJHRvcC50aXRsZSAtIC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmZyb20gLXRleHQgIkZyb206IgogICAgZW50cnkgJHRvcC5mcm9tc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CiAgICAkdG9wLmZyb21zaGExIGluc2VydCAwICRvbGRpZAogICAgJHRvcC5mcm9tc2hhMSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCAkdG9wLmZyb20gJHRvcC5mcm9tc2hhMSAtc3RpY2t5IHcKICAgIGVudHJ5ICR0b3AuZnJvbWhlYWQgLXdpZHRoIDYwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5mcm9taGVhZCBpbnNlcnQgMCAkb2xkaGVhZAogICAgJHRvcC5mcm9taGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCB4ICR0b3AuZnJvbWhlYWQgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLnRvIC10ZXh0ICJUbzoiCiAgICBlbnRyeSAkdG9wLnRvc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CiAgICAkdG9wLnRvc2hhMSBpbnNlcnQgMCAkbmV3aWQKICAgICR0b3AudG9zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AudG8gJHRvcC50b3NoYTEgLXN0aWNreSB3CiAgICBlbnRyeSAkdG9wLnRvaGVhZCAtd2lkdGggNjAgLXJlbGllZiBmbGF0CiAgICAkdG9wLnRvaGVhZCBpbnNlcnQgMCAkbmV3aGVhZAogICAgJHRvcC50b2hlYWQgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgeCAkdG9wLnRvaGVhZCAtc3RpY2t5IHcKICAgIGJ1dHRvbiAkdG9wLnJldiAtdGV4dCAiUmV2ZXJzZSIgLWNvbW1hbmQgbWtwYXRjaHJldiAtcGFkeCA1CiAgICBncmlkICR0b3AucmV2IHggLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuZmxhYiAtdGV4dCAiT3V0cHV0IGZpbGU6IgogICAgZW50cnkgJHRvcC5mbmFtZSAtd2lkdGggNjAKICAgICR0b3AuZm5hbWUgaW5zZXJ0IDAgW2ZpbGUgbm9ybWFsaXplICJwYXRjaCRwYXRjaG51bS5wYXRjaCJdCiAgICBpbmNyIHBhdGNobnVtCiAgICBncmlkICR0b3AuZmxhYiAkdG9wLmZuYW1lIC1zdGlja3kgdwogICAgZnJhbWUgJHRvcC5idXRzCiAgICBidXR0b24gJHRvcC5idXRzLmdlbiAtdGV4dCAiR2VuZXJhdGUiIC1jb21tYW5kIG1rcGF0Y2hnbwogICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgbWtwYXRjaGNhbgogICAgZ3JpZCAkdG9wLmJ1dHMuZ2VuICR0b3AuYnV0cy5jYW4KICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCAkdG9wLmJ1dHMgLSAtcGFkeSAxMCAtc3RpY2t5IGV3CiAgICBmb2N1cyAkdG9wLmZuYW1lCn0KCnByb2MgbWtwYXRjaHJldiB7fSB7CiAgICBnbG9iYWwgcGF0Y2h0b3AKCiAgICBzZXQgb2xkaWQgWyRwYXRjaHRvcC5mcm9tc2hhMSBnZXRdCiAgICBzZXQgb2xkaGVhZCBbJHBhdGNodG9wLmZyb21oZWFkIGdldF0KICAgIHNldCBuZXdpZCBbJHBhdGNodG9wLnRvc2hhMSBnZXRdCiAgICBzZXQgbmV3aGVhZCBbJHBhdGNodG9wLnRvaGVhZCBnZXRdCiAgICBmb3JlYWNoIGUgW2xpc3QgZnJvbXNoYTEgZnJvbWhlYWQgdG9zaGExIHRvaGVhZF0gXAoJICAgIHYgW2xpc3QgJG5ld2lkICRuZXdoZWFkICRvbGRpZCAkb2xkaGVhZF0gewoJJHBhdGNodG9wLiRlIGNvbmYgLXN0YXRlIG5vcm1hbAoJJHBhdGNodG9wLiRlIGRlbGV0ZSAwIGVuZAoJJHBhdGNodG9wLiRlIGluc2VydCAwICR2CgkkcGF0Y2h0b3AuJGUgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIH0KfQoKcHJvYyBta3BhdGNoZ28ge30gewogICAgZ2xvYmFsIHBhdGNodG9wCgogICAgc2V0IG9sZGlkIFskcGF0Y2h0b3AuZnJvbXNoYTEgZ2V0XQogICAgc2V0IG5ld2lkIFskcGF0Y2h0b3AudG9zaGExIGdldF0KICAgIHNldCBmbmFtZSBbJHBhdGNodG9wLmZuYW1lIGdldF0KICAgIGlmIHtbY2F0Y2gge2V4ZWMgZ2l0IGRpZmYtdHJlZSAtcCAkb2xkaWQgJG5ld2lkID4kZm5hbWUgJn0gZXJyXX0gewoJZXJyb3JfcG9wdXAgIkVycm9yIGNyZWF0aW5nIHBhdGNoOiAkZXJyIgogICAgfQogICAgY2F0Y2gge2Rlc3Ryb3kgJHBhdGNodG9wfQogICAgdW5zZXQgcGF0Y2h0b3AKfQoKcHJvYyBta3BhdGNoY2FuIHt9IHsKICAgIGdsb2JhbCBwYXRjaHRvcAoKICAgIGNhdGNoIHtkZXN0cm95ICRwYXRjaHRvcH0KICAgIHVuc2V0IHBhdGNodG9wCn0KCnByb2MgbWt0YWcge30gewogICAgZ2xvYmFsIHJvd21lbnVpZCBta3RhZ3RvcCBjb21taXRpbmZvCgogICAgc2V0IHRvcCAubWFrZXRhZwogICAgc2V0IG1rdGFndG9wICR0b3AKICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9CiAgICB0b3BsZXZlbCAkdG9wCiAgICBsYWJlbCAkdG9wLnRpdGxlIC10ZXh0ICJDcmVhdGUgdGFnIgogICAgZ3JpZCAkdG9wLnRpdGxlIC0gLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuaWQgLXRleHQgIklEOiIKICAgIGVudHJ5ICR0b3Auc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CiAgICAkdG9wLnNoYTEgaW5zZXJ0IDAgJHJvd21lbnVpZAogICAgJHRvcC5zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AuaWQgJHRvcC5zaGExIC1zdGlja3kgdwogICAgZW50cnkgJHRvcC5oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKICAgICR0b3AuaGVhZCBpbnNlcnQgMCBbbGluZGV4ICRjb21taXRpbmZvKCRyb3dtZW51aWQpIDBdCiAgICAkdG9wLmhlYWQgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgeCAkdG9wLmhlYWQgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLnRsYWIgLXRleHQgIlRhZyBuYW1lOiIKICAgIGVudHJ5ICR0b3AudGFnIC13aWR0aCA2MAogICAgZ3JpZCAkdG9wLnRsYWIgJHRvcC50YWcgLXN0aWNreSB3CiAgICBmcmFtZSAkdG9wLmJ1dHMKICAgIGJ1dHRvbiAkdG9wLmJ1dHMuZ2VuIC10ZXh0ICJDcmVhdGUiIC1jb21tYW5kIG1rdGFnZ28KICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIG1rdGFnY2FuCiAgICBncmlkICR0b3AuYnV0cy5nZW4gJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKICAgIGZvY3VzICR0b3AudGFnCn0KCnByb2MgZG9ta3RhZyB7fSB7CiAgICBnbG9iYWwgbWt0YWd0b3AgZW52IHRhZ2lkcyBpZHRhZ3MKCiAgICBzZXQgaWQgWyRta3RhZ3RvcC5zaGExIGdldF0KICAgIHNldCB0YWcgWyRta3RhZ3RvcC50YWcgZ2V0XQogICAgaWYgeyR0YWcgPT0ge319IHsKCWVycm9yX3BvcHVwICJObyB0YWcgbmFtZSBzcGVjaWZpZWQiCglyZXR1cm4KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgdGFnaWRzKCR0YWcpXX0gewoJZXJyb3JfcG9wdXAgIlRhZyBcIiR0YWdcIiBhbHJlYWR5IGV4aXN0cyIKCXJldHVybgogICAgfQogICAgaWYge1tjYXRjaCB7CglzZXQgZGlyIFtnaXRkaXJdCglzZXQgZm5hbWUgW2ZpbGUgam9pbiAkZGlyICJyZWZzL3RhZ3MiICR0YWddCglzZXQgZiBbb3BlbiAkZm5hbWUgd10KCXB1dHMgJGYgJGlkCgljbG9zZSAkZgogICAgfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3IgY3JlYXRpbmcgdGFnOiAkZXJyIgoJcmV0dXJuCiAgICB9CgogICAgc2V0IHRhZ2lkcygkdGFnKSAkaWQKICAgIGxhcHBlbmQgaWR0YWdzKCRpZCkgJHRhZwogICAgcmVkcmF3dGFncyAkaWQKICAgIGFkZGVkdGFnICRpZAp9Cgpwcm9jIHJlZHJhd3RhZ3Mge2lkfSB7CiAgICBnbG9iYWwgY2FudiBsaW5laHRhZyBjb21taXRyb3cgaWRwb3Mgc2VsZWN0ZWRsaW5lIGN1cnZpZXcKICAgIGdsb2JhbCBtYWluZm9udCBjYW52eG1heAoKICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXX0gcmV0dXJuCiAgICBkcmF3Y21pdHJvdyAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkKICAgICRjYW52IGRlbGV0ZSB0YWcuJGlkCiAgICBzZXQgeHQgW2V2YWwgZHJhd3RhZ3MgJGlkICRpZHBvcygkaWQpXQogICAgJGNhbnYgY29vcmRzICRsaW5laHRhZygkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkpICR4dCBbbGluZGV4ICRpZHBvcygkaWQpIDJdCiAgICBzZXQgdGV4dCBbJGNhbnYgaXRlbWNnZXQgJGxpbmVodGFnKCRjb21taXRyb3coJGN1cnZpZXcsJGlkKSkgLXRleHRdCiAgICBzZXQgeHIgW2V4cHIgeyR4dCArIFtmb250IG1lYXN1cmUgJG1haW5mb250ICR0ZXh0XX1dCiAgICBpZiB7JHhyID4gJGNhbnZ4bWF4fSB7CglzZXQgY2FudnhtYXggJHhyCglzZXRjYW52c2Nyb2xsCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV0KCSYmICRzZWxlY3RlZGxpbmUgPT0gJGNvbW1pdHJvdygkY3VydmlldywkaWQpfSB7CglzZWxlY3RsaW5lICRzZWxlY3RlZGxpbmUgMAogICAgfQp9Cgpwcm9jIG1rdGFnY2FuIHt9IHsKICAgIGdsb2JhbCBta3RhZ3RvcAoKICAgIGNhdGNoIHtkZXN0cm95ICRta3RhZ3RvcH0KICAgIHVuc2V0IG1rdGFndG9wCn0KCnByb2MgbWt0YWdnbyB7fSB7CiAgICBkb21rdGFnCiAgICBta3RhZ2Nhbgp9Cgpwcm9jIHdyaXRlY29tbWl0IHt9IHsKICAgIGdsb2JhbCByb3dtZW51aWQgd3Jjb210b3AgY29tbWl0aW5mbyB3cmNvbWNtZAoKICAgIHNldCB0b3AgLndyaXRlY29tbWl0CiAgICBzZXQgd3Jjb210b3AgJHRvcAogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KICAgIHRvcGxldmVsICR0b3AKICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIldyaXRlIGNvbW1pdCB0byBmaWxlIgogICAgZ3JpZCAkdG9wLnRpdGxlIC0gLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuaWQgLXRleHQgIklEOiIKICAgIGVudHJ5ICR0b3Auc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CiAgICAkdG9wLnNoYTEgaW5zZXJ0IDAgJHJvd21lbnVpZAogICAgJHRvcC5zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AuaWQgJHRvcC5zaGExIC1zdGlja3kgdwogICAgZW50cnkgJHRvcC5oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKICAgICR0b3AuaGVhZCBpbnNlcnQgMCBbbGluZGV4ICRjb21taXRpbmZvKCRyb3dtZW51aWQpIDBdCiAgICAkdG9wLmhlYWQgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgeCAkdG9wLmhlYWQgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLmNsYWIgLXRleHQgIkNvbW1hbmQ6IgogICAgZW50cnkgJHRvcC5jbWQgLXdpZHRoIDYwIC10ZXh0dmFyaWFibGUgd3Jjb21jbWQKICAgIGdyaWQgJHRvcC5jbGFiICR0b3AuY21kIC1zdGlja3kgdyAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5mbGFiIC10ZXh0ICJPdXRwdXQgZmlsZToiCiAgICBlbnRyeSAkdG9wLmZuYW1lIC13aWR0aCA2MAogICAgJHRvcC5mbmFtZSBpbnNlcnQgMCBbZmlsZSBub3JtYWxpemUgImNvbW1pdC1bc3RyaW5nIHJhbmdlICRyb3dtZW51aWQgMCA2XSJdCiAgICBncmlkICR0b3AuZmxhYiAkdG9wLmZuYW1lIC1zdGlja3kgdwogICAgZnJhbWUgJHRvcC5idXRzCiAgICBidXR0b24gJHRvcC5idXRzLmdlbiAtdGV4dCAiV3JpdGUiIC1jb21tYW5kIHdyY29tZ28KICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIHdyY29tY2FuCiAgICBncmlkICR0b3AuYnV0cy5nZW4gJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKICAgIGZvY3VzICR0b3AuZm5hbWUKfQoKcHJvYyB3cmNvbWdvIHt9IHsKICAgIGdsb2JhbCB3cmNvbXRvcAoKICAgIHNldCBpZCBbJHdyY29tdG9wLnNoYTEgZ2V0XQogICAgc2V0IGNtZCAiZWNobyAkaWQgfCBbJHdyY29tdG9wLmNtZCBnZXRdIgogICAgc2V0IGZuYW1lIFskd3Jjb210b3AuZm5hbWUgZ2V0XQogICAgaWYge1tjYXRjaCB7ZXhlYyBzaCAtYyAkY21kID4kZm5hbWUgJn0gZXJyXX0gewoJZXJyb3JfcG9wdXAgIkVycm9yIHdyaXRpbmcgY29tbWl0OiAkZXJyIgogICAgfQogICAgY2F0Y2gge2Rlc3Ryb3kgJHdyY29tdG9wfQogICAgdW5zZXQgd3Jjb210b3AKfQoKcHJvYyB3cmNvbWNhbiB7fSB7CiAgICBnbG9iYWwgd3Jjb210b3AKCiAgICBjYXRjaCB7ZGVzdHJveSAkd3Jjb210b3B9CiAgICB1bnNldCB3cmNvbXRvcAp9Cgpwcm9jIG1rYnJhbmNoIHt9IHsKICAgIGdsb2JhbCByb3dtZW51aWQgbWticnRvcAoKICAgIHNldCB0b3AgLm1ha2VicmFuY2gKICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9CiAgICB0b3BsZXZlbCAkdG9wCiAgICBsYWJlbCAkdG9wLnRpdGxlIC10ZXh0ICJDcmVhdGUgbmV3IGJyYW5jaCIKICAgIGdyaWQgJHRvcC50aXRsZSAtIC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmlkIC10ZXh0ICJJRDoiCiAgICBlbnRyeSAkdG9wLnNoYTEgLXdpZHRoIDQwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5zaGExIGluc2VydCAwICRyb3dtZW51aWQKICAgICR0b3Auc2hhMSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCAkdG9wLmlkICR0b3Auc2hhMSAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AubmxhYiAtdGV4dCAiTmFtZToiCiAgICBlbnRyeSAkdG9wLm5hbWUgLXdpZHRoIDQwCiAgICBncmlkICR0b3AubmxhYiAkdG9wLm5hbWUgLXN0aWNreSB3CiAgICBmcmFtZSAkdG9wLmJ1dHMKICAgIGJ1dHRvbiAkdG9wLmJ1dHMuZ28gLXRleHQgIkNyZWF0ZSIgLWNvbW1hbmQgW2xpc3QgbWticmdvICR0b3BdCiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCAiY2F0Y2gge2Rlc3Ryb3kgJHRvcH0iCiAgICBncmlkICR0b3AuYnV0cy5nbyAkdG9wLmJ1dHMuY2FuCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgJHRvcC5idXRzIC0gLXBhZHkgMTAgLXN0aWNreSBldwogICAgZm9jdXMgJHRvcC5uYW1lCn0KCnByb2MgbWticmdvIHt0b3B9IHsKICAgIGdsb2JhbCBoZWFkaWRzIGlkaGVhZHMKCiAgICBzZXQgbmFtZSBbJHRvcC5uYW1lIGdldF0KICAgIHNldCBpZCBbJHRvcC5zaGExIGdldF0KICAgIGlmIHskbmFtZSBlcSB7fX0gewoJZXJyb3JfcG9wdXAgIlBsZWFzZSBzcGVjaWZ5IGEgbmFtZSBmb3IgdGhlIG5ldyBicmFuY2giCglyZXR1cm4KICAgIH0KICAgIGNhdGNoIHtkZXN0cm95ICR0b3B9CiAgICBub3didXN5IG5ld2JyYW5jaAogICAgdXBkYXRlCiAgICBpZiB7W2NhdGNoIHsKCWV4ZWMgZ2l0IGJyYW5jaCAkbmFtZSAkaWQKICAgIH0gZXJyXX0gewoJbm90YnVzeSBuZXdicmFuY2gKCWVycm9yX3BvcHVwICRlcnIKICAgIH0gZWxzZSB7CglhZGRlZGhlYWQgJGlkICRuYW1lCgkjIFhYWCBzaG91bGQgdXBkYXRlIGxpc3Qgb2YgaGVhZHMgZGlzcGxheWVkIGZvciBzZWxlY3RlZCBjb21taXQKCW5vdGJ1c3kgbmV3YnJhbmNoCglyZWRyYXd0YWdzICRpZAogICAgfQp9Cgpwcm9jIGNoZXJyeXBpY2sge30gewogICAgZ2xvYmFsIHJvd21lbnVpZCBjdXJ2aWV3IGNvbW1pdHJvdwogICAgZ2xvYmFsIG1haW5oZWFkIGRlc2NfaGVhZHMgYW5jX3RhZ3MgZGVzY190YWdzIGFsbHBhcmVudHMgYWxsY2hpbGRyZW4KCiAgICBpZiB7W2luZm8gZXhpc3RzIGRlc2NfaGVhZHMoJHJvd21lbnVpZCldCgkmJiBbbHNlYXJjaCAtZXhhY3QgJGRlc2NfaGVhZHMoJHJvd21lbnVpZCkgJG1haW5oZWFkXSA+PSAwfSB7CglzZXQgb2sgW2NvbmZpcm1fcG9wdXAgIkNvbW1pdCBbc3RyaW5nIHJhbmdlICRyb3dtZW51aWQgMCA3XSBpcyBhbHJlYWR5XAoJCQlpbmNsdWRlZCBpbiBicmFuY2ggJG1haW5oZWFkIC0tIHJlYWxseSByZS1hcHBseSBpdD8iXQoJaWYgeyEkb2t9IHJldHVybgogICAgfQogICAgbm93YnVzeSBjaGVycnlwaWNrCiAgICB1cGRhdGUKICAgIHNldCBvbGRoZWFkIFtleGVjIGdpdCByZXYtcGFyc2UgSEVBRF0KICAgICMgVW5mb3J0dW5hdGVseSBnaXQtY2hlcnJ5LXBpY2sgd3JpdGVzIHN0dWZmIHRvIHN0ZGVyciBldmVuIHdoZW4KICAgICMgbm8gZXJyb3Igb2NjdXJzLCBhbmQgZXhlYyB0YWtlcyB0aGF0IGFzIGFuIGluZGljYXRpb24gb2YgZXJyb3IuLi4KICAgIGlmIHtbY2F0Y2gge2V4ZWMgc2ggLWMgImdpdCBjaGVycnktcGljayAtciAkcm93bWVudWlkIDI+JjEifSBlcnJdfSB7Cglub3RidXN5IGNoZXJyeXBpY2sKCWVycm9yX3BvcHVwICRlcnIKCXJldHVybgogICAgfQogICAgc2V0IG5ld2hlYWQgW2V4ZWMgZ2l0IHJldi1wYXJzZSBIRUFEXQogICAgaWYgeyRuZXdoZWFkIGVxICRvbGRoZWFkfSB7Cglub3RidXN5IGNoZXJyeXBpY2sKCWVycm9yX3BvcHVwICJObyBjaGFuZ2VzIGNvbW1pdHRlZCIKCXJldHVybgogICAgfQogICAgc2V0IGFsbHBhcmVudHMoJG5ld2hlYWQpICRvbGRoZWFkCiAgICBsYXBwZW5kIGFsbGNoaWxkcmVuKCRvbGRoZWFkKSAkbmV3aGVhZAogICAgc2V0IGRlc2NfaGVhZHMoJG5ld2hlYWQpICRtYWluaGVhZAogICAgaWYge1tpbmZvIGV4aXN0cyBhbmNfdGFncygkb2xkaGVhZCldfSB7CglzZXQgYW5jX3RhZ3MoJG5ld2hlYWQpICRhbmNfdGFncygkb2xkaGVhZCkKICAgIH0KICAgIHNldCBkZXNjX3RhZ3MoJG5ld2hlYWQpIHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3Vydmlldywkb2xkaGVhZCldfSB7CglpbnNlcnRyb3cgJGNvbW1pdHJvdygkY3Vydmlldywkb2xkaGVhZCkgJG5ld2hlYWQKCWlmIHskbWFpbmhlYWQgbmUge319IHsKCSAgICBtb3ZlZGhlYWQgJG5ld2hlYWQgJG1haW5oZWFkCgl9CglyZWRyYXd0YWdzICRvbGRoZWFkCglyZWRyYXd0YWdzICRuZXdoZWFkCiAgICB9CiAgICBub3RidXN5IGNoZXJyeXBpY2sKfQoKIyBjb250ZXh0IG1lbnUgZm9yIGEgaGVhZApwcm9jIGhlYWRtZW51IHt4IHkgaWQgaGVhZH0gewogICAgZ2xvYmFsIGhlYWRtZW51aWQgaGVhZG1lbnVoZWFkIGhlYWRjdHhtZW51CgogICAgc2V0IGhlYWRtZW51aWQgJGlkCiAgICBzZXQgaGVhZG1lbnVoZWFkICRoZWFkCiAgICB0a19wb3B1cCAkaGVhZGN0eG1lbnUgJHggJHkKfQoKcHJvYyBjb2JyYW5jaCB7fSB7CiAgICBnbG9iYWwgaGVhZG1lbnVpZCBoZWFkbWVudWhlYWQgbWFpbmhlYWQgaGVhZGlkcwoKICAgICMgY2hlY2sgdGhlIHRyZWUgaXMgY2xlYW4gZmlyc3Q/PwogICAgc2V0IG9sZG1haW5oZWFkICRtYWluaGVhZAogICAgbm93YnVzeSBjaGVja291dAogICAgdXBkYXRlCiAgICBpZiB7W2NhdGNoIHsKCWV4ZWMgZ2l0IGNoZWNrb3V0ICRoZWFkbWVudWhlYWQKICAgIH0gZXJyXX0gewoJbm90YnVzeSBjaGVja291dAoJZXJyb3JfcG9wdXAgJGVycgogICAgfSBlbHNlIHsKCW5vdGJ1c3kgY2hlY2tvdXQKCXNldCBtYWluaGVhZCAkaGVhZG1lbnVoZWFkCglpZiB7W2luZm8gZXhpc3RzIGhlYWRpZHMoJG9sZG1haW5oZWFkKV19IHsKCSAgICByZWRyYXd0YWdzICRoZWFkaWRzKCRvbGRtYWluaGVhZCkKCX0KCXJlZHJhd3RhZ3MgJGhlYWRtZW51aWQKICAgIH0KfQoKcHJvYyBybWJyYW5jaCB7fSB7CiAgICBnbG9iYWwgZGVzY19oZWFkcyBoZWFkbWVudWlkIGhlYWRtZW51aGVhZCBtYWluaGVhZAogICAgZ2xvYmFsIGhlYWRpZHMgaWRoZWFkcwoKICAgIHNldCBoZWFkICRoZWFkbWVudWhlYWQKICAgIHNldCBpZCAkaGVhZG1lbnVpZAogICAgaWYgeyRoZWFkIGVxICRtYWluaGVhZH0gewoJZXJyb3JfcG9wdXAgIkNhbm5vdCBkZWxldGUgdGhlIGN1cnJlbnRseSBjaGVja2VkLW91dCBicmFuY2giCglyZXR1cm4KICAgIH0KICAgIGlmIHskZGVzY19oZWFkcygkaWQpIGVxICRoZWFkfSB7CgkjIHRoZSBzdHVmZiBvbiB0aGlzIGJyYW5jaCBpc24ndCBvbiBhbnkgb3RoZXIgYnJhbmNoCglpZiB7IVtjb25maXJtX3BvcHVwICJUaGUgY29tbWl0cyBvbiBicmFuY2ggJGhlYWQgYXJlbid0IG9uIGFueSBvdGhlclwKCQkJYnJhbmNoLlxuUmVhbGx5IGRlbGV0ZSBicmFuY2ggJGhlYWQ/Il19IHJldHVybgogICAgfQogICAgbm93YnVzeSBybWJyYW5jaAogICAgdXBkYXRlCiAgICBpZiB7W2NhdGNoIHtleGVjIGdpdCBicmFuY2ggLUQgJGhlYWR9IGVycl19IHsKCW5vdGJ1c3kgcm1icmFuY2gKCWVycm9yX3BvcHVwICRlcnIKCXJldHVybgogICAgfQogICAgcmVtb3ZlZGhlYWQgJGlkICRoZWFkCiAgICByZWRyYXd0YWdzICRpZAogICAgbm90YnVzeSBybWJyYW5jaAp9CgojIFN0dWZmIGZvciBmaW5kaW5nIG5lYXJieSB0YWdzCnByb2MgZ2V0YWxsY29tbWl0cyB7fSB7CiAgICBnbG9iYWwgYWxsY3N0YXJ0IGFsbGNvbW1pdHMgYWxsY2ZkIGFsbGlkcwoKICAgIHNldCBhbGxpZHMge30KICAgIHNldCBmZCBbb3BlbiBbY29uY2F0IHwgZ2l0IHJldi1saXN0IC0tYWxsIC0tdG9wby1vcmRlciAtLXBhcmVudHNdIHJdCiAgICBzZXQgYWxsY2ZkICRmZAogICAgZmNvbmZpZ3VyZSAkZmQgLWJsb2NraW5nIDAKICAgIHNldCBhbGxjb21taXRzICJyZWFkaW5nIgogICAgbm93YnVzeSBhbGxjb21taXRzCiAgICByZXN0YXJ0Z2V0YWxsICRmZAp9Cgpwcm9jIGRpc2NhcmRhbGxjb21taXRzIHt9IHsKICAgIGdsb2JhbCBhbGxwYXJlbnRzIGFsbGNoaWxkcmVuIGFsbGNvbW1pdHMgYWxsY2ZkCiAgICBnbG9iYWwgZGVzY190YWdzIGFuY190YWdzIGFsbGR0YWdzIHRhZ2lzZGVzYyBhbGxpZHMgZGVzY19oZWFkcwoKICAgIGlmIHshW2luZm8gZXhpc3RzIGFsbGNvbW1pdHNdfSByZXR1cm4KICAgIGlmIHskYWxsY29tbWl0cyBlcSAicmVhZGluZyJ9IHsKCWNhdGNoIHtjbG9zZSAkYWxsY2ZkfQogICAgfQogICAgZm9yZWFjaCB2IHthbGxjb21taXRzIGFsbGNoaWxkcmVuIGFsbHBhcmVudHMgYWxsaWRzIGRlc2NfdGFncyBhbmNfdGFncwoJCWFsbGR0YWdzIHRhZ2lzZGVzYyBkZXNjX2hlYWRzfSB7CgljYXRjaCB7dW5zZXQgJHZ9CiAgICB9Cn0KCnByb2MgcmVzdGFydGdldGFsbCB7ZmR9IHsKICAgIGdsb2JhbCBhbGxjc3RhcnQKCiAgICBmaWxlZXZlbnQgJGZkIHJlYWRhYmxlIFtsaXN0IGdldGFsbGNsaW5lcyAkZmRdCiAgICBzZXQgYWxsY3N0YXJ0IFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KfQoKcHJvYyBjb21iaW5lX2R0YWdzIHtsMSBsMn0gewogICAgZ2xvYmFsIHRhZ2lzZGVzYyBub3RmaXJzdGQKCiAgICBzZXQgcmVzIFtsc29ydCAtdW5pcXVlIFtjb25jYXQgJGwxICRsMl1dCiAgICBmb3Ige3NldCBpIDB9IHskaSA8IFtsbGVuZ3RoICRyZXNdfSB7aW5jciBpfSB7CglzZXQgeCBbbGluZGV4ICRyZXMgJGldCglmb3Ige3NldCBqIFtleHByIHskaSsxfV19IHskaiA8IFtsbGVuZ3RoICRyZXNdfSB7fSB7CgkgICAgc2V0IHkgW2xpbmRleCAkcmVzICRqXQoJICAgIGlmIHtbaW5mbyBleGlzdHMgdGFnaXNkZXNjKCR4LCR5KV19IHsKCQlpZiB7JHRhZ2lzZGVzYygkeCwkeSkgPiAwfSB7CgkJICAgICMgeCBpcyBhIGRlc2NlbmRlbnQgb2YgeSwgZXhjbHVkZSB4CgkJICAgIHNldCByZXMgW2xyZXBsYWNlICRyZXMgJGkgJGldCgkJICAgIGluY3IgaSAtMQoJCSAgICBicmVhawoJCX0gZWxzZSB7CgkJICAgICMgeSBpcyBhIGRlc2NlbmRlbnQgb2YgeCwgZXhjbHVkZSB5CgkJICAgIHNldCByZXMgW2xyZXBsYWNlICRyZXMgJGogJGpdCgkJfQoJICAgIH0gZWxzZSB7CgkJIyBubyByZWxhdGlvbiwga2VlcCBnb2luZwoJCWluY3IgagoJICAgIH0KCX0KICAgIH0KICAgIHJldHVybiAkcmVzCn0KCnByb2MgY29tYmluZV9hdGFncyB7bDEgbDJ9IHsKICAgIGdsb2JhbCB0YWdpc2Rlc2MKCiAgICBzZXQgcmVzIFtsc29ydCAtdW5pcXVlIFtjb25jYXQgJGwxICRsMl1dCiAgICBmb3Ige3NldCBpIDB9IHskaSA8IFtsbGVuZ3RoICRyZXNdfSB7aW5jciBpfSB7CglzZXQgeCBbbGluZGV4ICRyZXMgJGldCglmb3Ige3NldCBqIFtleHByIHskaSsxfV19IHskaiA8IFtsbGVuZ3RoICRyZXNdfSB7fSB7CgkgICAgc2V0IHkgW2xpbmRleCAkcmVzICRqXQoJICAgIGlmIHtbaW5mbyBleGlzdHMgdGFnaXNkZXNjKCR4LCR5KV19IHsKCQlpZiB7JHRhZ2lzZGVzYygkeCwkeSkgPCAwfSB7CgkJICAgICMgeCBpcyBhbiBhbmNlc3RvciBvZiB5LCBleGNsdWRlIHgKCQkgICAgc2V0IHJlcyBbbHJlcGxhY2UgJHJlcyAkaSAkaV0KCQkgICAgaW5jciBpIC0xCgkJICAgIGJyZWFrCgkJfSBlbHNlIHsKCQkgICAgIyB5IGlzIGFuIGFuY2VzdG9yIG9mIHgsIGV4Y2x1ZGUgeQoJCSAgICBzZXQgcmVzIFtscmVwbGFjZSAkcmVzICRqICRqXQoJCX0KCSAgICB9IGVsc2UgewoJCSMgbm8gcmVsYXRpb24sIGtlZXAgZ29pbmcKCQlpbmNyIGoKCSAgICB9Cgl9CiAgICB9CiAgICByZXR1cm4gJHJlcwp9Cgpwcm9jIGZvcndhcmRfcGFzcyB7aWQgY2hpbGRyZW59IHsKICAgIGdsb2JhbCBpZHRhZ3MgZGVzY190YWdzIGlkaGVhZHMgZGVzY19oZWFkcyBhbGxkdGFncyB0YWdpc2Rlc2MKCiAgICBzZXQgZHRhZ3Mge30KICAgIHNldCBkaGVhZHMge30KICAgIGZvcmVhY2ggY2hpbGQgJGNoaWxkcmVuIHsKCWlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRjaGlsZCldfSB7CgkgICAgc2V0IGN0YWdzIFtsaXN0ICRjaGlsZF0KCX0gZWxzZSB7CgkgICAgc2V0IGN0YWdzICRkZXNjX3RhZ3MoJGNoaWxkKQoJfQoJaWYgeyRkdGFncyBlcSB7fX0gewoJICAgIHNldCBkdGFncyAkY3RhZ3MKCX0gZWxzZWlmIHskY3RhZ3MgbmUgJGR0YWdzfSB7CgkgICAgc2V0IGR0YWdzIFtjb21iaW5lX2R0YWdzICRkdGFncyAkY3RhZ3NdCgl9CglzZXQgY2hlYWRzICRkZXNjX2hlYWRzKCRjaGlsZCkKCWlmIHskZGhlYWRzIGVxIHt9fSB7CgkgICAgc2V0IGRoZWFkcyAkY2hlYWRzCgl9IGVsc2VpZiB7JGNoZWFkcyBuZSAkZGhlYWRzfSB7CgkgICAgc2V0IGRoZWFkcyBbbHNvcnQgLXVuaXF1ZSBbY29uY2F0ICRkaGVhZHMgJGNoZWFkc11dCgl9CiAgICB9CiAgICBzZXQgZGVzY190YWdzKCRpZCkgJGR0YWdzCiAgICBpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXX0gewoJc2V0IGFkdCAkZHRhZ3MKCWZvcmVhY2ggdGFnICRkdGFncyB7CgkgICAgc2V0IGFkdCBbY29uY2F0ICRhZHQgJGFsbGR0YWdzKCR0YWcpXQoJfQoJc2V0IGFkdCBbbHNvcnQgLXVuaXF1ZSAkYWR0XQoJc2V0IGFsbGR0YWdzKCRpZCkgJGFkdAoJZm9yZWFjaCB0YWcgJGFkdCB7CgkgICAgc2V0IHRhZ2lzZGVzYygkaWQsJHRhZykgLTEKCSAgICBzZXQgdGFnaXNkZXNjKCR0YWcsJGlkKSAxCgl9CiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkaGVhZHMoJGlkKV19IHsKCXNldCBkaGVhZHMgW2NvbmNhdCAkZGhlYWRzICRpZGhlYWRzKCRpZCldCiAgICB9CiAgICBzZXQgZGVzY19oZWFkcygkaWQpICRkaGVhZHMKfQoKcHJvYyBnZXRhbGxjbGluZXMge2ZkfSB7CiAgICBnbG9iYWwgYWxscGFyZW50cyBhbGxjaGlsZHJlbiBhbGxjb21taXRzIGFsbGNzdGFydAogICAgZ2xvYmFsIGRlc2NfdGFncyBhbmNfdGFncyBpZHRhZ3MgdGFnaXNkZXNjIGFsbGlkcwogICAgZ2xvYmFsIGlkaGVhZHMgdHJhdmluZGV4CgogICAgd2hpbGUge1tnZXRzICRmZCBsaW5lXSA+PSAwfSB7CglzZXQgaWQgW2xpbmRleCAkbGluZSAwXQoJbGFwcGVuZCBhbGxpZHMgJGlkCglzZXQgb2xkcyBbbHJhbmdlICRsaW5lIDEgZW5kXQoJc2V0IGFsbHBhcmVudHMoJGlkKSAkb2xkcwoJaWYgeyFbaW5mbyBleGlzdHMgYWxsY2hpbGRyZW4oJGlkKV19IHsKCSAgICBzZXQgYWxsY2hpbGRyZW4oJGlkKSB7fQoJfQoJZm9yZWFjaCBwICRvbGRzIHsKCSAgICBsYXBwZW5kIGFsbGNoaWxkcmVuKCRwKSAkaWQKCX0KCSMgY29tcHV0ZSBuZWFyZXN0IHRhZ2dlZCBkZXNjZW5kZW50cyBhcyB3ZSBnbwoJIyBhbHNvIGNvbXB1dGUgZGVzY2VuZGVudCBoZWFkcwoJZm9yd2FyZF9wYXNzICRpZCAkYWxsY2hpbGRyZW4oJGlkKQoJaWYge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gLSAkYWxsY3N0YXJ0ID49IDUwfSB7CgkgICAgZmlsZWV2ZW50ICRmZCByZWFkYWJsZSB7fQoJICAgIGFmdGVyIGlkbGUgcmVzdGFydGdldGFsbCAkZmQKCSAgICByZXR1cm4KCX0KICAgIH0KICAgIGlmIHtbZW9mICRmZF19IHsKCXNldCB0cmF2aW5kZXggW2xsZW5ndGggJGFsbGlkc10KCXNldCBhbGxjb21taXRzICJ0cmF2ZXJzaW5nIgoJYWZ0ZXIgaWRsZSByZXN0YXJ0YXRhZ3MKCWlmIHtbY2F0Y2gge2Nsb3NlICRmZH0gZXJyXX0gewoJICAgIGVycm9yX3BvcHVwICJFcnJvciByZWFkaW5nIGZ1bGwgY29tbWl0IGdyYXBoOiAkZXJyLlxuXAoJCQkgUmVzdWx0cyBtYXkgYmUgaW5jb21wbGV0ZS4iCgl9CiAgICB9Cn0KCiMgd2FsayBiYWNrd2FyZCB0aHJvdWdoIHRoZSB0cmVlIGFuZCBjb21wdXRlIG5lYXJlc3QgdGFnZ2VkIGFuY2VzdG9ycwpwcm9jIHJlc3RhcnRhdGFncyB7fSB7CiAgICBnbG9iYWwgYWxsaWRzIGFsbHBhcmVudHMgaWR0YWdzIGFuY190YWdzIHRyYXZpbmRleAoKICAgIHNldCB0MCBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdCiAgICBzZXQgaSAkdHJhdmluZGV4CiAgICB3aGlsZSB7W2luY3IgaSAtMV0gPj0gMH0gewoJc2V0IGlkIFtsaW5kZXggJGFsbGlkcyAkaV0KCXNldCBhdGFncyB7fQoJZm9yZWFjaCBwICRhbGxwYXJlbnRzKCRpZCkgewoJICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRwKV19IHsKCQlzZXQgcHRhZ3MgW2xpc3QgJHBdCgkgICAgfSBlbHNlIHsKCQlzZXQgcHRhZ3MgJGFuY190YWdzKCRwKQoJICAgIH0KCSAgICBpZiB7JGF0YWdzIGVxIHt9fSB7CgkJc2V0IGF0YWdzICRwdGFncwoJICAgIH0gZWxzZWlmIHskcHRhZ3MgbmUgJGF0YWdzfSB7CgkJc2V0IGF0YWdzIFtjb21iaW5lX2F0YWdzICRhdGFncyAkcHRhZ3NdCgkgICAgfQoJfQoJc2V0IGFuY190YWdzKCRpZCkgJGF0YWdzCglpZiB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSAtICR0MCA+PSA1MH0gewoJICAgIHNldCB0cmF2aW5kZXggJGkKCSAgICBhZnRlciBpZGxlIHJlc3RhcnRhdGFncwoJICAgIHJldHVybgoJfQogICAgfQogICAgc2V0IGFsbGNvbW1pdHMgImRvbmUiCiAgICBzZXQgdHJhdmluZGV4IDAKICAgIG5vdGJ1c3kgYWxsY29tbWl0cwogICAgZGlzcG5lYXJ0YWdzCn0KCiMgdXBkYXRlIHRoZSBkZXNjX3RhZ3MgYW5kIGFuY190YWdzIGFycmF5cyBmb3IgYSBuZXcgdGFnIGp1c3QgYWRkZWQKcHJvYyBhZGRlZHRhZyB7aWR9IHsKICAgIGdsb2JhbCBkZXNjX3RhZ3MgYW5jX3RhZ3MgYWxscGFyZW50cyBhbGxjaGlsZHJlbiBhbGxjb21taXRzCiAgICBnbG9iYWwgaWR0YWdzIHRhZ2lzZGVzYyBhbGxkdGFncwoKICAgIGlmIHshW2luZm8gZXhpc3RzIGRlc2NfdGFncygkaWQpXX0gcmV0dXJuCiAgICBzZXQgYWR0ICRkZXNjX3RhZ3MoJGlkKQogICAgZm9yZWFjaCB0ICRkZXNjX3RhZ3MoJGlkKSB7CglzZXQgYWR0IFtjb25jYXQgJGFkdCAkYWxsZHRhZ3MoJHQpXQogICAgfQogICAgc2V0IGFkdCBbbHNvcnQgLXVuaXF1ZSAkYWR0XQogICAgc2V0IGFsbGR0YWdzKCRpZCkgJGFkdAogICAgZm9yZWFjaCB0ICRhZHQgewoJc2V0IHRhZ2lzZGVzYygkaWQsJHQpIC0xCglzZXQgdGFnaXNkZXNjKCR0LCRpZCkgMQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBhbmNfdGFncygkaWQpXX0gewoJc2V0IHRvZG8gJGFuY190YWdzKCRpZCkKCXdoaWxlIHskdG9kbyBuZSB7fX0gewoJICAgIHNldCBkbyBbbGluZGV4ICR0b2RvIDBdCgkgICAgc2V0IHRvZG8gW2xyYW5nZSAkdG9kbyAxIGVuZF0KCSAgICBpZiB7W2luZm8gZXhpc3RzIHRhZ2lzZGVzYygkaWQsJGRvKV19IGNvbnRpbnVlCgkgICAgc2V0IHRhZ2lzZGVzYygkZG8sJGlkKSAtMQoJICAgIHNldCB0YWdpc2Rlc2MoJGlkLCRkbykgMQoJICAgIGlmIHtbaW5mbyBleGlzdHMgYW5jX3RhZ3MoJGRvKV19IHsKCQlzZXQgdG9kbyBbY29uY2F0ICR0b2RvICRhbmNfdGFncygkZG8pXQoJICAgIH0KCX0KICAgIH0KCiAgICBzZXQgbGFzdG9sZCAkZGVzY190YWdzKCRpZCkKICAgIHNldCBsYXN0bmV3IFtsaXN0ICRpZF0KICAgIHNldCBudXAgMAogICAgc2V0IG5jaCAwCiAgICBzZXQgdG9kbyAkYWxscGFyZW50cygkaWQpCiAgICB3aGlsZSB7JHRvZG8gbmUge319IHsKCXNldCBkbyBbbGluZGV4ICR0b2RvIDBdCglzZXQgdG9kbyBbbHJhbmdlICR0b2RvIDEgZW5kXQoJaWYgeyFbaW5mbyBleGlzdHMgZGVzY190YWdzKCRkbyldfSBjb250aW51ZQoJaWYgeyRkZXNjX3RhZ3MoJGRvKSBuZSAkbGFzdG9sZH0gewoJICAgIHNldCBsYXN0b2xkICRkZXNjX3RhZ3MoJGRvKQoJICAgIHNldCBsYXN0bmV3IFtjb21iaW5lX2R0YWdzICRsYXN0b2xkIFtsaXN0ICRpZF1dCgkgICAgaW5jciBuY2gKCX0KCWlmIHskbGFzdG9sZCBlcSAkbGFzdG5ld30gY29udGludWUKCXNldCBkZXNjX3RhZ3MoJGRvKSAkbGFzdG5ldwoJaW5jciBudXAKCWlmIHshW2luZm8gZXhpc3RzIGlkdGFncygkZG8pXX0gewoJICAgIHNldCB0b2RvIFtjb25jYXQgJHRvZG8gJGFsbHBhcmVudHMoJGRvKV0KCX0KICAgIH0KCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBhbmNfdGFncygkaWQpXX0gcmV0dXJuCiAgICBzZXQgbGFzdG9sZCAkYW5jX3RhZ3MoJGlkKQogICAgc2V0IGxhc3RuZXcgW2xpc3QgJGlkXQogICAgc2V0IG51cCAwCiAgICBzZXQgbmNoIDAKICAgIHNldCB0b2RvICRhbGxjaGlsZHJlbigkaWQpCiAgICB3aGlsZSB7JHRvZG8gbmUge319IHsKCXNldCBkbyBbbGluZGV4ICR0b2RvIDBdCglzZXQgdG9kbyBbbHJhbmdlICR0b2RvIDEgZW5kXQoJaWYgeyFbaW5mbyBleGlzdHMgYW5jX3RhZ3MoJGRvKV19IGNvbnRpbnVlCglpZiB7JGFuY190YWdzKCRkbykgbmUgJGxhc3RvbGR9IHsKCSAgICBzZXQgbGFzdG9sZCAkYW5jX3RhZ3MoJGRvKQoJICAgIHNldCBsYXN0bmV3IFtjb21iaW5lX2F0YWdzICRsYXN0b2xkIFtsaXN0ICRpZF1dCgkgICAgaW5jciBuY2gKCX0KCWlmIHskbGFzdG9sZCBlcSAkbGFzdG5ld30gY29udGludWUKCXNldCBhbmNfdGFncygkZG8pICRsYXN0bmV3CglpbmNyIG51cAoJaWYgeyFbaW5mbyBleGlzdHMgaWR0YWdzKCRkbyldfSB7CgkgICAgc2V0IHRvZG8gW2NvbmNhdCAkdG9kbyAkYWxsY2hpbGRyZW4oJGRvKV0KCX0KICAgIH0KfQoKIyB1cGRhdGUgdGhlIGRlc2NfaGVhZHMgYXJyYXkgZm9yIGEgbmV3IGhlYWQganVzdCBhZGRlZApwcm9jIGFkZGVkaGVhZCB7aGlkIGhlYWR9IHsKICAgIGdsb2JhbCBkZXNjX2hlYWRzIGFsbHBhcmVudHMgaGVhZGlkcyBpZGhlYWRzCgogICAgc2V0IGhlYWRpZHMoJGhlYWQpICRoaWQKICAgIGxhcHBlbmQgaWRoZWFkcygkaGlkKSAkaGVhZAoKICAgIHNldCB0b2RvIFtsaXN0ICRoaWRdCiAgICB3aGlsZSB7JHRvZG8gbmUge319IHsKCXNldCBkbyBbbGluZGV4ICR0b2RvIDBdCglzZXQgdG9kbyBbbHJhbmdlICR0b2RvIDEgZW5kXQoJaWYgeyFbaW5mbyBleGlzdHMgZGVzY19oZWFkcygkZG8pXSB8fAoJICAgIFtsc2VhcmNoIC1leGFjdCAkZGVzY19oZWFkcygkZG8pICRoZWFkXSA+PSAwfSBjb250aW51ZQoJc2V0IG9sZGhlYWRzICRkZXNjX2hlYWRzKCRkbykKCWxhcHBlbmQgZGVzY19oZWFkcygkZG8pICRoZWFkCglzZXQgaGVhZHMgJGRlc2NfaGVhZHMoJGRvKQoJd2hpbGUgezF9IHsKCSAgICBzZXQgcCAkYWxscGFyZW50cygkZG8pCgkgICAgaWYge1tsbGVuZ3RoICRwXSAhPSAxIHx8ICFbaW5mbyBleGlzdHMgZGVzY19oZWFkcygkcCldIHx8CgkJJGRlc2NfaGVhZHMoJHApIG5lICRvbGRoZWFkc30gYnJlYWsKCSAgICBzZXQgZG8gJHAKCSAgICBzZXQgZGVzY19oZWFkcygkZG8pICRoZWFkcwoJfQoJc2V0IHRvZG8gW2NvbmNhdCAkdG9kbyAkcF0KICAgIH0KfQoKIyB1cGRhdGUgdGhlIGRlc2NfaGVhZHMgYXJyYXkgZm9yIGEgaGVhZCBqdXN0IHJlbW92ZWQKcHJvYyByZW1vdmVkaGVhZCB7aGlkIGhlYWR9IHsKICAgIGdsb2JhbCBkZXNjX2hlYWRzIGFsbHBhcmVudHMgaGVhZGlkcyBpZGhlYWRzCgogICAgdW5zZXQgaGVhZGlkcygkaGVhZCkKICAgIGlmIHskaWRoZWFkcygkaGlkKSBlcSAkaGVhZH0gewoJdW5zZXQgaWRoZWFkcygkaGlkKQogICAgfSBlbHNlIHsKCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkaWRoZWFkcygkaGlkKSAkaGVhZF0KCWlmIHskaSA+PSAwfSB7CgkgICAgc2V0IGlkaGVhZHMoJGhpZCkgW2xyZXBsYWNlICRpZGhlYWRzKCRoaWQpICRpICRpXQoJfQogICAgfQoKICAgIHNldCB0b2RvIFtsaXN0ICRoaWRdCiAgICB3aGlsZSB7JHRvZG8gbmUge319IHsKCXNldCBkbyBbbGluZGV4ICR0b2RvIDBdCglzZXQgdG9kbyBbbHJhbmdlICR0b2RvIDEgZW5kXQoJaWYgeyFbaW5mbyBleGlzdHMgZGVzY19oZWFkcygkZG8pXX0gY29udGludWUKCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkZGVzY19oZWFkcygkZG8pICRoZWFkXQoJaWYgeyRpIDwgMH0gY29udGludWUKCXNldCBvbGRoZWFkcyAkZGVzY19oZWFkcygkZG8pCglzZXQgaGVhZHMgW2xyZXBsYWNlICRkZXNjX2hlYWRzKCRkbykgJGkgJGldCgl3aGlsZSB7MX0gewoJICAgIHNldCBkZXNjX2hlYWRzKCRkbykgJGhlYWRzCgkgICAgc2V0IHAgJGFsbHBhcmVudHMoJGRvKQoJICAgIGlmIHtbbGxlbmd0aCAkcF0gIT0gMSB8fCAhW2luZm8gZXhpc3RzIGRlc2NfaGVhZHMoJHApXSB8fAoJCSRkZXNjX2hlYWRzKCRwKSBuZSAkb2xkaGVhZHN9IGJyZWFrCgkgICAgc2V0IGRvICRwCgl9CglzZXQgdG9kbyBbY29uY2F0ICR0b2RvICRwXQogICAgfQp9CgojIHVwZGF0ZSB0aGluZ3MgZm9yIGEgaGVhZCBtb3ZlZCB0byBhIGNoaWxkIG9mIGl0cyBwcmV2aW91cyBsb2NhdGlvbgpwcm9jIG1vdmVkaGVhZCB7aWQgbmFtZX0gewogICAgZ2xvYmFsIGhlYWRpZHMgaWRoZWFkcwoKICAgIHNldCBvbGRpZCAkaGVhZGlkcygkbmFtZSkKICAgIHNldCBoZWFkaWRzKCRuYW1lKSAkaWQKICAgIGlmIHskaWRoZWFkcygkb2xkaWQpIGVxICRuYW1lfSB7Cgl1bnNldCBpZGhlYWRzKCRvbGRpZCkKICAgIH0gZWxzZSB7CglzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGlkaGVhZHMoJG9sZGlkKSAkbmFtZV0KCWlmIHskaSA+PSAwfSB7CgkgICAgc2V0IGlkaGVhZHMoJG9sZGlkKSBbbHJlcGxhY2UgJGlkaGVhZHMoJG9sZGlkKSAkaSAkaV0KCX0KICAgIH0KICAgIGxhcHBlbmQgaWRoZWFkcygkaWQpICRuYW1lCn0KCnByb2MgY2hhbmdlZHJlZnMge30gewogICAgZ2xvYmFsIGRlc2NfaGVhZHMgZGVzY190YWdzIGFuY190YWdzIGFsbGNvbW1pdHMgYWxsaWRzCiAgICBnbG9iYWwgYWxsY2hpbGRyZW4gYWxscGFyZW50cyBpZHRhZ3MgdHJhdmluZGV4CgogICAgaWYgeyFbaW5mbyBleGlzdHMgYWxsY29tbWl0c119IHJldHVybgogICAgY2F0Y2gge3Vuc2V0IGRlc2NfaGVhZHN9CiAgICBjYXRjaCB7dW5zZXQgZGVzY190YWdzfQogICAgY2F0Y2gge3Vuc2V0IGFuY190YWdzfQogICAgY2F0Y2gge3Vuc2V0IGFsbGR0YWdzfQogICAgY2F0Y2gge3Vuc2V0IHRhZ2lzZGVzY30KICAgIGZvcmVhY2ggaWQgJGFsbGlkcyB7Cglmb3J3YXJkX3Bhc3MgJGlkICRhbGxjaGlsZHJlbigkaWQpCiAgICB9CiAgICBpZiB7JGFsbGNvbW1pdHMgbmUgInJlYWRpbmcifSB7CglzZXQgdHJhdmluZGV4IFtsbGVuZ3RoICRhbGxpZHNdCglpZiB7JGFsbGNvbW1pdHMgbmUgInRyYXZlcnNpbmcifSB7CgkgICAgc2V0IGFsbGNvbW1pdHMgInRyYXZlcnNpbmciCgkgICAgYWZ0ZXIgaWRsZSByZXN0YXJ0YXRhZ3MKCX0KICAgIH0KfQoKcHJvYyByZXJlYWRyZWZzIHt9IHsKICAgIGdsb2JhbCBpZHRhZ3MgaWRoZWFkcyBpZG90aGVycmVmcyBtYWluaGVhZAoKICAgIHNldCByZWZpZHMgW2NvbmNhdCBbYXJyYXkgbmFtZXMgaWR0YWdzXSBcCgkJICAgIFthcnJheSBuYW1lcyBpZGhlYWRzXSBbYXJyYXkgbmFtZXMgaWRvdGhlcnJlZnNdXQogICAgZm9yZWFjaCBpZCAkcmVmaWRzIHsKCWlmIHshW2luZm8gZXhpc3RzIHJlZigkaWQpXX0gewoJICAgIHNldCByZWYoJGlkKSBbbGlzdHJlZnMgJGlkXQoJfQogICAgfQogICAgc2V0IG9sZG1haW5oZWFkICRtYWluaGVhZAogICAgcmVhZHJlZnMKICAgIGNoYW5nZWRyZWZzCiAgICBzZXQgcmVmaWRzIFtsc29ydCAtdW5pcXVlIFtjb25jYXQgJHJlZmlkcyBbYXJyYXkgbmFtZXMgaWR0YWdzXSBcCgkJCVthcnJheSBuYW1lcyBpZGhlYWRzXSBbYXJyYXkgbmFtZXMgaWRvdGhlcnJlZnNdXV0KICAgIGZvcmVhY2ggaWQgJHJlZmlkcyB7CglzZXQgdiBbbGlzdHJlZnMgJGlkXQoJaWYgeyFbaW5mbyBleGlzdHMgcmVmKCRpZCldIHx8ICRyZWYoJGlkKSAhPSAkdiB8fAoJICAgICgkaWQgZXEgJG9sZG1haW5oZWFkICYmICRpZCBuZSAkbWFpbmhlYWQpIHx8CgkgICAgKCRpZCBlcSAkbWFpbmhlYWQgJiYgJGlkIG5lICRvbGRtYWluaGVhZCl9IHsKCSAgICByZWRyYXd0YWdzICRpZAoJfQogICAgfQp9Cgpwcm9jIGxpc3RyZWZzIHtpZH0gewogICAgZ2xvYmFsIGlkdGFncyBpZGhlYWRzIGlkb3RoZXJyZWZzCgogICAgc2V0IHgge30KICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CglzZXQgeCAkaWR0YWdzKCRpZCkKICAgIH0KICAgIHNldCB5IHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkaGVhZHMoJGlkKV19IHsKCXNldCB5ICRpZGhlYWRzKCRpZCkKICAgIH0KICAgIHNldCB6IHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkb3RoZXJyZWZzKCRpZCldfSB7CglzZXQgeiAkaWRvdGhlcnJlZnMoJGlkKQogICAgfQogICAgcmV0dXJuIFtsaXN0ICR4ICR5ICR6XQp9Cgpwcm9jIHNob3d0YWcge3RhZyBpc25ld30gewogICAgZ2xvYmFsIGN0ZXh0IHRhZ2NvbnRlbnRzIHRhZ2lkcyBsaW5rbnVtCgogICAgaWYgeyRpc25ld30gewoJYWRkdG9oaXN0b3J5IFtsaXN0IHNob3d0YWcgJHRhZyAwXQogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgY2xlYXJfY3RleHQKICAgIHNldCBsaW5rbnVtIDAKICAgIGlmIHtbaW5mbyBleGlzdHMgdGFnY29udGVudHMoJHRhZyldfSB7CglzZXQgdGV4dCAkdGFnY29udGVudHMoJHRhZykKICAgIH0gZWxzZSB7CglzZXQgdGV4dCAiVGFnOiAkdGFnXG5JZDogICR0YWdpZHMoJHRhZykiCiAgICB9CiAgICBhcHBlbmR3aXRobGlua3MgJHRleHQge30KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgaW5pdF9mbGlzdCB7fQp9Cgpwcm9jIGRvcXVpdCB7fSB7CiAgICBnbG9iYWwgc3RvcHBlZAogICAgc2V0IHN0b3BwZWQgMTAwCiAgICBkZXN0cm95IC4KfQoKcHJvYyBkb3ByZWZzIHt9IHsKICAgIGdsb2JhbCBtYXh3aWR0aCBtYXhncmFwaHBjdCBkaWZmb3B0cwogICAgZ2xvYmFsIG9sZHByZWZzIHByZWZzdG9wIHNob3duZWFydGFncwogICAgZ2xvYmFsIGJnY29sb3IgZmdjb2xvciBjdGV4dCBkaWZmY29sb3JzCgogICAgc2V0IHRvcCAuZ2l0a3ByZWZzCiAgICBzZXQgcHJlZnN0b3AgJHRvcAogICAgaWYge1t3aW5mbyBleGlzdHMgJHRvcF19IHsKCXJhaXNlICR0b3AKCXJldHVybgogICAgfQogICAgZm9yZWFjaCB2IHttYXh3aWR0aCBtYXhncmFwaHBjdCBkaWZmb3B0cyBzaG93bmVhcnRhZ3N9IHsKCXNldCBvbGRwcmVmcygkdikgW3NldCAkdl0KICAgIH0KICAgIHRvcGxldmVsICR0b3AKICAgIHdtIHRpdGxlICR0b3AgIkdpdGsgcHJlZmVyZW5jZXMiCiAgICBsYWJlbCAkdG9wLmxkaXNwIC10ZXh0ICJDb21taXQgbGlzdCBkaXNwbGF5IG9wdGlvbnMiCiAgICBncmlkICR0b3AubGRpc3AgLSAtc3RpY2t5IHcgLXBhZHkgMTAKICAgIGxhYmVsICR0b3Auc3BhY2VyIC10ZXh0ICIgIgogICAgbGFiZWwgJHRvcC5tYXh3aWR0aGwgLXRleHQgIk1heGltdW0gZ3JhcGggd2lkdGggKGxpbmVzKSIgXAoJLWZvbnQgb3B0aW9uZm9udAogICAgc3BpbmJveCAkdG9wLm1heHdpZHRoIC1mcm9tIDAgLXRvIDEwMCAtd2lkdGggNCAtdGV4dHZhcmlhYmxlIG1heHdpZHRoCiAgICBncmlkICR0b3Auc3BhY2VyICR0b3AubWF4d2lkdGhsICR0b3AubWF4d2lkdGggLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLm1heHBjdGwgLXRleHQgIk1heGltdW0gZ3JhcGggd2lkdGggKCUgb2YgcGFuZSkiIFwKCS1mb250IG9wdGlvbmZvbnQKICAgIHNwaW5ib3ggJHRvcC5tYXhwY3QgLWZyb20gMSAtdG8gMTAwIC13aWR0aCA0IC10ZXh0dmFyaWFibGUgbWF4Z3JhcGhwY3QKICAgIGdyaWQgeCAkdG9wLm1heHBjdGwgJHRvcC5tYXhwY3QgLXN0aWNreSB3CgogICAgbGFiZWwgJHRvcC5kZGlzcCAtdGV4dCAiRGlmZiBkaXNwbGF5IG9wdGlvbnMiCiAgICBncmlkICR0b3AuZGRpc3AgLSAtc3RpY2t5IHcgLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuZGlmZm9wdGwgLXRleHQgIk9wdGlvbnMgZm9yIGRpZmYgcHJvZ3JhbSIgXAoJLWZvbnQgb3B0aW9uZm9udAogICAgZW50cnkgJHRvcC5kaWZmb3B0IC13aWR0aCAyMCAtdGV4dHZhcmlhYmxlIGRpZmZvcHRzCiAgICBncmlkIHggJHRvcC5kaWZmb3B0bCAkdG9wLmRpZmZvcHQgLXN0aWNreSB3CiAgICBmcmFtZSAkdG9wLm50YWcKICAgIGxhYmVsICR0b3AubnRhZy5sIC10ZXh0ICJEaXNwbGF5IG5lYXJieSB0YWdzIiAtZm9udCBvcHRpb25mb250CiAgICBjaGVja2J1dHRvbiAkdG9wLm50YWcuYiAtdmFyaWFibGUgc2hvd25lYXJ0YWdzCiAgICBwYWNrICR0b3AubnRhZy5iICR0b3AubnRhZy5sIC1zaWRlIGxlZnQKICAgIGdyaWQgeCAkdG9wLm50YWcgLXN0aWNreSB3CgogICAgbGFiZWwgJHRvcC5jZGlzcCAtdGV4dCAiQ29sb3JzOiBwcmVzcyB0byBjaG9vc2UiCiAgICBncmlkICR0b3AuY2Rpc3AgLSAtc3RpY2t5IHcgLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuYmcgLXBhZHggNDAgLXJlbGllZiBzdW5rIC1iYWNrZ3JvdW5kICRiZ2NvbG9yCiAgICBidXR0b24gJHRvcC5iZ2J1dCAtdGV4dCAiQmFja2dyb3VuZCIgLWZvbnQgb3B0aW9uZm9udCBcCgktY29tbWFuZCBbbGlzdCBjaG9vc2Vjb2xvciBiZ2NvbG9yIDAgJHRvcC5iZyBiYWNrZ3JvdW5kIHNldGJnXQogICAgZ3JpZCB4ICR0b3AuYmdidXQgJHRvcC5iZyAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AuZmcgLXBhZHggNDAgLXJlbGllZiBzdW5rIC1iYWNrZ3JvdW5kICRmZ2NvbG9yCiAgICBidXR0b24gJHRvcC5mZ2J1dCAtdGV4dCAiRm9yZWdyb3VuZCIgLWZvbnQgb3B0aW9uZm9udCBcCgktY29tbWFuZCBbbGlzdCBjaG9vc2Vjb2xvciBmZ2NvbG9yIDAgJHRvcC5mZyBmb3JlZ3JvdW5kIHNldGZnXQogICAgZ3JpZCB4ICR0b3AuZmdidXQgJHRvcC5mZyAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AuZGlmZm9sZCAtcGFkeCA0MCAtcmVsaWVmIHN1bmsgLWJhY2tncm91bmQgW2xpbmRleCAkZGlmZmNvbG9ycyAwXQogICAgYnV0dG9uICR0b3AuZGlmZm9sZGJ1dCAtdGV4dCAiRGlmZjogb2xkIGxpbmVzIiAtZm9udCBvcHRpb25mb250IFwKCS1jb21tYW5kIFtsaXN0IGNob29zZWNvbG9yIGRpZmZjb2xvcnMgMCAkdG9wLmRpZmZvbGQgImRpZmYgb2xkIGxpbmVzIiBcCgkJICAgICAgW2xpc3QgJGN0ZXh0IHRhZyBjb25mIGQwIC1mb3JlZ3JvdW5kXV0KICAgIGdyaWQgeCAkdG9wLmRpZmZvbGRidXQgJHRvcC5kaWZmb2xkIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC5kaWZmbmV3IC1wYWR4IDQwIC1yZWxpZWYgc3VuayAtYmFja2dyb3VuZCBbbGluZGV4ICRkaWZmY29sb3JzIDFdCiAgICBidXR0b24gJHRvcC5kaWZmbmV3YnV0IC10ZXh0ICJEaWZmOiBuZXcgbGluZXMiIC1mb250IG9wdGlvbmZvbnQgXAoJLWNvbW1hbmQgW2xpc3QgY2hvb3NlY29sb3IgZGlmZmNvbG9ycyAxICR0b3AuZGlmZm5ldyAiZGlmZiBuZXcgbGluZXMiIFwKCQkgICAgICBbbGlzdCAkY3RleHQgdGFnIGNvbmYgZDEgLWZvcmVncm91bmRdXQogICAgZ3JpZCB4ICR0b3AuZGlmZm5ld2J1dCAkdG9wLmRpZmZuZXcgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLmh1bmtzZXAgLXBhZHggNDAgLXJlbGllZiBzdW5rIC1iYWNrZ3JvdW5kIFtsaW5kZXggJGRpZmZjb2xvcnMgMl0KICAgIGJ1dHRvbiAkdG9wLmh1bmtzZXBidXQgLXRleHQgIkRpZmY6IGh1bmsgaGVhZGVyIiAtZm9udCBvcHRpb25mb250IFwKCS1jb21tYW5kIFtsaXN0IGNob29zZWNvbG9yIGRpZmZjb2xvcnMgMiAkdG9wLmh1bmtzZXAgXAoJCSAgICAgICJkaWZmIGh1bmsgaGVhZGVyIiBcCgkJICAgICAgW2xpc3QgJGN0ZXh0IHRhZyBjb25mIGh1bmtzZXAgLWZvcmVncm91bmRdXQogICAgZ3JpZCB4ICR0b3AuaHVua3NlcGJ1dCAkdG9wLmh1bmtzZXAgLXN0aWNreSB3CgogICAgZnJhbWUgJHRvcC5idXRzCiAgICBidXR0b24gJHRvcC5idXRzLm9rIC10ZXh0ICJPSyIgLWNvbW1hbmQgcHJlZnNvawogICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgcHJlZnNjYW4KICAgIGdyaWQgJHRvcC5idXRzLm9rICR0b3AuYnV0cy5jYW4KICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAwIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMSAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCAkdG9wLmJ1dHMgLSAtIC1wYWR5IDEwIC1zdGlja3kgZXcKfQoKcHJvYyBjaG9vc2Vjb2xvciB7diB2aSB3IHggY21kfSB7CiAgICBnbG9iYWwgJHYKCiAgICBzZXQgYyBbdGtfY2hvb3NlQ29sb3IgLWluaXRpYWxjb2xvciBbbGluZGV4IFtzZXQgJHZdICR2aV0gXAoJICAgICAgIC10aXRsZSAiR2l0azogY2hvb3NlIGNvbG9yIGZvciAkeCJdCiAgICBpZiB7JGMgZXEge319IHJldHVybgogICAgJHcgY29uZiAtYmFja2dyb3VuZCAkYwogICAgbHNldCAkdiAkdmkgJGMKICAgIGV2YWwgJGNtZCAkYwp9Cgpwcm9jIHNldGJnIHtjfSB7CiAgICBnbG9iYWwgYmdsaXN0CgogICAgZm9yZWFjaCB3ICRiZ2xpc3QgewoJJHcgY29uZiAtYmFja2dyb3VuZCAkYwogICAgfQp9Cgpwcm9jIHNldGZnIHtjfSB7CiAgICBnbG9iYWwgZmdsaXN0IGNhbnYKCiAgICBmb3JlYWNoIHcgJGZnbGlzdCB7CgkkdyBjb25mIC1mb3JlZ3JvdW5kICRjCiAgICB9CiAgICBhbGxjYW52cyBpdGVtY29uZiB0ZXh0IC1maWxsICRjCiAgICAkY2FudiBpdGVtY29uZiBjaXJjbGUgLW91dGxpbmUgJGMKfQoKcHJvYyBwcmVmc2NhbiB7fSB7CiAgICBnbG9iYWwgbWF4d2lkdGggbWF4Z3JhcGhwY3QgZGlmZm9wdHMKICAgIGdsb2JhbCBvbGRwcmVmcyBwcmVmc3RvcCBzaG93bmVhcnRhZ3MKCiAgICBmb3JlYWNoIHYge21heHdpZHRoIG1heGdyYXBocGN0IGRpZmZvcHRzIHNob3duZWFydGFnc30gewoJc2V0ICR2ICRvbGRwcmVmcygkdikKICAgIH0KICAgIGNhdGNoIHtkZXN0cm95ICRwcmVmc3RvcH0KICAgIHVuc2V0IHByZWZzdG9wCn0KCnByb2MgcHJlZnNvayB7fSB7CiAgICBnbG9iYWwgbWF4d2lkdGggbWF4Z3JhcGhwY3QKICAgIGdsb2JhbCBvbGRwcmVmcyBwcmVmc3RvcCBzaG93bmVhcnRhZ3MKCiAgICBjYXRjaCB7ZGVzdHJveSAkcHJlZnN0b3B9CiAgICB1bnNldCBwcmVmc3RvcAogICAgaWYgeyRtYXh3aWR0aCAhPSAkb2xkcHJlZnMobWF4d2lkdGgpCgl8fCAkbWF4Z3JhcGhwY3QgIT0gJG9sZHByZWZzKG1heGdyYXBocGN0KX0gewoJcmVkaXNwbGF5CiAgICB9IGVsc2VpZiB7JHNob3duZWFydGFncyAhPSAkb2xkcHJlZnMoc2hvd25lYXJ0YWdzKX0gewoJcmVzZWxlY3RsaW5lCiAgICB9Cn0KCnByb2MgZm9ybWF0ZGF0ZSB7ZH0gewogICAgcmV0dXJuIFtjbG9jayBmb3JtYXQgJGQgLWZvcm1hdCAiJVktJW0tJWQgJUg6JU06JVMiXQp9CgojIFRoaXMgbGlzdCBvZiBlbmNvZGluZyBuYW1lcyBhbmQgYWxpYXNlcyBpcyBkaXN0aWxsZWQgZnJvbQojIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvY2hhcmFjdGVyLXNldHMuCiMgTm90IGFsbCBvZiB0aGVtIGFyZSBzdXBwb3J0ZWQgYnkgVGNsLgpzZXQgZW5jb2RpbmdfYWxpYXNlcyB7CiAgICB7IEFOU0lfWDMuNC0xOTY4IGlzby1pci02IEFOU0lfWDMuNC0xOTg2IElTT182NDYuaXJ2OjE5OTEgQVNDSUkKICAgICAgSVNPNjQ2LVVTIFVTLUFTQ0lJIHVzIElCTTM2NyBjcDM2NyBjc0FTQ0lJIH0KICAgIHsgSVNPLTEwNjQ2LVVURi0xIGNzSVNPMTA2NDZVVEYxIH0KICAgIHsgSVNPXzY0Ni5iYXNpYzoxOTgzIHJlZiBjc0lTTzY0NmJhc2ljMTk4MyB9CiAgICB7IElOVkFSSUFOVCBjc0lOVkFSSUFOVCB9CiAgICB7IElTT182NDYuaXJ2OjE5ODMgaXNvLWlyLTIgaXJ2IGNzSVNPMkludGxSZWZWZXJzaW9uIH0KICAgIHsgQlNfNDczMCBpc28taXItNCBJU082NDYtR0IgZ2IgdWsgY3NJU080VW5pdGVkS2luZ2RvbSB9CiAgICB7IE5BVFMtU0VGSSBpc28taXItOC0xIGNzTkFUU1NFRkkgfQogICAgeyBOQVRTLVNFRkktQUREIGlzby1pci04LTIgY3NOQVRTU0VGSUFERCB9CiAgICB7IE5BVFMtREFOTyBpc28taXItOS0xIGNzTkFUU0RBTk8gfQogICAgeyBOQVRTLURBTk8tQUREIGlzby1pci05LTIgY3NOQVRTREFOT0FERCB9CiAgICB7IFNFTl84NTAyMDBfQiBpc28taXItMTAgRkkgSVNPNjQ2LUZJIElTTzY0Ni1TRSBzZSBjc0lTTzEwU3dlZGlzaCB9CiAgICB7IFNFTl84NTAyMDBfQyBpc28taXItMTEgSVNPNjQ2LVNFMiBzZTIgY3NJU08xMVN3ZWRpc2hGb3JOYW1lcyB9CiAgICB7IEtTX0NfNTYwMS0xOTg3IGlzby1pci0xNDkgS1NfQ181NjAxLTE5ODkgS1NDXzU2MDEga29yZWFuIGNzS1NDNTYwMTE5ODcgfQogICAgeyBJU08tMjAyMi1LUiBjc0lTTzIwMjJLUiB9CiAgICB7IEVVQy1LUiBjc0VVQ0tSIH0KICAgIHsgSVNPLTIwMjItSlAgY3NJU08yMDIySlAgfQogICAgeyBJU08tMjAyMi1KUC0yIGNzSVNPMjAyMkpQMiB9CiAgICB7IEpJU19DNjIyMC0xOTY5LWpwIEpJU19DNjIyMC0xOTY5IGlzby1pci0xMyBrYXRha2FuYSB4MDIwMS03CiAgICAgIGNzSVNPMTNKSVNDNjIyMGpwIH0KICAgIHsgSklTX0M2MjIwLTE5Njktcm8gaXNvLWlyLTE0IGpwIElTTzY0Ni1KUCBjc0lTTzE0SklTQzYyMjBybyB9CiAgICB7IElUIGlzby1pci0xNSBJU082NDYtSVQgY3NJU08xNUl0YWxpYW4gfQogICAgeyBQVCBpc28taXItMTYgSVNPNjQ2LVBUIGNzSVNPMTZQb3J0dWd1ZXNlIH0KICAgIHsgRVMgaXNvLWlyLTE3IElTTzY0Ni1FUyBjc0lTTzE3U3BhbmlzaCB9CiAgICB7IGdyZWVrNy1vbGQgaXNvLWlyLTE4IGNzSVNPMThHcmVlazdPbGQgfQogICAgeyBsYXRpbi1ncmVlayBpc28taXItMTkgY3NJU08xOUxhdGluR3JlZWsgfQogICAgeyBESU5fNjYwMDMgaXNvLWlyLTIxIGRlIElTTzY0Ni1ERSBjc0lTTzIxR2VybWFuIH0KICAgIHsgTkZfWl82Mi0wMTBfKDE5NzMpIGlzby1pci0yNSBJU082NDYtRlIxIGNzSVNPMjVGcmVuY2ggfQogICAgeyBMYXRpbi1ncmVlay0xIGlzby1pci0yNyBjc0lTTzI3TGF0aW5HcmVlazEgfQogICAgeyBJU09fNTQyNyBpc28taXItMzcgY3NJU081NDI3Q3lyaWxsaWMgfQogICAgeyBKSVNfQzYyMjYtMTk3OCBpc28taXItNDIgY3NJU080MkpJU0M2MjI2MTk3OCB9CiAgICB7IEJTX3ZpZXdkYXRhIGlzby1pci00NyBjc0lTTzQ3QlNWaWV3ZGF0YSB9CiAgICB7IElOSVMgaXNvLWlyLTQ5IGNzSVNPNDlJTklTIH0KICAgIHsgSU5JUy04IGlzby1pci01MCBjc0lTTzUwSU5JUzggfQogICAgeyBJTklTLWN5cmlsbGljIGlzby1pci01MSBjc0lTTzUxSU5JU0N5cmlsbGljIH0KICAgIHsgSVNPXzU0Mjc6MTk4MSBpc28taXItNTQgSVNPNTQyN0N5cmlsbGljMTk4MSB9CiAgICB7IElTT181NDI4OjE5ODAgaXNvLWlyLTU1IGNzSVNPNTQyOEdyZWVrIH0KICAgIHsgR0JfMTk4OC04MCBpc28taXItNTcgY24gSVNPNjQ2LUNOIGNzSVNPNTdHQjE5ODggfQogICAgeyBHQl8yMzEyLTgwIGlzby1pci01OCBjaGluZXNlIGNzSVNPNThHQjIzMTI4MCB9CiAgICB7IE5TXzQ1NTEtMSBpc28taXItNjAgSVNPNjQ2LU5PIG5vIGNzSVNPNjBEYW5pc2hOb3J3ZWdpYW4KICAgICAgY3NJU082ME5vcndlZ2lhbjEgfQogICAgeyBOU180NTUxLTIgSVNPNjQ2LU5PMiBpc28taXItNjEgbm8yIGNzSVNPNjFOb3J3ZWdpYW4yIH0KICAgIHsgTkZfWl82Mi0wMTAgaXNvLWlyLTY5IElTTzY0Ni1GUiBmciBjc0lTTzY5RnJlbmNoIH0KICAgIHsgdmlkZW90ZXgtc3VwcGwgaXNvLWlyLTcwIGNzSVNPNzBWaWRlb3RleFN1cHAxIH0KICAgIHsgUFQyIGlzby1pci04NCBJU082NDYtUFQyIGNzSVNPODRQb3J0dWd1ZXNlMiB9CiAgICB7IEVTMiBpc28taXItODUgSVNPNjQ2LUVTMiBjc0lTTzg1U3BhbmlzaDIgfQogICAgeyBNU1pfNzc5NS4zIGlzby1pci04NiBJU082NDYtSFUgaHUgY3NJU084Nkh1bmdhcmlhbiB9CiAgICB7IEpJU19DNjIyNi0xOTgzIGlzby1pci04NyB4MDIwOCBKSVNfWDAyMDgtMTk4MyBjc0lTTzg3SklTWDAyMDggfQogICAgeyBncmVlazcgaXNvLWlyLTg4IGNzSVNPODhHcmVlazcgfQogICAgeyBBU01PXzQ0OSBJU09fOTAzNiBhcmFiaWM3IGlzby1pci04OSBjc0lTTzg5QVNNTzQ0OSB9CiAgICB7IGlzby1pci05MCBjc0lTTzkwIH0KICAgIHsgSklTX0M2MjI5LTE5ODQtYSBpc28taXItOTEganAtb2NyLWEgY3NJU085MUpJU0M2MjI5MTk4NGEgfQogICAgeyBKSVNfQzYyMjktMTk4NC1iIGlzby1pci05MiBJU082NDYtSlAtT0NSLUIganAtb2NyLWIKICAgICAgY3NJU085MkpJU0M2Mjk5MTk4NGIgfQogICAgeyBKSVNfQzYyMjktMTk4NC1iLWFkZCBpc28taXItOTMganAtb2NyLWItYWRkIGNzSVNPOTNKSVM2MjI5MTk4NGJhZGQgfQogICAgeyBKSVNfQzYyMjktMTk4NC1oYW5kIGlzby1pci05NCBqcC1vY3ItaGFuZCBjc0lTTzk0SklTNjIyOTE5ODRoYW5kIH0KICAgIHsgSklTX0M2MjI5LTE5ODQtaGFuZC1hZGQgaXNvLWlyLTk1IGpwLW9jci1oYW5kLWFkZAogICAgICBjc0lTTzk1SklTNjIyOTE5ODRoYW5kYWRkIH0KICAgIHsgSklTX0M2MjI5LTE5ODQta2FuYSBpc28taXItOTYgY3NJU085NkpJU0M2MjI5MTk4NGthbmEgfQogICAgeyBJU09fMjAzMy0xOTgzIGlzby1pci05OCBlMTNiIGNzSVNPMjAzMyB9CiAgICB7IEFOU0lfWDMuMTEwLTE5ODMgaXNvLWlyLTk5IENTQV9UNTAwLTE5ODMgTkFQTFBTIGNzSVNPOTlOQVBMUFMgfQogICAgeyBJU09fODg1OS0xOjE5ODcgaXNvLWlyLTEwMCBJU09fODg1OS0xIElTTy04ODU5LTEgbGF0aW4xIGwxIElCTTgxOQogICAgICBDUDgxOSBjc0lTT0xhdGluMSB9CiAgICB7IElTT184ODU5LTI6MTk4NyBpc28taXItMTAxIElTT184ODU5LTIgSVNPLTg4NTktMiBsYXRpbjIgbDIgY3NJU09MYXRpbjIgfQogICAgeyBULjYxLTdiaXQgaXNvLWlyLTEwMiBjc0lTTzEwMlQ2MTdiaXQgfQogICAgeyBULjYxLThiaXQgVC42MSBpc28taXItMTAzIGNzSVNPMTAzVDYxOGJpdCB9CiAgICB7IElTT184ODU5LTM6MTk4OCBpc28taXItMTA5IElTT184ODU5LTMgSVNPLTg4NTktMyBsYXRpbjMgbDMgY3NJU09MYXRpbjMgfQogICAgeyBJU09fODg1OS00OjE5ODggaXNvLWlyLTExMCBJU09fODg1OS00IElTTy04ODU5LTQgbGF0aW40IGw0IGNzSVNPTGF0aW40IH0KICAgIHsgRUNNQS1jeXJpbGxpYyBpc28taXItMTExIEtPSTgtRSBjc0lTTzExMUVDTUFDeXJpbGxpYyB9CiAgICB7IENTQV9aMjQzLjQtMTk4NS0xIGlzby1pci0xMjEgSVNPNjQ2LUNBIGNzYTctMSBjYSBjc0lTTzEyMUNhbmFkaWFuMSB9CiAgICB7IENTQV9aMjQzLjQtMTk4NS0yIGlzby1pci0xMjIgSVNPNjQ2LUNBMiBjc2E3LTIgY3NJU08xMjJDYW5hZGlhbjIgfQogICAgeyBDU0FfWjI0My40LTE5ODUtZ3IgaXNvLWlyLTEyMyBjc0lTTzEyM0NTQVoyNDM0MTk4NWdyIH0KICAgIHsgSVNPXzg4NTktNjoxOTg3IGlzby1pci0xMjcgSVNPXzg4NTktNiBJU08tODg1OS02IEVDTUEtMTE0IEFTTU8tNzA4CiAgICAgIGFyYWJpYyBjc0lTT0xhdGluQXJhYmljIH0KICAgIHsgSVNPXzg4NTktNi1FIGNzSVNPODg1OTZFIElTTy04ODU5LTYtRSB9CiAgICB7IElTT184ODU5LTYtSSBjc0lTTzg4NTk2SSBJU08tODg1OS02LUkgfQogICAgeyBJU09fODg1OS03OjE5ODcgaXNvLWlyLTEyNiBJU09fODg1OS03IElTTy04ODU5LTcgRUxPVF85MjggRUNNQS0xMTgKICAgICAgZ3JlZWsgZ3JlZWs4IGNzSVNPTGF0aW5HcmVlayB9CiAgICB7IFQuMTAxLUcyIGlzby1pci0xMjggY3NJU08xMjhUMTAxRzIgfQogICAgeyBJU09fODg1OS04OjE5ODggaXNvLWlyLTEzOCBJU09fODg1OS04IElTTy04ODU5LTggaGVicmV3CiAgICAgIGNzSVNPTGF0aW5IZWJyZXcgfQogICAgeyBJU09fODg1OS04LUUgY3NJU084ODU5OEUgSVNPLTg4NTktOC1FIH0KICAgIHsgSVNPXzg4NTktOC1JIGNzSVNPODg1OThJIElTTy04ODU5LTgtSSB9CiAgICB7IENTTl8zNjkxMDMgaXNvLWlyLTEzOSBjc0lTTzEzOUNTTjM2OTEwMyB9CiAgICB7IEpVU19JLkIxLjAwMiBpc28taXItMTQxIElTTzY0Ni1ZVSBqcyB5dSBjc0lTTzE0MUpVU0lCMTAwMiB9CiAgICB7IElTT182OTM3LTItYWRkIGlzby1pci0xNDIgY3NJU09UZXh0Q29tbSB9CiAgICB7IElFQ19QMjctMSBpc28taXItMTQzIGNzSVNPMTQzSUVDUDI3MSB9CiAgICB7IElTT184ODU5LTU6MTk4OCBpc28taXItMTQ0IElTT184ODU5LTUgSVNPLTg4NTktNSBjeXJpbGxpYwogICAgICBjc0lTT0xhdGluQ3lyaWxsaWMgfQogICAgeyBKVVNfSS5CMS4wMDMtc2VyYiBpc28taXItMTQ2IHNlcmJpYW4gY3NJU08xNDZTZXJiaWFuIH0KICAgIHsgSlVTX0kuQjEuMDAzLW1hYyBtYWNlZG9uaWFuIGlzby1pci0xNDcgY3NJU08xNDdNYWNlZG9uaWFuIH0KICAgIHsgSVNPXzg4NTktOToxOTg5IGlzby1pci0xNDggSVNPXzg4NTktOSBJU08tODg1OS05IGxhdGluNSBsNSBjc0lTT0xhdGluNSB9CiAgICB7IGdyZWVrLWNjaXR0IGlzby1pci0xNTAgY3NJU08xNTAgY3NJU08xNTBHcmVla0NDSVRUIH0KICAgIHsgTkNfTkMwMC0xMDo4MSBjdWJhIGlzby1pci0xNTEgSVNPNjQ2LUNVIGNzSVNPMTUxQ3ViYSB9CiAgICB7IElTT182OTM3LTItMjUgaXNvLWlyLTE1MiBjc0lTTzY5MzdBZGQgfQogICAgeyBHT1NUXzE5NzY4LTc0IFNUX1NFVl8zNTgtODggaXNvLWlyLTE1MyBjc0lTTzE1M0dPU1QxOTc2ODc0IH0KICAgIHsgSVNPXzg4NTktc3VwcCBpc28taXItMTU0IGxhdGluMS0yLTUgY3NJU084ODU5U3VwcCB9CiAgICB7IElTT18xMDM2Ny1ib3ggaXNvLWlyLTE1NSBjc0lTTzEwMzY3Qm94IH0KICAgIHsgSVNPLTg4NTktMTAgaXNvLWlyLTE1NyBsNiBJU09fODg1OS0xMDoxOTkyIGNzSVNPTGF0aW42IGxhdGluNiB9CiAgICB7IGxhdGluLWxhcCBsYXAgaXNvLWlyLTE1OCBjc0lTTzE1OExhcCB9CiAgICB7IEpJU19YMDIxMi0xOTkwIHgwMjEyIGlzby1pci0xNTkgY3NJU08xNTlKSVNYMDIxMjE5OTAgfQogICAgeyBEU18yMDg5IERTMjA4OSBJU082NDYtREsgZGsgY3NJU082NDZEYW5pc2ggfQogICAgeyB1cy1kayBjc1VTREsgfQogICAgeyBkay11cyBjc0RLVVMgfQogICAgeyBKSVNfWDAyMDEgWDAyMDEgY3NIYWxmV2lkdGhLYXRha2FuYSB9CiAgICB7IEtTQzU2MzYgSVNPNjQ2LUtSIGNzS1NDNTYzNiB9CiAgICB7IElTTy0xMDY0Ni1VQ1MtMiBjc1VuaWNvZGUgfQogICAgeyBJU08tMTA2NDYtVUNTLTQgY3NVQ1M0IH0KICAgIHsgREVDLU1DUyBkZWMgY3NERUNNQ1MgfQogICAgeyBocC1yb21hbjggcm9tYW44IHI4IGNzSFBSb21hbjggfQogICAgeyBtYWNpbnRvc2ggbWFjIGNzTWFjaW50b3NoIH0KICAgIHsgSUJNMDM3IGNwMDM3IGViY2RpYy1jcC11cyBlYmNkaWMtY3AtY2EgZWJjZGljLWNwLXd0IGViY2RpYy1jcC1ubAogICAgICBjc0lCTTAzNyB9CiAgICB7IElCTTAzOCBFQkNESUMtSU5UIGNwMDM4IGNzSUJNMDM4IH0KICAgIHsgSUJNMjczIENQMjczIGNzSUJNMjczIH0KICAgIHsgSUJNMjc0IEVCQ0RJQy1CRSBDUDI3NCBjc0lCTTI3NCB9CiAgICB7IElCTTI3NSBFQkNESUMtQlIgY3AyNzUgY3NJQk0yNzUgfQogICAgeyBJQk0yNzcgRUJDRElDLUNQLURLIEVCQ0RJQy1DUC1OTyBjc0lCTTI3NyB9CiAgICB7IElCTTI3OCBDUDI3OCBlYmNkaWMtY3AtZmkgZWJjZGljLWNwLXNlIGNzSUJNMjc4IH0KICAgIHsgSUJNMjgwIENQMjgwIGViY2RpYy1jcC1pdCBjc0lCTTI4MCB9CiAgICB7IElCTTI4MSBFQkNESUMtSlAtRSBjcDI4MSBjc0lCTTI4MSB9CiAgICB7IElCTTI4NCBDUDI4NCBlYmNkaWMtY3AtZXMgY3NJQk0yODQgfQogICAgeyBJQk0yODUgQ1AyODUgZWJjZGljLWNwLWdiIGNzSUJNMjg1IH0KICAgIHsgSUJNMjkwIGNwMjkwIEVCQ0RJQy1KUC1rYW5hIGNzSUJNMjkwIH0KICAgIHsgSUJNMjk3IGNwMjk3IGViY2RpYy1jcC1mciBjc0lCTTI5NyB9CiAgICB7IElCTTQyMCBjcDQyMCBlYmNkaWMtY3AtYXIxIGNzSUJNNDIwIH0KICAgIHsgSUJNNDIzIGNwNDIzIGViY2RpYy1jcC1nciBjc0lCTTQyMyB9CiAgICB7IElCTTQyNCBjcDQyNCBlYmNkaWMtY3AtaGUgY3NJQk00MjQgfQogICAgeyBJQk00MzcgY3A0MzcgNDM3IGNzUEM4Q29kZVBhZ2U0MzcgfQogICAgeyBJQk01MDAgQ1A1MDAgZWJjZGljLWNwLWJlIGViY2RpYy1jcC1jaCBjc0lCTTUwMCB9CiAgICB7IElCTTc3NSBjcDc3NSBjc1BDNzc1QmFsdGljIH0KICAgIHsgSUJNODUwIGNwODUwIDg1MCBjc1BDODUwTXVsdGlsaW5ndWFsIH0KICAgIHsgSUJNODUxIGNwODUxIDg1MSBjc0lCTTg1MSB9CiAgICB7IElCTTg1MiBjcDg1MiA4NTIgY3NQQ3A4NTIgfQogICAgeyBJQk04NTUgY3A4NTUgODU1IGNzSUJNODU1IH0KICAgIHsgSUJNODU3IGNwODU3IDg1NyBjc0lCTTg1NyB9CiAgICB7IElCTTg2MCBjcDg2MCA4NjAgY3NJQk04NjAgfQogICAgeyBJQk04NjEgY3A4NjEgODYxIGNwLWlzIGNzSUJNODYxIH0KICAgIHsgSUJNODYyIGNwODYyIDg2MiBjc1BDODYyTGF0aW5IZWJyZXcgfQogICAgeyBJQk04NjMgY3A4NjMgODYzIGNzSUJNODYzIH0KICAgIHsgSUJNODY0IGNwODY0IGNzSUJNODY0IH0KICAgIHsgSUJNODY1IGNwODY1IDg2NSBjc0lCTTg2NSB9CiAgICB7IElCTTg2NiBjcDg2NiA4NjYgY3NJQk04NjYgfQogICAgeyBJQk04NjggQ1A4NjggY3AtYXIgY3NJQk04NjggfQogICAgeyBJQk04NjkgY3A4NjkgODY5IGNwLWdyIGNzSUJNODY5IH0KICAgIHsgSUJNODcwIENQODcwIGViY2RpYy1jcC1yb2VjZSBlYmNkaWMtY3AteXUgY3NJQk04NzAgfQogICAgeyBJQk04NzEgQ1A4NzEgZWJjZGljLWNwLWlzIGNzSUJNODcxIH0KICAgIHsgSUJNODgwIGNwODgwIEVCQ0RJQy1DeXJpbGxpYyBjc0lCTTg4MCB9CiAgICB7IElCTTg5MSBjcDg5MSBjc0lCTTg5MSB9CiAgICB7IElCTTkwMyBjcDkwMyBjc0lCTTkwMyB9CiAgICB7IElCTTkwNCBjcDkwNCA5MDQgY3NJQkJNOTA0IH0KICAgIHsgSUJNOTA1IENQOTA1IGViY2RpYy1jcC10ciBjc0lCTTkwNSB9CiAgICB7IElCTTkxOCBDUDkxOCBlYmNkaWMtY3AtYXIyIGNzSUJNOTE4IH0KICAgIHsgSUJNMTAyNiBDUDEwMjYgY3NJQk0xMDI2IH0KICAgIHsgRUJDRElDLUFULURFIGNzSUJNRUJDRElDQVRERSB9CiAgICB7IEVCQ0RJQy1BVC1ERS1BIGNzRUJDRElDQVRERUEgfQogICAgeyBFQkNESUMtQ0EtRlIgY3NFQkNESUNDQUZSIH0KICAgIHsgRUJDRElDLURLLU5PIGNzRUJDRElDREtOTyB9CiAgICB7IEVCQ0RJQy1ESy1OTy1BIGNzRUJDRElDREtOT0EgfQogICAgeyBFQkNESUMtRkktU0UgY3NFQkNESUNGSVNFIH0KICAgIHsgRUJDRElDLUZJLVNFLUEgY3NFQkNESUNGSVNFQSB9CiAgICB7IEVCQ0RJQy1GUiBjc0VCQ0RJQ0ZSIH0KICAgIHsgRUJDRElDLUlUIGNzRUJDRElDSVQgfQogICAgeyBFQkNESUMtUFQgY3NFQkNESUNQVCB9CiAgICB7IEVCQ0RJQy1FUyBjc0VCQ0RJQ0VTIH0KICAgIHsgRUJDRElDLUVTLUEgY3NFQkNESUNFU0EgfQogICAgeyBFQkNESUMtRVMtUyBjc0VCQ0RJQ0VTUyB9CiAgICB7IEVCQ0RJQy1VSyBjc0VCQ0RJQ1VLIH0KICAgIHsgRUJDRElDLVVTIGNzRUJDRElDVVMgfQogICAgeyBVTktOT1dOLThCSVQgY3NVbmtub3duOEJpVCB9CiAgICB7IE1ORU1PTklDIGNzTW5lbW9uaWMgfQogICAgeyBNTkVNIGNzTW5lbSB9CiAgICB7IFZJU0NJSSBjc1ZJU0NJSSB9CiAgICB7IFZJUVIgY3NWSVFSIH0KICAgIHsgS09JOC1SIGNzS09JOFIgfQogICAgeyBJQk0wMDg1OCBDQ1NJRDAwODU4IENQMDA4NTggUEMtTXVsdGlsaW5ndWFsLTg1MCtldXJvIH0KICAgIHsgSUJNMDA5MjQgQ0NTSUQwMDkyNCBDUDAwOTI0IGViY2RpYy1MYXRpbjktLWV1cm8gfQogICAgeyBJQk0wMTE0MCBDQ1NJRDAxMTQwIENQMDExNDAgZWJjZGljLXVzLTM3K2V1cm8gfQogICAgeyBJQk0wMTE0MSBDQ1NJRDAxMTQxIENQMDExNDEgZWJjZGljLWRlLTI3MytldXJvIH0KICAgIHsgSUJNMDExNDIgQ0NTSUQwMTE0MiBDUDAxMTQyIGViY2RpYy1kay0yNzcrZXVybyBlYmNkaWMtbm8tMjc3K2V1cm8gfQogICAgeyBJQk0wMTE0MyBDQ1NJRDAxMTQzIENQMDExNDMgZWJjZGljLWZpLTI3OCtldXJvIGViY2RpYy1zZS0yNzgrZXVybyB9CiAgICB7IElCTTAxMTQ0IENDU0lEMDExNDQgQ1AwMTE0NCBlYmNkaWMtaXQtMjgwK2V1cm8gfQogICAgeyBJQk0wMTE0NSBDQ1NJRDAxMTQ1IENQMDExNDUgZWJjZGljLWVzLTI4NCtldXJvIH0KICAgIHsgSUJNMDExNDYgQ0NTSUQwMTE0NiBDUDAxMTQ2IGViY2RpYy1nYi0yODUrZXVybyB9CiAgICB7IElCTTAxMTQ3IENDU0lEMDExNDcgQ1AwMTE0NyBlYmNkaWMtZnItMjk3K2V1cm8gfQogICAgeyBJQk0wMTE0OCBDQ1NJRDAxMTQ4IENQMDExNDggZWJjZGljLWludGVybmF0aW9uYWwtNTAwK2V1cm8gfQogICAgeyBJQk0wMTE0OSBDQ1NJRDAxMTQ5IENQMDExNDkgZWJjZGljLWlzLTg3MStldXJvIH0KICAgIHsgSUJNMTA0NyBJQk0tMTA0NyB9CiAgICB7IFBUQ1AxNTQgY3NQVENQMTU0IFBUMTU0IENQMTU0IEN5cmlsbGljLUFzaWFuIH0KICAgIHsgQW1pZ2EtMTI1MSBBbWkxMjUxIEFtaWdhMTI1MSBBbWktMTI1MSB9CiAgICB7IFVOSUNPREUtMS0xIGNzVW5pY29kZTExIH0KICAgIHsgQ0VTVS04IGNzQ0VTVS04IH0KICAgIHsgQk9DVS0xIGNzQk9DVS0xIH0KICAgIHsgVU5JQ09ERS0xLTEtVVRGLTcgY3NVbmljb2RlMTFVVEY3IH0KICAgIHsgSVNPLTg4NTktMTQgaXNvLWlyLTE5OSBJU09fODg1OS0xNDoxOTk4IElTT184ODU5LTE0IGxhdGluOCBpc28tY2VsdGljCiAgICAgIGw4IH0KICAgIHsgSVNPLTg4NTktMTUgSVNPXzg4NTktMTUgTGF0aW4tOSB9CiAgICB7IElTTy04ODU5LTE2IGlzby1pci0yMjYgSVNPXzg4NTktMTY6MjAwMSBJU09fODg1OS0xNiBsYXRpbjEwIGwxMCB9CiAgICB7IEdCSyBDUDkzNiBNUzkzNiB3aW5kb3dzLTkzNiB9CiAgICB7IEpJU19FbmNvZGluZyBjc0pJU0VuY29kaW5nIH0KICAgIHsgU2hpZnRfSklTIE1TX0thbmppIGNzU2hpZnRKSVMgfQogICAgeyBFeHRlbmRlZF9VTklYX0NvZGVfUGFja2VkX0Zvcm1hdF9mb3JfSmFwYW5lc2UgY3NFVUNQa2RGbXRKYXBhbmVzZQogICAgICBFVUMtSlAgfQogICAgeyBFeHRlbmRlZF9VTklYX0NvZGVfRml4ZWRfV2lkdGhfZm9yX0phcGFuZXNlIGNzRVVDRml4V2lkSmFwYW5lc2UgfQogICAgeyBJU08tMTA2NDYtVUNTLUJhc2ljIGNzVW5pY29kZUFTQ0lJIH0KICAgIHsgSVNPLTEwNjQ2LVVuaWNvZGUtTGF0aW4xIGNzVW5pY29kZUxhdGluMSBJU08tMTA2NDYgfQogICAgeyBJU08tVW5pY29kZS1JQk0tMTI2MSBjc1VuaWNvZGVJQk0xMjYxIH0KICAgIHsgSVNPLVVuaWNvZGUtSUJNLTEyNjggY3NVbmljb2RlSUJNMTI2OCB9CiAgICB7IElTTy1Vbmljb2RlLUlCTS0xMjc2IGNzVW5pY29kZUlCTTEyNzYgfQogICAgeyBJU08tVW5pY29kZS1JQk0tMTI2NCBjc1VuaWNvZGVJQk0xMjY0IH0KICAgIHsgSVNPLVVuaWNvZGUtSUJNLTEyNjUgY3NVbmljb2RlSUJNMTI2NSB9CiAgICB7IElTTy04ODU5LTEtV2luZG93cy0zLjAtTGF0aW4tMSBjc1dpbmRvd3MzMExhdGluMSB9CiAgICB7IElTTy04ODU5LTEtV2luZG93cy0zLjEtTGF0aW4tMSBjc1dpbmRvd3MzMUxhdGluMSB9CiAgICB7IElTTy04ODU5LTItV2luZG93cy1MYXRpbi0yIGNzV2luZG93czMxTGF0aW4yIH0KICAgIHsgSVNPLTg4NTktOS1XaW5kb3dzLUxhdGluLTUgY3NXaW5kb3dzMzFMYXRpbjUgfQogICAgeyBBZG9iZS1TdGFuZGFyZC1FbmNvZGluZyBjc0Fkb2JlU3RhbmRhcmRFbmNvZGluZyB9CiAgICB7IFZlbnR1cmEtVVMgY3NWZW50dXJhVVMgfQogICAgeyBWZW50dXJhLUludGVybmF0aW9uYWwgY3NWZW50dXJhSW50ZXJuYXRpb25hbCB9CiAgICB7IFBDOC1EYW5pc2gtTm9yd2VnaWFuIGNzUEM4RGFuaXNoTm9yd2VnaWFuIH0KICAgIHsgUEM4LVR1cmtpc2ggY3NQQzhUdXJraXNoIH0KICAgIHsgSUJNLVN5bWJvbHMgY3NJQk1TeW1ib2xzIH0KICAgIHsgSUJNLVRoYWkgY3NJQk1UaGFpIH0KICAgIHsgSFAtTGVnYWwgY3NIUExlZ2FsIH0KICAgIHsgSFAtUGktZm9udCBjc0hQUGlGb250IH0KICAgIHsgSFAtTWF0aDggY3NIUE1hdGg4IH0KICAgIHsgQWRvYmUtU3ltYm9sLUVuY29kaW5nIGNzSFBQU01hdGggfQogICAgeyBIUC1EZXNrVG9wIGNzSFBEZXNrdG9wIH0KICAgIHsgVmVudHVyYS1NYXRoIGNzVmVudHVyYU1hdGggfQogICAgeyBNaWNyb3NvZnQtUHVibGlzaGluZyBjc01pY3Jvc29mdFB1Ymxpc2hpbmcgfQogICAgeyBXaW5kb3dzLTMxSiBjc1dpbmRvd3MzMUogfQogICAgeyBHQjIzMTIgY3NHQjIzMTIgfQogICAgeyBCaWc1IGNzQmlnNSB9Cn0KCnByb2MgdGNsX2VuY29kaW5nIHtlbmN9IHsKICAgIGdsb2JhbCBlbmNvZGluZ19hbGlhc2VzCiAgICBzZXQgbmFtZXMgW2VuY29kaW5nIG5hbWVzXQogICAgc2V0IGxjbmFtZXMgW3N0cmluZyB0b2xvd2VyICRuYW1lc10KICAgIHNldCBlbmMgW3N0cmluZyB0b2xvd2VyICRlbmNdCiAgICBzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGxjbmFtZXMgJGVuY10KICAgIGlmIHskaSA8IDB9IHsKCSMgbG9vayBmb3IgImlzb25ubiIgaW5zdGVhZCBvZiAiaXNvLW5ubiIgb3IgImlzb19ubm4iCglpZiB7W3JlZ3N1YiB7Xmlzb1stX119ICRlbmMgaXNvIGVuY3hdfSB7CgkgICAgc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRsY25hbWVzICRlbmN4XQoJfQogICAgfQogICAgaWYgeyRpIDwgMH0gewoJZm9yZWFjaCBsICRlbmNvZGluZ19hbGlhc2VzIHsKCSAgICBzZXQgbGwgW3N0cmluZyB0b2xvd2VyICRsXQoJICAgIGlmIHtbbHNlYXJjaCAtZXhhY3QgJGxsICRlbmNdIDwgMH0gY29udGludWUKCSAgICAjIGxvb2sgdGhyb3VnaCB0aGUgYWxpYXNlcyBmb3Igb25lIHRoYXQgdGNsIGtub3dzIGFib3V0CgkgICAgZm9yZWFjaCBlICRsbCB7CgkJc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRsY25hbWVzICRlXQoJCWlmIHskaSA8IDB9IHsKCQkgICAgaWYge1tyZWdzdWIge15pc29bLV9dfSAkZSBpc28gZXhdfSB7CgkJCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkbGNuYW1lcyAkZXhdCgkJICAgIH0KCQl9CgkJaWYgeyRpID49IDB9IGJyZWFrCgkgICAgfQoJICAgIGJyZWFrCgl9CiAgICB9CiAgICBpZiB7JGkgPj0gMH0gewoJcmV0dXJuIFtsaW5kZXggJG5hbWVzICRpXQogICAgfQogICAgcmV0dXJuIHt9Cn0KCiMgZGVmYXVsdHMuLi4Kc2V0IGRhdGVtb2RlIDAKc2V0IGRpZmZvcHRzICItVSA1IC1wIgpzZXQgd3Jjb21jbWQgImdpdCBkaWZmLXRyZWUgLS1zdGRpbiAtcCAtLXByZXR0eSIKCnNldCBnaXRlbmNvZGluZyB7fQpjYXRjaCB7CiAgICBzZXQgZ2l0ZW5jb2RpbmcgW2V4ZWMgZ2l0IHJlcG8tY29uZmlnIC0tZ2V0IGkxOG4uY29tbWl0ZW5jb2RpbmddCn0KaWYgeyRnaXRlbmNvZGluZyA9PSAiIn0gewogICAgc2V0IGdpdGVuY29kaW5nICJ1dGYtOCIKfQpzZXQgdGNsZW5jb2RpbmcgW3RjbF9lbmNvZGluZyAkZ2l0ZW5jb2RpbmddCmlmIHskdGNsZW5jb2RpbmcgPT0ge319IHsKICAgIHB1dHMgc3RkZXJyICJXYXJuaW5nOiBlbmNvZGluZyAkZ2l0ZW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZCBieSBUY2wvVGsiCn0KCnNldCBtYWluZm9udCB7SGVsdmV0aWNhIDl9CnNldCB0ZXh0Zm9udCB7Q291cmllciA5fQpzZXQgdWlmb250IHtIZWx2ZXRpY2EgOSBib2xkfQpzZXQgZmluZG1lcmdlZmlsZXMgMApzZXQgbWF4Z3JhcGhwY3QgNTAKc2V0IG1heHdpZHRoIDE2CnNldCByZXZsaXN0b3JkZXIgMApzZXQgZmFzdGRhdGUgMApzZXQgdXBhcnJvd2xlbiA3CnNldCBkb3duYXJyb3dsZW4gNwpzZXQgbWluZ2FwbGVuIDMwCnNldCBjbWl0bW9kZSAicGF0Y2giCnNldCB3cmFwY29tbWVudCAibm9uZSIKc2V0IHNob3duZWFydGFncyAxCgpzZXQgY29sb3JzIHtncmVlbiByZWQgYmx1ZSBtYWdlbnRhIGRhcmtncmV5IGJyb3duIG9yYW5nZX0Kc2V0IGJnY29sb3Igd2hpdGUKc2V0IGZnY29sb3IgYmxhY2sKc2V0IGRpZmZjb2xvcnMge3JlZCAiIzAwYTAwMCIgYmx1ZX0KCmNhdGNoIHtzb3VyY2Ugfi8uZ2l0a30KCmZvbnQgY3JlYXRlIG9wdGlvbmZvbnQgLWZhbWlseSBzYW5zLXNlcmlmIC1zaXplIC0xMgoKc2V0IHJldnRyZWVhcmdzIHt9CmZvcmVhY2ggYXJnICRhcmd2IHsKICAgIHN3aXRjaCAtcmVnZXhwIC0tICRhcmcgewoJIl4kIiB7IH0KCSJeLWQiIHsgc2V0IGRhdGVtb2RlIDEgfQoJZGVmYXVsdCB7CgkgICAgbGFwcGVuZCByZXZ0cmVlYXJncyAkYXJnCgl9CiAgICB9Cn0KCiMgY2hlY2sgdGhhdCB3ZSBjYW4gZmluZCBhIC5naXQgZGlyZWN0b3J5IHNvbWV3aGVyZS4uLgpzZXQgZ2l0ZGlyIFtnaXRkaXJdCmlmIHshW2ZpbGUgaXNkaXJlY3RvcnkgJGdpdGRpcl19IHsKICAgIHNob3dfZXJyb3Ige30gLiAiQ2Fubm90IGZpbmQgdGhlIGdpdCBkaXJlY3RvcnkgXCIkZ2l0ZGlyXCIuIgogICAgZXhpdCAxCn0KCnNldCBjbWRsaW5lX2ZpbGVzIHt9CnNldCBpIFtsc2VhcmNoIC1leGFjdCAkcmV2dHJlZWFyZ3MgIi0tIl0KaWYgeyRpID49IDB9IHsKICAgIHNldCBjbWRsaW5lX2ZpbGVzIFtscmFuZ2UgJHJldnRyZWVhcmdzIFtleHByIHskaSArIDF9XSBlbmRdCiAgICBzZXQgcmV2dHJlZWFyZ3MgW2xyYW5nZSAkcmV2dHJlZWFyZ3MgMCBbZXhwciB7JGkgLSAxfV1dCn0gZWxzZWlmIHskcmV2dHJlZWFyZ3MgbmUge319IHsKICAgIGlmIHtbY2F0Y2ggewoJc2V0IGYgW2V2YWwgZXhlYyBnaXQgcmV2LXBhcnNlIC0tbm8tcmV2cyAtLW5vLWZsYWdzICRyZXZ0cmVlYXJnc10KCXNldCBjbWRsaW5lX2ZpbGVzIFtzcGxpdCAkZiAiXG4iXQoJc2V0IG4gW2xsZW5ndGggJGNtZGxpbmVfZmlsZXNdCglzZXQgcmV2dHJlZWFyZ3MgW2xyYW5nZSAkcmV2dHJlZWFyZ3MgMCBlbmQtJG5dCiAgICB9IGVycl19IHsKCSMgdW5mb3J0dW5hdGVseSB3ZSBnZXQgYm90aCBzdGRvdXQgYW5kIHN0ZGVyciBpbiAkZXJyLAoJIyBzbyBsb29rIGZvciAiZmF0YWw6Ii4KCXNldCBpIFtzdHJpbmcgZmlyc3QgImZhdGFsOiIgJGVycl0KCWlmIHskaSA+IDB9IHsKCSAgICBzZXQgZXJyIFtzdHJpbmcgcmFuZ2UgJGVyciBbZXhwciB7JGkgKyA2fV0gZW5kXQoJfQoJc2hvd19lcnJvciB7fSAuICJCYWQgYXJndW1lbnRzIHRvIGdpdGs6XG4kZXJyIgoJZXhpdCAxCiAgICB9Cn0KCnNldCBoaXN0b3J5IHt9CnNldCBoaXN0b3J5aW5kZXggMApzZXQgZmhfc2VyaWFsIDAKc2V0IG5obF9uYW1lcyB7fQpzZXQgaGlnaGxpZ2h0X3BhdGhzIHt9CnNldCBzZWFyY2hkaXJuIC1mb3J3YXJkcwpzZXQgYm9sZHJvd3Mge30Kc2V0IGJvbGRuYW1lcm93cyB7fQoKc2V0IG9wdGltX2RlbGF5IDE2CgpzZXQgbmV4dHZpZXdudW0gMQpzZXQgY3VydmlldyAwCnNldCBzZWxlY3RlZHZpZXcgMApzZXQgc2VsZWN0ZWRobHZpZXcgTm9uZQpzZXQgdmlld2ZpbGVzKDApIHt9CnNldCB2aWV3cGVybSgwKSAwCnNldCB2aWV3YXJncygwKSB7fQoKc2V0IGNtZGxpbmVvayAwCnNldCBzdG9wcGVkIDAKc2V0IHN0dWZmc2F2ZWQgMApzZXQgcGF0Y2hudW0gMApzZXRjb29yZHMKbWFrZXdpbmRvdwpyZWFkcmVmcwoKaWYgeyRjbWRsaW5lX2ZpbGVzIG5lIHt9IHx8ICRyZXZ0cmVlYXJncyBuZSB7fX0gewogICAgIyBjcmVhdGUgYSB2aWV3IGZvciB0aGUgZmlsZXMvZGlycyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZQogICAgc2V0IGN1cnZpZXcgMQogICAgc2V0IHNlbGVjdGVkdmlldyAxCiAgICBzZXQgbmV4dHZpZXdudW0gMgogICAgc2V0IHZpZXduYW1lKDEpICJDb21tYW5kIGxpbmUiCiAgICBzZXQgdmlld2ZpbGVzKDEpICRjbWRsaW5lX2ZpbGVzCiAgICBzZXQgdmlld2FyZ3MoMSkgJHJldnRyZWVhcmdzCiAgICBzZXQgdmlld3Blcm0oMSkgMAogICAgYWRkdmlld21lbnUgMQogICAgLmJhci52aWV3IGVudHJ5Y29uZiAyIC1zdGF0ZSBub3JtYWwKICAgIC5iYXIudmlldyBlbnRyeWNvbmYgMyAtc3RhdGUgbm9ybWFsCn0KCmlmIHtbaW5mbyBleGlzdHMgcGVybXZpZXdzXX0gewogICAgZm9yZWFjaCB2ICRwZXJtdmlld3MgewoJc2V0IG4gJG5leHR2aWV3bnVtCglpbmNyIG5leHR2aWV3bnVtCglzZXQgdmlld25hbWUoJG4pIFtsaW5kZXggJHYgMF0KCXNldCB2aWV3ZmlsZXMoJG4pIFtsaW5kZXggJHYgMV0KCXNldCB2aWV3YXJncygkbikgW2xpbmRleCAkdiAyXQoJc2V0IHZpZXdwZXJtKCRuKSAxCglhZGR2aWV3bWVudSAkbgogICAgfQp9CmdldGNvbW1pdHMK