IyEvYmluL3NoCiMgVGNsIGlnbm9yZXMgdGhlIG5leHQgbGluZSAtKi0gdGNsIC0qLSBcCmV4ZWMgd2lzaCAiJDAiIC0tICIkQCIKCiMgQ29weXJpZ2h0IChDKSAyMDA1IFBhdWwgTWFja2VycmFzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgaXQgbWF5IGJlIHVzZWQsIGNvcGllZCwgbW9kaWZpZWQKIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZSwKIyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKcHJvYyBnaXRkaXIge30gewogICAgZ2xvYmFsIGVudgogICAgaWYge1tpbmZvIGV4aXN0cyBlbnYoR0lUX0RJUildfSB7CglyZXR1cm4gJGVudihHSVRfRElSKQogICAgfSBlbHNlIHsKCXJldHVybiAiLmdpdCIKICAgIH0KfQoKcHJvYyBzdGFydF9yZXZfbGlzdCB7dmlld30gewogICAgZ2xvYmFsIHN0YXJ0bXNlY3MgbmV4dHVwZGF0ZSBuY211cGRhdGUKICAgIGdsb2JhbCBjb21tZmQgbGVmdG92ZXIgdGNsZW5jb2RpbmcgZGF0ZW1vZGUKICAgIGdsb2JhbCB2aWV3YXJncyB2aWV3ZmlsZXMgY29tbWl0aWR4CgogICAgc2V0IHN0YXJ0bXNlY3MgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQogICAgc2V0IG5leHR1cGRhdGUgW2V4cHIgeyRzdGFydG1zZWNzICsgMTAwfV0KICAgIHNldCBuY211cGRhdGUgMQogICAgc2V0IGNvbW1pdGlkeCgkdmlldykgMAogICAgc2V0IGFyZ3MgJHZpZXdhcmdzKCR2aWV3KQogICAgaWYgeyR2aWV3ZmlsZXMoJHZpZXcpIG5lIHt9fSB7CglzZXQgYXJncyBbY29uY2F0ICRhcmdzICItLSIgJHZpZXdmaWxlcygkdmlldyldCiAgICB9CiAgICBzZXQgb3JkZXIgIi0tdG9wby1vcmRlciIKICAgIGlmIHskZGF0ZW1vZGV9IHsKCXNldCBvcmRlciAiLS1kYXRlLW9yZGVyIgogICAgfQogICAgaWYge1tjYXRjaCB7CglzZXQgZmQgW29wZW4gW2NvbmNhdCB8IGdpdCByZXYtbGlzdCAtLWhlYWRlciAkb3JkZXIgXAoJCQkgIC0tcGFyZW50cyAtLWJvdW5kYXJ5IC0tZGVmYXVsdCBIRUFEICRhcmdzXSByXQogICAgfSBlcnJdfSB7CglwdXRzIHN0ZGVyciAiRXJyb3IgZXhlY3V0aW5nIGdpdCByZXYtbGlzdDogJGVyciIKCWV4aXQgMQogICAgfQogICAgc2V0IGNvbW1mZCgkdmlldykgJGZkCiAgICBzZXQgbGVmdG92ZXIoJHZpZXcpIHt9CiAgICBmY29uZmlndXJlICRmZCAtYmxvY2tpbmcgMCAtdHJhbnNsYXRpb24gbGYKICAgIGlmIHskdGNsZW5jb2RpbmcgIT0ge319IHsKCWZjb25maWd1cmUgJGZkIC1lbmNvZGluZyAkdGNsZW5jb2RpbmcKICAgIH0KICAgIGZpbGVldmVudCAkZmQgcmVhZGFibGUgW2xpc3QgZ2V0Y29tbWl0bGluZXMgJGZkICR2aWV3XQogICAgbm93YnVzeSAkdmlldwp9Cgpwcm9jIHN0b3BfcmV2X2xpc3Qge30gewogICAgZ2xvYmFsIGNvbW1mZCBjdXJ2aWV3CgogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWZkKCRjdXJ2aWV3KV19IHJldHVybgogICAgc2V0IGZkICRjb21tZmQoJGN1cnZpZXcpCiAgICBjYXRjaCB7CglzZXQgcGlkIFtwaWQgJGZkXQoJZXhlYyBraWxsICRwaWQKICAgIH0KICAgIGNhdGNoIHtjbG9zZSAkZmR9CiAgICB1bnNldCBjb21tZmQoJGN1cnZpZXcpCn0KCnByb2MgZ2V0Y29tbWl0cyB7fSB7CiAgICBnbG9iYWwgcGhhc2UgY2FudiBtYWluZm9udCBjdXJ2aWV3CgogICAgc2V0IHBoYXNlIGdldGNvbW1pdHMKICAgIGluaXRsYXlvdXQKICAgIHN0YXJ0X3Jldl9saXN0ICRjdXJ2aWV3CiAgICBzaG93X3N0YXR1cyAiUmVhZGluZyBjb21taXRzLi4uIgp9Cgpwcm9jIGdldGNvbW1pdGxpbmVzIHtmZCB2aWV3fSAgewogICAgZ2xvYmFsIGNvbW1pdGxpc3RlZCBuZXh0dXBkYXRlCiAgICBnbG9iYWwgbGVmdG92ZXIgY29tbWZkCiAgICBnbG9iYWwgZGlzcGxheW9yZGVyIGNvbW1pdGlkeCBjb21taXRyb3cgY29tbWl0ZGF0YQogICAgZ2xvYmFsIHBhcmVudGxpc3QgY2hpbGRsaXN0IGNoaWxkcmVuIGN1cnZpZXcgaGx2aWV3CiAgICBnbG9iYWwgdnBhcmVudGxpc3QgdmNoaWxkbGlzdCB2ZGlzcG9yZGVyIHZjbWl0bGlzdGVkCgogICAgc2V0IHN0dWZmIFtyZWFkICRmZF0KICAgIGlmIHskc3R1ZmYgPT0ge319IHsKCWlmIHshW2VvZiAkZmRdfSByZXR1cm4KCWdsb2JhbCB2aWV3bmFtZQoJdW5zZXQgY29tbWZkKCR2aWV3KQoJbm90YnVzeSAkdmlldwoJIyBzZXQgaXQgYmxvY2tpbmcgc28gd2Ugd2FpdCBmb3IgdGhlIHByb2Nlc3MgdG8gdGVybWluYXRlCglmY29uZmlndXJlICRmZCAtYmxvY2tpbmcgMQoJaWYge1tjYXRjaCB7Y2xvc2UgJGZkfSBlcnJdfSB7CgkgICAgc2V0IGZ2IHt9CgkgICAgaWYgeyR2aWV3ICE9ICRjdXJ2aWV3fSB7CgkJc2V0IGZ2ICIgZm9yIHRoZSBcIiR2aWV3bmFtZSgkdmlldylcIiB2aWV3IgoJICAgIH0KCSAgICBpZiB7W3N0cmluZyByYW5nZSAkZXJyIDAgNF0gPT0gInVzYWdlIn0gewoJCXNldCBlcnIgIkdpdGs6IGVycm9yIHJlYWRpbmcgY29tbWl0cyRmdjpcCgkJCWJhZCBhcmd1bWVudHMgdG8gZ2l0IHJldi1saXN0LiIKCQlpZiB7JHZpZXduYW1lKCR2aWV3KSBlcSAiQ29tbWFuZCBsaW5lIn0gewoJCSAgICBhcHBlbmQgZXJyIFwKCQkJIiAgKE5vdGU6IGFyZ3VtZW50cyB0byBnaXRrIGFyZSBwYXNzZWQgdG8gZ2l0IHJldi1saXN0XAoJCQkgdG8gYWxsb3cgc2VsZWN0aW9uIG9mIGNvbW1pdHMgdG8gYmUgZGlzcGxheWVkLikiCgkJfQoJICAgIH0gZWxzZSB7CgkJc2V0IGVyciAiRXJyb3IgcmVhZGluZyBjb21taXRzJGZ2OiAkZXJyIgoJICAgIH0KCSAgICBlcnJvcl9wb3B1cCAkZXJyCgl9CglpZiB7JHZpZXcgPT0gJGN1cnZpZXd9IHsKCSAgICBhZnRlciBpZGxlIGZpbmlzaGNvbW1pdHMKCX0KCXJldHVybgogICAgfQogICAgc2V0IHN0YXJ0IDAKICAgIHNldCBnb3Rzb21lIDAKICAgIHdoaWxlIDEgewoJc2V0IGkgW3N0cmluZyBmaXJzdCAiXDAiICRzdHVmZiAkc3RhcnRdCglpZiB7JGkgPCAwfSB7CgkgICAgYXBwZW5kIGxlZnRvdmVyKCR2aWV3KSBbc3RyaW5nIHJhbmdlICRzdHVmZiAkc3RhcnQgZW5kXQoJICAgIGJyZWFrCgl9CglpZiB7JHN0YXJ0ID09IDB9IHsKCSAgICBzZXQgY21pdCAkbGVmdG92ZXIoJHZpZXcpCgkgICAgYXBwZW5kIGNtaXQgW3N0cmluZyByYW5nZSAkc3R1ZmYgMCBbZXhwciB7JGkgLSAxfV1dCgkgICAgc2V0IGxlZnRvdmVyKCR2aWV3KSB7fQoJfSBlbHNlIHsKCSAgICBzZXQgY21pdCBbc3RyaW5nIHJhbmdlICRzdHVmZiAkc3RhcnQgW2V4cHIgeyRpIC0gMX1dXQoJfQoJc2V0IHN0YXJ0IFtleHByIHskaSArIDF9XQoJc2V0IGogW3N0cmluZyBmaXJzdCAiXG4iICRjbWl0XQoJc2V0IG9rIDAKCXNldCBsaXN0ZWQgMQoJaWYgeyRqID49IDB9IHsKCSAgICBzZXQgaWRzIFtzdHJpbmcgcmFuZ2UgJGNtaXQgMCBbZXhwciB7JGogLSAxfV1dCgkgICAgaWYge1tzdHJpbmcgcmFuZ2UgJGlkcyAwIDBdID09ICItIn0gewoJCXNldCBsaXN0ZWQgMAoJCXNldCBpZHMgW3N0cmluZyByYW5nZSAkaWRzIDEgZW5kXQoJICAgIH0KCSAgICBzZXQgb2sgMQoJICAgIGZvcmVhY2ggaWQgJGlkcyB7CgkJaWYge1tzdHJpbmcgbGVuZ3RoICRpZF0gIT0gNDB9IHsKCQkgICAgc2V0IG9rIDAKCQkgICAgYnJlYWsKCQl9CgkgICAgfQoJfQoJaWYgeyEkb2t9IHsKCSAgICBzZXQgc2hvcnRjbWl0ICRjbWl0CgkgICAgaWYge1tzdHJpbmcgbGVuZ3RoICRzaG9ydGNtaXRdID4gODB9IHsKCQlzZXQgc2hvcnRjbWl0ICJbc3RyaW5nIHJhbmdlICRzaG9ydGNtaXQgMCA4MF0uLi4iCgkgICAgfQoJICAgIGVycm9yX3BvcHVwICJDYW4ndCBwYXJzZSBnaXQgcmV2LWxpc3Qgb3V0cHV0OiB7JHNob3J0Y21pdH0iCgkgICAgZXhpdCAxCgl9CglzZXQgaWQgW2xpbmRleCAkaWRzIDBdCglpZiB7JGxpc3RlZH0gewoJICAgIHNldCBvbGRzIFtscmFuZ2UgJGlkcyAxIGVuZF0KCSAgICBzZXQgaSAwCgkgICAgZm9yZWFjaCBwICRvbGRzIHsKCQlpZiB7JGkgPT0gMCB8fCBbbHNlYXJjaCAtZXhhY3QgJG9sZHMgJHBdID49ICRpfSB7CgkJICAgIGxhcHBlbmQgY2hpbGRyZW4oJHZpZXcsJHApICRpZAoJCX0KCQlpbmNyIGkKCSAgICB9Cgl9IGVsc2UgewoJICAgIHNldCBvbGRzIHt9Cgl9CglpZiB7IVtpbmZvIGV4aXN0cyBjaGlsZHJlbigkdmlldywkaWQpXX0gewoJICAgIHNldCBjaGlsZHJlbigkdmlldywkaWQpIHt9Cgl9CglzZXQgY29tbWl0ZGF0YSgkaWQpIFtzdHJpbmcgcmFuZ2UgJGNtaXQgW2V4cHIgeyRqICsgMX1dIGVuZF0KCXNldCBjb21taXRyb3coJHZpZXcsJGlkKSAkY29tbWl0aWR4KCR2aWV3KQoJaW5jciBjb21taXRpZHgoJHZpZXcpCglpZiB7JHZpZXcgPT0gJGN1cnZpZXd9IHsKCSAgICBsYXBwZW5kIHBhcmVudGxpc3QgJG9sZHMKCSAgICBsYXBwZW5kIGNoaWxkbGlzdCAkY2hpbGRyZW4oJHZpZXcsJGlkKQoJICAgIGxhcHBlbmQgZGlzcGxheW9yZGVyICRpZAoJICAgIGxhcHBlbmQgY29tbWl0bGlzdGVkICRsaXN0ZWQKCX0gZWxzZSB7CgkgICAgbGFwcGVuZCB2cGFyZW50bGlzdCgkdmlldykgJG9sZHMKCSAgICBsYXBwZW5kIHZjaGlsZGxpc3QoJHZpZXcpICRjaGlsZHJlbigkdmlldywkaWQpCgkgICAgbGFwcGVuZCB2ZGlzcG9yZGVyKCR2aWV3KSAkaWQKCSAgICBsYXBwZW5kIHZjbWl0bGlzdGVkKCR2aWV3KSAkbGlzdGVkCgl9CglzZXQgZ290c29tZSAxCiAgICB9CiAgICBpZiB7JGdvdHNvbWV9IHsKCWlmIHskdmlldyA9PSAkY3Vydmlld30gewoJICAgIGxheW91dG1vcmUKCX0gZWxzZWlmIHtbaW5mbyBleGlzdHMgaGx2aWV3XSAmJiAkdmlldyA9PSAkaGx2aWV3fSB7CgkgICAgdmhpZ2hsaWdodG1vcmUKCX0KICAgIH0KICAgIGlmIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdID49ICRuZXh0dXBkYXRlfSB7Cglkb3VwZGF0ZQogICAgfQp9Cgpwcm9jIGRvdXBkYXRlIHt9IHsKICAgIGdsb2JhbCBjb21tZmQgbmV4dHVwZGF0ZSBudW1jb21taXRzIG5jbXVwZGF0ZQoKICAgIGZvcmVhY2ggdiBbYXJyYXkgbmFtZXMgY29tbWZkXSB7CglmaWxlZXZlbnQgJGNvbW1mZCgkdikgcmVhZGFibGUge30KICAgIH0KICAgIHVwZGF0ZQogICAgc2V0IG5leHR1cGRhdGUgW2V4cHIge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gKyAxMDB9XQogICAgaWYgeyRudW1jb21taXRzIDwgMTAwfSB7CglzZXQgbmNtdXBkYXRlIFtleHByIHskbnVtY29tbWl0cyArIDF9XQogICAgfSBlbHNlaWYgeyRudW1jb21taXRzIDwgMTAwMDB9IHsKCXNldCBuY211cGRhdGUgW2V4cHIgeyRudW1jb21taXRzICsgMTB9XQogICAgfSBlbHNlIHsKCXNldCBuY211cGRhdGUgW2V4cHIgeyRudW1jb21taXRzICsgMTAwfV0KICAgIH0KICAgIGZvcmVhY2ggdiBbYXJyYXkgbmFtZXMgY29tbWZkXSB7CglzZXQgZmQgJGNvbW1mZCgkdikKCWZpbGVldmVudCAkZmQgcmVhZGFibGUgW2xpc3QgZ2V0Y29tbWl0bGluZXMgJGZkICR2XQogICAgfQp9Cgpwcm9jIHJlYWRjb21taXQge2lkfSB7CiAgICBpZiB7W2NhdGNoIHtzZXQgY29udGVudHMgW2V4ZWMgZ2l0IGNhdC1maWxlIGNvbW1pdCAkaWRdfV19IHJldHVybgogICAgcGFyc2Vjb21taXQgJGlkICRjb250ZW50cyAwCn0KCnByb2MgdXBkYXRlY29tbWl0cyB7fSB7CiAgICBnbG9iYWwgdmlld2RhdGEgY3VydmlldyBwaGFzZSBkaXNwbGF5b3JkZXIKICAgIGdsb2JhbCBjaGlsZHJlbiBjb21taXRyb3cgc2VsZWN0ZWRsaW5lIHRoaWNrZXJsaW5lCgogICAgaWYgeyRwaGFzZSBuZSB7fX0gewoJc3RvcF9yZXZfbGlzdAoJc2V0IHBoYXNlIHt9CiAgICB9CiAgICBzZXQgbiAkY3VydmlldwogICAgZm9yZWFjaCBpZCAkZGlzcGxheW9yZGVyIHsKCWNhdGNoIHt1bnNldCBjaGlsZHJlbigkbiwkaWQpfQoJY2F0Y2gge3Vuc2V0IGNvbW1pdHJvdygkbiwkaWQpfQogICAgfQogICAgc2V0IGN1cnZpZXcgLTEKICAgIGNhdGNoIHt1bnNldCBzZWxlY3RlZGxpbmV9CiAgICBjYXRjaCB7dW5zZXQgdGhpY2tlcmxpbmV9CiAgICBjYXRjaCB7dW5zZXQgdmlld2RhdGEoJG4pfQogICAgZGlzY2FyZGFsbGNvbW1pdHMKICAgIHJlYWRyZWZzCiAgICBzaG93dmlldyAkbgp9Cgpwcm9jIHBhcnNlY29tbWl0IHtpZCBjb250ZW50cyBsaXN0ZWR9IHsKICAgIGdsb2JhbCBjb21taXRpbmZvIGNkYXRlCgogICAgc2V0IGluaGRyIDEKICAgIHNldCBjb21tZW50IHt9CiAgICBzZXQgaGVhZGxpbmUge30KICAgIHNldCBhdW5hbWUge30KICAgIHNldCBhdWRhdGUge30KICAgIHNldCBjb21uYW1lIHt9CiAgICBzZXQgY29tZGF0ZSB7fQogICAgc2V0IGhkcmVuZCBbc3RyaW5nIGZpcnN0ICJcblxuIiAkY29udGVudHNdCiAgICBpZiB7JGhkcmVuZCA8IDB9IHsKCSMgc2hvdWxkIG5ldmVyIGhhcHBlbi4uLgoJc2V0IGhkcmVuZCBbc3RyaW5nIGxlbmd0aCAkY29udGVudHNdCiAgICB9CiAgICBzZXQgaGVhZGVyIFtzdHJpbmcgcmFuZ2UgJGNvbnRlbnRzIDAgW2V4cHIgeyRoZHJlbmQgLSAxfV1dCiAgICBzZXQgY29tbWVudCBbc3RyaW5nIHJhbmdlICRjb250ZW50cyBbZXhwciB7JGhkcmVuZCArIDJ9XSBlbmRdCiAgICBmb3JlYWNoIGxpbmUgW3NwbGl0ICRoZWFkZXIgIlxuIl0gewoJc2V0IHRhZyBbbGluZGV4ICRsaW5lIDBdCglpZiB7JHRhZyA9PSAiYXV0aG9yIn0gewoJICAgIHNldCBhdWRhdGUgW2xpbmRleCAkbGluZSBlbmQtMV0KCSAgICBzZXQgYXVuYW1lIFtscmFuZ2UgJGxpbmUgMSBlbmQtMl0KCX0gZWxzZWlmIHskdGFnID09ICJjb21taXR0ZXIifSB7CgkgICAgc2V0IGNvbWRhdGUgW2xpbmRleCAkbGluZSBlbmQtMV0KCSAgICBzZXQgY29tbmFtZSBbbHJhbmdlICRsaW5lIDEgZW5kLTJdCgl9CiAgICB9CiAgICBzZXQgaGVhZGxpbmUge30KICAgICMgdGFrZSB0aGUgZmlyc3QgbGluZSBvZiB0aGUgY29tbWVudCBhcyB0aGUgaGVhZGxpbmUKICAgIHNldCBpIFtzdHJpbmcgZmlyc3QgIlxuIiAkY29tbWVudF0KICAgIGlmIHskaSA+PSAwfSB7CglzZXQgaGVhZGxpbmUgW3N0cmluZyB0cmltIFtzdHJpbmcgcmFuZ2UgJGNvbW1lbnQgMCAkaV1dCiAgICB9IGVsc2UgewoJc2V0IGhlYWRsaW5lICRjb21tZW50CiAgICB9CiAgICBpZiB7ISRsaXN0ZWR9IHsKCSMgZ2l0IHJldi1saXN0IGluZGVudHMgdGhlIGNvbW1lbnQgYnkgNCBzcGFjZXM7CgkjIGlmIHdlIGdvdCB0aGlzIHZpYSBnaXQgY2F0LWZpbGUsIGFkZCB0aGUgaW5kZW50YXRpb24KCXNldCBuZXdjb21tZW50IHt9Cglmb3JlYWNoIGxpbmUgW3NwbGl0ICRjb21tZW50ICJcbiJdIHsKCSAgICBhcHBlbmQgbmV3Y29tbWVudCAiICAgICIKCSAgICBhcHBlbmQgbmV3Y29tbWVudCAkbGluZQoJICAgIGFwcGVuZCBuZXdjb21tZW50ICJcbiIKCX0KCXNldCBjb21tZW50ICRuZXdjb21tZW50CiAgICB9CiAgICBpZiB7JGNvbWRhdGUgIT0ge319IHsKCXNldCBjZGF0ZSgkaWQpICRjb21kYXRlCiAgICB9CiAgICBzZXQgY29tbWl0aW5mbygkaWQpIFtsaXN0ICRoZWFkbGluZSAkYXVuYW1lICRhdWRhdGUgXAoJCQkgICAgICRjb21uYW1lICRjb21kYXRlICRjb21tZW50XQp9Cgpwcm9jIGdldGNvbW1pdCB7aWR9IHsKICAgIGdsb2JhbCBjb21taXRkYXRhIGNvbW1pdGluZm8KCiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbW1pdGRhdGEoJGlkKV19IHsKCXBhcnNlY29tbWl0ICRpZCAkY29tbWl0ZGF0YSgkaWQpIDEKICAgIH0gZWxzZSB7CglyZWFkY29tbWl0ICRpZAoJaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXX0gewoJICAgIHNldCBjb21taXRpbmZvKCRpZCkgeyJObyBjb21taXQgaW5mb3JtYXRpb24gYXZhaWxhYmxlIn0KCX0KICAgIH0KICAgIHJldHVybiAxCn0KCnByb2MgcmVhZHJlZnMge30gewogICAgZ2xvYmFsIHRhZ2lkcyBpZHRhZ3MgaGVhZGlkcyBpZGhlYWRzIHRhZ2NvbnRlbnRzCiAgICBnbG9iYWwgb3RoZXJyZWZpZHMgaWRvdGhlcnJlZnMgbWFpbmhlYWQKCiAgICBmb3JlYWNoIHYge3RhZ2lkcyBpZHRhZ3MgaGVhZGlkcyBpZGhlYWRzIG90aGVycmVmaWRzIGlkb3RoZXJyZWZzfSB7CgljYXRjaCB7dW5zZXQgJHZ9CiAgICB9CiAgICBzZXQgcmVmZCBbb3BlbiBbbGlzdCB8IGdpdCBscy1yZW1vdGUgW2dpdGRpcl1dIHJdCiAgICB3aGlsZSB7MCA8PSBbc2V0IG4gW2dldHMgJHJlZmQgbGluZV1dfSB7CglpZiB7IVtyZWdleHAge14oWzAtOWEtZl17NDB9KQlyZWZzLyhbXl5dKikkfSAkbGluZSBcCgkgICAgbWF0Y2ggaWQgcGF0aF19IHsKCSAgICBjb250aW51ZQoJfQoJaWYge1tyZWdleHAge15yZW1vdGVzLy4qL0hFQUQkfSAkcGF0aCBtYXRjaF19IHsKCSAgICBjb250aW51ZQoJfQoJaWYgeyFbcmVnZXhwIHteKHRhZ3N8aGVhZHMpLyguKikkfSAkcGF0aCBtYXRjaCB0eXBlIG5hbWVdfSB7CgkgICAgc2V0IHR5cGUgb3RoZXJzCgkgICAgc2V0IG5hbWUgJHBhdGgKCX0KCWlmIHtbcmVnZXhwIHtecmVtb3Rlcy99ICRwYXRoIG1hdGNoXX0gewoJICAgIHNldCB0eXBlIGhlYWRzCgl9CglpZiB7JHR5cGUgPT0gInRhZ3MifSB7CgkgICAgc2V0IHRhZ2lkcygkbmFtZSkgJGlkCgkgICAgbGFwcGVuZCBpZHRhZ3MoJGlkKSAkbmFtZQoJICAgIHNldCBvYmoge30KCSAgICBzZXQgdHlwZSB7fQoJICAgIHNldCB0YWcge30KCSAgICBjYXRjaCB7CgkJc2V0IGNvbW1pdCBbZXhlYyBnaXQgcmV2LXBhcnNlICIkaWReMCJdCgkJaWYgeyIkY29tbWl0IiAhPSAiJGlkIn0gewoJCSAgICBzZXQgdGFnaWRzKCRuYW1lKSAkY29tbWl0CgkJICAgIGxhcHBlbmQgaWR0YWdzKCRjb21taXQpICRuYW1lCgkJfQoJICAgIH0JCQoJICAgIGNhdGNoIHsKCSAgICAgICAgc2V0IHRhZ2NvbnRlbnRzKCRuYW1lKSBbZXhlYyBnaXQgY2F0LWZpbGUgdGFnICIkaWQiXQoJICAgIH0KCX0gZWxzZWlmIHsgJHR5cGUgPT0gImhlYWRzIiB9IHsKCSAgICBzZXQgaGVhZGlkcygkbmFtZSkgJGlkCgkgICAgbGFwcGVuZCBpZGhlYWRzKCRpZCkgJG5hbWUKCX0gZWxzZSB7CgkgICAgc2V0IG90aGVycmVmaWRzKCRuYW1lKSAkaWQKCSAgICBsYXBwZW5kIGlkb3RoZXJyZWZzKCRpZCkgJG5hbWUKCX0KICAgIH0KICAgIGNsb3NlICRyZWZkCiAgICBzZXQgbWFpbmhlYWQge30KICAgIGNhdGNoIHsKCXNldCB0aGVoZWFkIFtleGVjIGdpdCBzeW1ib2xpYy1yZWYgSEVBRF0KCWlmIHtbc3RyaW5nIG1hdGNoICJyZWZzL2hlYWRzLyoiICR0aGVoZWFkXX0gewoJICAgIHNldCBtYWluaGVhZCBbc3RyaW5nIHJhbmdlICR0aGVoZWFkIDExIGVuZF0KCX0KICAgIH0KfQoKcHJvYyBzaG93X2Vycm9yIHt3IHRvcCBtc2d9IHsKICAgIG1lc3NhZ2UgJHcubSAtdGV4dCAkbXNnIC1qdXN0aWZ5IGNlbnRlciAtYXNwZWN0IDQwMAogICAgcGFjayAkdy5tIC1zaWRlIHRvcCAtZmlsbCB4IC1wYWR4IDIwIC1wYWR5IDIwCiAgICBidXR0b24gJHcub2sgLXRleHQgT0sgLWNvbW1hbmQgImRlc3Ryb3kgJHRvcCIKICAgIHBhY2sgJHcub2sgLXNpZGUgYm90dG9tIC1maWxsIHgKICAgIGJpbmQgJHRvcCA8VmlzaWJpbGl0eT4gImdyYWIgJHRvcDsgZm9jdXMgJHRvcCIKICAgIGJpbmQgJHRvcCA8S2V5LVJldHVybj4gImRlc3Ryb3kgJHRvcCIKICAgIHRrd2FpdCB3aW5kb3cgJHRvcAp9Cgpwcm9jIGVycm9yX3BvcHVwIG1zZyB7CiAgICBzZXQgdyAuZXJyb3IKICAgIHRvcGxldmVsICR3CiAgICB3bSB0cmFuc2llbnQgJHcgLgogICAgc2hvd19lcnJvciAkdyAkdyAkbXNnCn0KCnByb2MgbWFrZXdpbmRvdyB7fSB7CiAgICBnbG9iYWwgY2FudiBjYW52MiBjYW52MyBsaW5lc3BjIGNoYXJzcGMgY3RleHQgY2ZsaXN0CiAgICBnbG9iYWwgdGV4dGZvbnQgbWFpbmZvbnQgdWlmb250CiAgICBnbG9iYWwgZmluZHR5cGUgZmluZHR5cGVtZW51IGZpbmRsb2MgZmluZHN0cmluZyBmc3RyaW5nIGdlb21ldHJ5CiAgICBnbG9iYWwgZW50cmllcyBzaGExZW50cnkgc2hhMXN0cmluZyBzaGExYnV0CiAgICBnbG9iYWwgbWFpbmN1cnNvciB0ZXh0Y3Vyc29yIGN1cnRleHRjdXJzb3IKICAgIGdsb2JhbCByb3djdHhtZW51IG1lcmdlbWF4IHdyYXBjb21tZW50CiAgICBnbG9iYWwgaGlnaGxpZ2h0X2ZpbGVzIGdkdHR5cGUKICAgIGdsb2JhbCBzZWFyY2hzdHJpbmcgc3N0cmluZwogICAgZ2xvYmFsIGJnY29sb3IgZmdjb2xvciBiZ2xpc3QgZmdsaXN0IGRpZmZjb2xvcnMKCiAgICBtZW51IC5iYXIKICAgIC5iYXIgYWRkIGNhc2NhZGUgLWxhYmVsICJGaWxlIiAtbWVudSAuYmFyLmZpbGUKICAgIC5iYXIgY29uZmlndXJlIC1mb250ICR1aWZvbnQKICAgIG1lbnUgLmJhci5maWxlCiAgICAuYmFyLmZpbGUgYWRkIGNvbW1hbmQgLWxhYmVsICJVcGRhdGUiIC1jb21tYW5kIHVwZGF0ZWNvbW1pdHMKICAgIC5iYXIuZmlsZSBhZGQgY29tbWFuZCAtbGFiZWwgIlJlcmVhZCByZWZlcmVuY2VzIiAtY29tbWFuZCByZXJlYWRyZWZzCiAgICAuYmFyLmZpbGUgYWRkIGNvbW1hbmQgLWxhYmVsICJRdWl0IiAtY29tbWFuZCBkb3F1aXQKICAgIC5iYXIuZmlsZSBjb25maWd1cmUgLWZvbnQgJHVpZm9udAogICAgbWVudSAuYmFyLmVkaXQKICAgIC5iYXIgYWRkIGNhc2NhZGUgLWxhYmVsICJFZGl0IiAtbWVudSAuYmFyLmVkaXQKICAgIC5iYXIuZWRpdCBhZGQgY29tbWFuZCAtbGFiZWwgIlByZWZlcmVuY2VzIiAtY29tbWFuZCBkb3ByZWZzCiAgICAuYmFyLmVkaXQgY29uZmlndXJlIC1mb250ICR1aWZvbnQKCiAgICBtZW51IC5iYXIudmlldyAtZm9udCAkdWlmb250CiAgICAuYmFyIGFkZCBjYXNjYWRlIC1sYWJlbCAiVmlldyIgLW1lbnUgLmJhci52aWV3CiAgICAuYmFyLnZpZXcgYWRkIGNvbW1hbmQgLWxhYmVsICJOZXcgdmlldy4uLiIgLWNvbW1hbmQge25ld3ZpZXcgMH0KICAgIC5iYXIudmlldyBhZGQgY29tbWFuZCAtbGFiZWwgIkVkaXQgdmlldy4uLiIgLWNvbW1hbmQgZWRpdHZpZXcgXAoJLXN0YXRlIGRpc2FibGVkCiAgICAuYmFyLnZpZXcgYWRkIGNvbW1hbmQgLWxhYmVsICJEZWxldGUgdmlldyIgLWNvbW1hbmQgZGVsdmlldyAtc3RhdGUgZGlzYWJsZWQKICAgIC5iYXIudmlldyBhZGQgc2VwYXJhdG9yCiAgICAuYmFyLnZpZXcgYWRkIHJhZGlvYnV0dG9uIC1sYWJlbCAiQWxsIGZpbGVzIiAtY29tbWFuZCB7c2hvd3ZpZXcgMH0gXAoJLXZhcmlhYmxlIHNlbGVjdGVkdmlldyAtdmFsdWUgMAogICAgCiAgICBtZW51IC5iYXIuaGVscAogICAgLmJhciBhZGQgY2FzY2FkZSAtbGFiZWwgIkhlbHAiIC1tZW51IC5iYXIuaGVscAogICAgLmJhci5oZWxwIGFkZCBjb21tYW5kIC1sYWJlbCAiQWJvdXQgZ2l0ayIgLWNvbW1hbmQgYWJvdXQKICAgIC5iYXIuaGVscCBhZGQgY29tbWFuZCAtbGFiZWwgIktleSBiaW5kaW5ncyIgLWNvbW1hbmQga2V5cwogICAgLmJhci5oZWxwIGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CiAgICAuIGNvbmZpZ3VyZSAtbWVudSAuYmFyCgogICAgaWYgeyFbaW5mbyBleGlzdHMgZ2VvbWV0cnkoY2FudjEpXX0gewoJc2V0IGdlb21ldHJ5KGNhbnYxKSBbZXhwciB7NDUgKiAkY2hhcnNwY31dCglzZXQgZ2VvbWV0cnkoY2FudjIpIFtleHByIHszMCAqICRjaGFyc3BjfV0KCXNldCBnZW9tZXRyeShjYW52MykgW2V4cHIgezE1ICogJGNoYXJzcGN9XQoJc2V0IGdlb21ldHJ5KGNhbnZoKSBbZXhwciB7MjUgKiAkbGluZXNwYyArIDR9XQoJc2V0IGdlb21ldHJ5KGN0ZXh0dykgODAKCXNldCBnZW9tZXRyeShjdGV4dGgpIDMwCglzZXQgZ2VvbWV0cnkoY2ZsaXN0dykgMzAKICAgIH0KICAgIHBhbmVkd2luZG93IC5jdG9wIC1vcmllbnQgdmVydGljYWwKICAgIGlmIHtbaW5mbyBleGlzdHMgZ2VvbWV0cnkod2lkdGgpXX0gewoJLmN0b3AgY29uZiAtd2lkdGggJGdlb21ldHJ5KHdpZHRoKSAtaGVpZ2h0ICRnZW9tZXRyeShoZWlnaHQpCglzZXQgdGV4dGggW2V4cHIgeyRnZW9tZXRyeShoZWlnaHQpIC0gJGdlb21ldHJ5KGNhbnZoKSAtIDU2fV0KCXNldCBnZW9tZXRyeShjdGV4dGgpIFtleHByIHsoJHRleHRoIC0gOCkgLwoJCQkJICAgIFtmb250IG1ldHJpY3MgJHRleHRmb250IC1saW5lc3BhY2VdfV0KICAgIH0KICAgIGZyYW1lIC5jdG9wLnRvcAogICAgZnJhbWUgLmN0b3AudG9wLmJhcgogICAgZnJhbWUgLmN0b3AudG9wLmxiYXIKICAgIHBhY2sgLmN0b3AudG9wLmxiYXIgLXNpZGUgYm90dG9tIC1maWxsIHgKICAgIHBhY2sgLmN0b3AudG9wLmJhciAtc2lkZSBib3R0b20gLWZpbGwgeAogICAgc2V0IGNzY3JvbGwgLmN0b3AudG9wLmNzYgogICAgc2Nyb2xsYmFyICRjc2Nyb2xsIC1jb21tYW5kIHthbGxjYW52cyB5dmlld30gLWhpZ2hsaWdodHRoaWNrbmVzcyAwCiAgICBwYWNrICRjc2Nyb2xsIC1zaWRlIHJpZ2h0IC1maWxsIHkKICAgIHBhbmVkd2luZG93IC5jdG9wLnRvcC5jbGlzdCAtb3JpZW50IGhvcml6b250YWwgLXNhc2hwYWQgMCAtaGFuZGxlc2l6ZSA0CiAgICBwYWNrIC5jdG9wLnRvcC5jbGlzdCAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEKICAgIC5jdG9wIGFkZCAuY3RvcC50b3AKICAgIHNldCBjYW52IC5jdG9wLnRvcC5jbGlzdC5jYW52CiAgICBjYW52YXMgJGNhbnYgLWhlaWdodCAkZ2VvbWV0cnkoY2FudmgpIC13aWR0aCAkZ2VvbWV0cnkoY2FudjEpIFwKCS1iYWNrZ3JvdW5kICRiZ2NvbG9yIC1iZCAwIFwKCS15c2Nyb2xsaW5jciAkbGluZXNwYyAteXNjcm9sbGNvbW1hbmQgInNjcm9sbGNhbnYgJGNzY3JvbGwiCiAgICAuY3RvcC50b3AuY2xpc3QgYWRkICRjYW52CiAgICBzZXQgY2FudjIgLmN0b3AudG9wLmNsaXN0LmNhbnYyCiAgICBjYW52YXMgJGNhbnYyIC1oZWlnaHQgJGdlb21ldHJ5KGNhbnZoKSAtd2lkdGggJGdlb21ldHJ5KGNhbnYyKSBcCgktYmFja2dyb3VuZCAkYmdjb2xvciAtYmQgMCAteXNjcm9sbGluY3IgJGxpbmVzcGMKICAgIC5jdG9wLnRvcC5jbGlzdCBhZGQgJGNhbnYyCiAgICBzZXQgY2FudjMgLmN0b3AudG9wLmNsaXN0LmNhbnYzCiAgICBjYW52YXMgJGNhbnYzIC1oZWlnaHQgJGdlb21ldHJ5KGNhbnZoKSAtd2lkdGggJGdlb21ldHJ5KGNhbnYzKSBcCgktYmFja2dyb3VuZCAkYmdjb2xvciAtYmQgMCAteXNjcm9sbGluY3IgJGxpbmVzcGMKICAgIC5jdG9wLnRvcC5jbGlzdCBhZGQgJGNhbnYzCiAgICBiaW5kIC5jdG9wLnRvcC5jbGlzdCA8Q29uZmlndXJlPiB7cmVzaXplY2xpc3RwYW5lcyAlVyAld30KICAgIGxhcHBlbmQgYmdsaXN0ICRjYW52ICRjYW52MiAkY2FudjMKCiAgICBzZXQgc2hhMWVudHJ5IC5jdG9wLnRvcC5iYXIuc2hhMQogICAgc2V0IGVudHJpZXMgJHNoYTFlbnRyeQogICAgc2V0IHNoYTFidXQgLmN0b3AudG9wLmJhci5zaGExbGFiZWwKICAgIGJ1dHRvbiAkc2hhMWJ1dCAtdGV4dCAiU0hBMSBJRDogIiAtc3RhdGUgZGlzYWJsZWQgLXJlbGllZiBmbGF0IFwKCS1jb21tYW5kIGdvdG9jb21taXQgLXdpZHRoIDggLWZvbnQgJHVpZm9udAogICAgJHNoYTFidXQgY29uZiAtZGlzYWJsZWRmb3JlZ3JvdW5kIFskc2hhMWJ1dCBjZ2V0IC1mb3JlZ3JvdW5kXQogICAgcGFjayAuY3RvcC50b3AuYmFyLnNoYTFsYWJlbCAtc2lkZSBsZWZ0CiAgICBlbnRyeSAkc2hhMWVudHJ5IC13aWR0aCA0MCAtZm9udCAkdGV4dGZvbnQgLXRleHR2YXJpYWJsZSBzaGExc3RyaW5nCiAgICB0cmFjZSBhZGQgdmFyaWFibGUgc2hhMXN0cmluZyB3cml0ZSBzaGExY2hhbmdlCiAgICBwYWNrICRzaGExZW50cnkgLXNpZGUgbGVmdCAtcGFkeSAyCgogICAgaW1hZ2UgY3JlYXRlIGJpdG1hcCBibS1sZWZ0IC1kYXRhIHsKCSNkZWZpbmUgbGVmdF93aWR0aCAxNgoJI2RlZmluZSBsZWZ0X2hlaWdodCAxNgoJc3RhdGljIHVuc2lnbmVkIGNoYXIgbGVmdF9iaXRzW10gPSB7CgkweDAwLCAweDAwLCAweGMwLCAweDAxLCAweGUwLCAweDAwLCAweDcwLCAweDAwLCAweDM4LCAweDAwLCAweDFjLCAweDAwLAoJMHgwZSwgMHgwMCwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHhmZiwgMHg3ZiwgMHgwZSwgMHgwMCwgMHgxYywgMHgwMCwKCTB4MzgsIDB4MDAsIDB4NzAsIDB4MDAsIDB4ZTAsIDB4MDAsIDB4YzAsIDB4MDF9OwogICAgfQogICAgaW1hZ2UgY3JlYXRlIGJpdG1hcCBibS1yaWdodCAtZGF0YSB7CgkjZGVmaW5lIHJpZ2h0X3dpZHRoIDE2CgkjZGVmaW5lIHJpZ2h0X2hlaWdodCAxNgoJc3RhdGljIHVuc2lnbmVkIGNoYXIgcmlnaHRfYml0c1tdID0gewoJMHgwMCwgMHgwMCwgMHhjMCwgMHgwMSwgMHg4MCwgMHgwMywgMHgwMCwgMHgwNywgMHgwMCwgMHgwZSwgMHgwMCwgMHgxYywKCTB4MDAsIDB4MzgsIDB4ZmYsIDB4N2YsIDB4ZmYsIDB4N2YsIDB4ZmYsIDB4N2YsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MWMsCgkweDAwLCAweDBlLCAweDAwLCAweDA3LCAweDgwLCAweDAzLCAweGMwLCAweDAxfTsKICAgIH0KICAgIGJ1dHRvbiAuY3RvcC50b3AuYmFyLmxlZnRidXQgLWltYWdlIGJtLWxlZnQgLWNvbW1hbmQgZ29iYWNrIFwKCS1zdGF0ZSBkaXNhYmxlZCAtd2lkdGggMjYKICAgIHBhY2sgLmN0b3AudG9wLmJhci5sZWZ0YnV0IC1zaWRlIGxlZnQgLWZpbGwgeQogICAgYnV0dG9uIC5jdG9wLnRvcC5iYXIucmlnaHRidXQgLWltYWdlIGJtLXJpZ2h0IC1jb21tYW5kIGdvZm9ydyBcCgktc3RhdGUgZGlzYWJsZWQgLXdpZHRoIDI2CiAgICBwYWNrIC5jdG9wLnRvcC5iYXIucmlnaHRidXQgLXNpZGUgbGVmdCAtZmlsbCB5CgogICAgYnV0dG9uIC5jdG9wLnRvcC5iYXIuZmluZGJ1dCAtdGV4dCAiRmluZCIgLWNvbW1hbmQgZG9maW5kIC1mb250ICR1aWZvbnQKICAgIHBhY2sgLmN0b3AudG9wLmJhci5maW5kYnV0IC1zaWRlIGxlZnQKICAgIHNldCBmaW5kc3RyaW5nIHt9CiAgICBzZXQgZnN0cmluZyAuY3RvcC50b3AuYmFyLmZpbmRzdHJpbmcKICAgIGxhcHBlbmQgZW50cmllcyAkZnN0cmluZwogICAgZW50cnkgJGZzdHJpbmcgLXdpZHRoIDMwIC1mb250ICR0ZXh0Zm9udCAtdGV4dHZhcmlhYmxlIGZpbmRzdHJpbmcKICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBmaW5kc3RyaW5nIHdyaXRlIGZpbmRfY2hhbmdlCiAgICBwYWNrICRmc3RyaW5nIC1zaWRlIGxlZnQgLWV4cGFuZCAxIC1maWxsIHgKICAgIHNldCBmaW5kdHlwZSBFeGFjdAogICAgc2V0IGZpbmR0eXBlbWVudSBbdGtfb3B0aW9uTWVudSAuY3RvcC50b3AuYmFyLmZpbmR0eXBlIFwKCQkJICBmaW5kdHlwZSBFeGFjdCBJZ25DYXNlIFJlZ2V4cF0KICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBmaW5kdHlwZSB3cml0ZSBmaW5kX2NoYW5nZQogICAgLmN0b3AudG9wLmJhci5maW5kdHlwZSBjb25maWd1cmUgLWZvbnQgJHVpZm9udAogICAgLmN0b3AudG9wLmJhci5maW5kdHlwZS5tZW51IGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CiAgICBzZXQgZmluZGxvYyAiQWxsIGZpZWxkcyIKICAgIHRrX29wdGlvbk1lbnUgLmN0b3AudG9wLmJhci5maW5kbG9jIGZpbmRsb2MgIkFsbCBmaWVsZHMiIEhlYWRsaW5lIFwKCUNvbW1lbnRzIEF1dGhvciBDb21taXR0ZXIKICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBmaW5kbG9jIHdyaXRlIGZpbmRfY2hhbmdlCiAgICAuY3RvcC50b3AuYmFyLmZpbmRsb2MgY29uZmlndXJlIC1mb250ICR1aWZvbnQKICAgIC5jdG9wLnRvcC5iYXIuZmluZGxvYy5tZW51IGNvbmZpZ3VyZSAtZm9udCAkdWlmb250CiAgICBwYWNrIC5jdG9wLnRvcC5iYXIuZmluZGxvYyAtc2lkZSByaWdodAogICAgcGFjayAuY3RvcC50b3AuYmFyLmZpbmR0eXBlIC1zaWRlIHJpZ2h0CgogICAgbGFiZWwgLmN0b3AudG9wLmxiYXIuZmxhYmVsIC10ZXh0ICJIaWdobGlnaHQ6ICBDb21taXRzICIgXAoJLWZvbnQgJHVpZm9udAogICAgcGFjayAuY3RvcC50b3AubGJhci5mbGFiZWwgLXNpZGUgbGVmdCAtZmlsbCB5CiAgICBzZXQgZ2R0dHlwZSAidG91Y2hpbmcgcGF0aHM6IgogICAgc2V0IGdtIFt0a19vcHRpb25NZW51IC5jdG9wLnRvcC5sYmFyLmdkdHR5cGUgZ2R0dHlwZSAidG91Y2hpbmcgcGF0aHM6IiBcCgkJImFkZGluZy9yZW1vdmluZyBzdHJpbmc6Il0KICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBnZHR0eXBlIHdyaXRlIGhmaWxlc19jaGFuZ2UKICAgICRnbSBjb25mIC1mb250ICR1aWZvbnQKICAgIC5jdG9wLnRvcC5sYmFyLmdkdHR5cGUgY29uZiAtZm9udCAkdWlmb250CiAgICBwYWNrIC5jdG9wLnRvcC5sYmFyLmdkdHR5cGUgLXNpZGUgbGVmdCAtZmlsbCB5CiAgICBlbnRyeSAuY3RvcC50b3AubGJhci5mZW50IC13aWR0aCAyNSAtZm9udCAkdGV4dGZvbnQgXAoJLXRleHR2YXJpYWJsZSBoaWdobGlnaHRfZmlsZXMKICAgIHRyYWNlIGFkZCB2YXJpYWJsZSBoaWdobGlnaHRfZmlsZXMgd3JpdGUgaGZpbGVzX2NoYW5nZQogICAgbGFwcGVuZCBlbnRyaWVzIC5jdG9wLnRvcC5sYmFyLmZlbnQKICAgIHBhY2sgLmN0b3AudG9wLmxiYXIuZmVudCAtc2lkZSBsZWZ0IC1maWxsIHggLWV4cGFuZCAxCiAgICBsYWJlbCAuY3RvcC50b3AubGJhci52bGFiZWwgLXRleHQgIiBPUiBpbiB2aWV3IiAtZm9udCAkdWlmb250CiAgICBwYWNrIC5jdG9wLnRvcC5sYmFyLnZsYWJlbCAtc2lkZSBsZWZ0IC1maWxsIHkKICAgIGdsb2JhbCB2aWV3aGxtZW51IHNlbGVjdGVkaGx2aWV3CiAgICBzZXQgdmlld2hsbWVudSBbdGtfb3B0aW9uTWVudSAuY3RvcC50b3AubGJhci52aGwgc2VsZWN0ZWRobHZpZXcgTm9uZV0KICAgICR2aWV3aGxtZW51IGVudHJ5Y29uZiAwIC1jb21tYW5kIGRlbHZoaWdobGlnaHQKICAgICR2aWV3aGxtZW51IGNvbmYgLWZvbnQgJHVpZm9udAogICAgLmN0b3AudG9wLmxiYXIudmhsIGNvbmYgLWZvbnQgJHVpZm9udAogICAgcGFjayAuY3RvcC50b3AubGJhci52aGwgLXNpZGUgbGVmdCAtZmlsbCB5CiAgICBsYWJlbCAuY3RvcC50b3AubGJhci5ybGFiZWwgLXRleHQgIiBPUiAiIC1mb250ICR1aWZvbnQKICAgIHBhY2sgLmN0b3AudG9wLmxiYXIucmxhYmVsIC1zaWRlIGxlZnQgLWZpbGwgeQogICAgZ2xvYmFsIGhpZ2hsaWdodF9yZWxhdGVkCiAgICBzZXQgbSBbdGtfb3B0aW9uTWVudSAuY3RvcC50b3AubGJhci5yZWxtIGhpZ2hsaWdodF9yZWxhdGVkIE5vbmUgXAoJICAgICAgICJEZXNjZW5kZW50IiAiTm90IGRlc2NlbmRlbnQiICJBbmNlc3RvciIgIk5vdCBhbmNlc3RvciJdCiAgICAkbSBjb25mIC1mb250ICR1aWZvbnQKICAgIC5jdG9wLnRvcC5sYmFyLnJlbG0gY29uZiAtZm9udCAkdWlmb250CiAgICB0cmFjZSBhZGQgdmFyaWFibGUgaGlnaGxpZ2h0X3JlbGF0ZWQgd3JpdGUgdnJlbF9jaGFuZ2UKICAgIHBhY2sgLmN0b3AudG9wLmxiYXIucmVsbSAtc2lkZSBsZWZ0IC1maWxsIHkKCiAgICBwYW5lZHdpbmRvdyAuY3RvcC5jZGV0IC1vcmllbnQgaG9yaXpvbnRhbAogICAgLmN0b3AgYWRkIC5jdG9wLmNkZXQKICAgIGZyYW1lIC5jdG9wLmNkZXQubGVmdAogICAgZnJhbWUgLmN0b3AuY2RldC5sZWZ0LmJvdAogICAgcGFjayAuY3RvcC5jZGV0LmxlZnQuYm90IC1zaWRlIGJvdHRvbSAtZmlsbCB4CiAgICBidXR0b24gLmN0b3AuY2RldC5sZWZ0LmJvdC5zZWFyY2ggLXRleHQgIlNlYXJjaCIgLWNvbW1hbmQgZG9zZWFyY2ggXAoJLWZvbnQgJHVpZm9udAogICAgcGFjayAuY3RvcC5jZGV0LmxlZnQuYm90LnNlYXJjaCAtc2lkZSBsZWZ0IC1wYWR4IDUKICAgIHNldCBzc3RyaW5nIC5jdG9wLmNkZXQubGVmdC5ib3Quc3N0cmluZwogICAgZW50cnkgJHNzdHJpbmcgLXdpZHRoIDIwIC1mb250ICR0ZXh0Zm9udCAtdGV4dHZhcmlhYmxlIHNlYXJjaHN0cmluZwogICAgbGFwcGVuZCBlbnRyaWVzICRzc3RyaW5nCiAgICB0cmFjZSBhZGQgdmFyaWFibGUgc2VhcmNoc3RyaW5nIHdyaXRlIGluY3JzZWFyY2gKICAgIHBhY2sgJHNzdHJpbmcgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLWZpbGwgeAogICAgc2V0IGN0ZXh0IC5jdG9wLmNkZXQubGVmdC5jdGV4dAogICAgdGV4dCAkY3RleHQgLWJhY2tncm91bmQgJGJnY29sb3IgLWZvcmVncm91bmQgJGZnY29sb3IgXAoJLXN0YXRlIGRpc2FibGVkIC1mb250ICR0ZXh0Zm9udCBcCgktd2lkdGggJGdlb21ldHJ5KGN0ZXh0dykgLWhlaWdodCAkZ2VvbWV0cnkoY3RleHRoKSBcCgkteXNjcm9sbGNvbW1hbmQgc2Nyb2xsdGV4dCAtd3JhcCBub25lCiAgICBzY3JvbGxiYXIgLmN0b3AuY2RldC5sZWZ0LnNiIC1jb21tYW5kICIkY3RleHQgeXZpZXciCiAgICBwYWNrIC5jdG9wLmNkZXQubGVmdC5zYiAtc2lkZSByaWdodCAtZmlsbCB5CiAgICBwYWNrICRjdGV4dCAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCiAgICAuY3RvcC5jZGV0IGFkZCAuY3RvcC5jZGV0LmxlZnQKICAgIGxhcHBlbmQgYmdsaXN0ICRjdGV4dAogICAgbGFwcGVuZCBmZ2xpc3QgJGN0ZXh0CgogICAgJGN0ZXh0IHRhZyBjb25mIGNvbW1lbnQgLXdyYXAgJHdyYXBjb21tZW50CiAgICAkY3RleHQgdGFnIGNvbmYgZmlsZXNlcCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXSAtYmFjayAiI2FhYWFhYSIKICAgICRjdGV4dCB0YWcgY29uZiBodW5rc2VwIC1mb3JlIFtsaW5kZXggJGRpZmZjb2xvcnMgMl0KICAgICRjdGV4dCB0YWcgY29uZiBkMCAtZm9yZSBbbGluZGV4ICRkaWZmY29sb3JzIDBdCiAgICAkY3RleHQgdGFnIGNvbmYgZDEgLWZvcmUgW2xpbmRleCAkZGlmZmNvbG9ycyAxXQogICAgJGN0ZXh0IHRhZyBjb25mIG0wIC1mb3JlIHJlZAogICAgJGN0ZXh0IHRhZyBjb25mIG0xIC1mb3JlIGJsdWUKICAgICRjdGV4dCB0YWcgY29uZiBtMiAtZm9yZSBncmVlbgogICAgJGN0ZXh0IHRhZyBjb25mIG0zIC1mb3JlIHB1cnBsZQogICAgJGN0ZXh0IHRhZyBjb25mIG00IC1mb3JlIGJyb3duCiAgICAkY3RleHQgdGFnIGNvbmYgbTUgLWZvcmUgIiMwMDkwOTAiCiAgICAkY3RleHQgdGFnIGNvbmYgbTYgLWZvcmUgbWFnZW50YQogICAgJGN0ZXh0IHRhZyBjb25mIG03IC1mb3JlICIjODA4MDAwIgogICAgJGN0ZXh0IHRhZyBjb25mIG04IC1mb3JlICIjMDA5MDAwIgogICAgJGN0ZXh0IHRhZyBjb25mIG05IC1mb3JlICIjZmYwMDgwIgogICAgJGN0ZXh0IHRhZyBjb25mIG0xMCAtZm9yZSBjeWFuCiAgICAkY3RleHQgdGFnIGNvbmYgbTExIC1mb3JlICIjYjA3MDcwIgogICAgJGN0ZXh0IHRhZyBjb25mIG0xMiAtZm9yZSAiIzcwYjBmMCIKICAgICRjdGV4dCB0YWcgY29uZiBtMTMgLWZvcmUgIiM3MGYwYjAiCiAgICAkY3RleHQgdGFnIGNvbmYgbTE0IC1mb3JlICIjZjBiMDcwIgogICAgJGN0ZXh0IHRhZyBjb25mIG0xNSAtZm9yZSAiI2ZmNzBiMCIKICAgICRjdGV4dCB0YWcgY29uZiBtbWF4IC1mb3JlIGRhcmtncmV5CiAgICBzZXQgbWVyZ2VtYXggMTYKICAgICRjdGV4dCB0YWcgY29uZiBtcmVzdWx0IC1mb250IFtjb25jYXQgJHRleHRmb250IGJvbGRdCiAgICAkY3RleHQgdGFnIGNvbmYgbXNlcCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXQogICAgJGN0ZXh0IHRhZyBjb25mIGZvdW5kIC1iYWNrIHllbGxvdwoKICAgIGZyYW1lIC5jdG9wLmNkZXQucmlnaHQKICAgIGZyYW1lIC5jdG9wLmNkZXQucmlnaHQubW9kZQogICAgcmFkaW9idXR0b24gLmN0b3AuY2RldC5yaWdodC5tb2RlLnBhdGNoIC10ZXh0ICJQYXRjaCIgXAoJLWNvbW1hbmQgcmVzZWxlY3RsaW5lIC12YXJpYWJsZSBjbWl0bW9kZSAtdmFsdWUgInBhdGNoIgogICAgcmFkaW9idXR0b24gLmN0b3AuY2RldC5yaWdodC5tb2RlLnRyZWUgLXRleHQgIlRyZWUiIFwKCS1jb21tYW5kIHJlc2VsZWN0bGluZSAtdmFyaWFibGUgY21pdG1vZGUgLXZhbHVlICJ0cmVlIgogICAgZ3JpZCAuY3RvcC5jZGV0LnJpZ2h0Lm1vZGUucGF0Y2ggLmN0b3AuY2RldC5yaWdodC5tb2RlLnRyZWUgLXN0aWNreSBldwogICAgcGFjayAuY3RvcC5jZGV0LnJpZ2h0Lm1vZGUgLXNpZGUgdG9wIC1maWxsIHgKICAgIHNldCBjZmxpc3QgLmN0b3AuY2RldC5yaWdodC5jZmlsZXMKICAgIHNldCBpbmRlbnQgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgIm5uIl0KICAgIHRleHQgJGNmbGlzdCAtd2lkdGggJGdlb21ldHJ5KGNmbGlzdHcpIFwKCS1iYWNrZ3JvdW5kICRiZ2NvbG9yIC1mb3JlZ3JvdW5kICRmZ2NvbG9yIFwKCS1mb250ICRtYWluZm9udCBcCgktdGFicyBbbGlzdCAkaW5kZW50IFtleHByIHsyICogJGluZGVudH1dXSBcCgkteXNjcm9sbGNvbW1hbmQgIi5jdG9wLmNkZXQucmlnaHQuc2Igc2V0IiBcCgktY3Vyc29yIFsuIGNnZXQgLWN1cnNvcl0gXAoJLXNwYWNpbmcxIDEgLXNwYWNpbmczIDEKICAgIGxhcHBlbmQgYmdsaXN0ICRjZmxpc3QKICAgIGxhcHBlbmQgZmdsaXN0ICRjZmxpc3QKICAgIHNjcm9sbGJhciAuY3RvcC5jZGV0LnJpZ2h0LnNiIC1jb21tYW5kICIkY2ZsaXN0IHl2aWV3IgogICAgcGFjayAuY3RvcC5jZGV0LnJpZ2h0LnNiIC1zaWRlIHJpZ2h0IC1maWxsIHkKICAgIHBhY2sgJGNmbGlzdCAtc2lkZSBsZWZ0IC1maWxsIGJvdGggLWV4cGFuZCAxCiAgICAkY2ZsaXN0IHRhZyBjb25maWd1cmUgaGlnaGxpZ2h0IFwKCS1iYWNrZ3JvdW5kIFskY2ZsaXN0IGNnZXQgLXNlbGVjdGJhY2tncm91bmRdCiAgICAkY2ZsaXN0IHRhZyBjb25maWd1cmUgYm9sZCAtZm9udCBbY29uY2F0ICRtYWluZm9udCBib2xkXQogICAgLmN0b3AuY2RldCBhZGQgLmN0b3AuY2RldC5yaWdodAogICAgYmluZCAuY3RvcC5jZGV0IDxDb25maWd1cmU+IHtyZXNpemVjZGV0cGFuZXMgJVcgJXd9CgogICAgcGFjayAuY3RvcCAtc2lkZSB0b3AgLWZpbGwgYm90aCAtZXhwYW5kIDEKCiAgICBiaW5kYWxsIDwxPiB7c2VsY2FudmxpbmUgJVcgJXggJXl9CiAgICAjYmluZGFsbCA8QjEtTW90aW9uPiB7c2VsY2FudmxpbmUgJVcgJXggJXl9CiAgICBiaW5kYWxsIDxCdXR0b25SZWxlYXNlLTQ+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgLTUgdW5pdHMiCiAgICBiaW5kYWxsIDxCdXR0b25SZWxlYXNlLTU+ICJhbGxjYW52cyB5dmlldyBzY3JvbGwgNSB1bml0cyIKICAgIGJpbmRhbGwgPDI+ICJjYW52c2NhbiBtYXJrICVXICV4ICV5IgogICAgYmluZGFsbCA8QjItTW90aW9uPiAiY2FudnNjYW4gZHJhZ3RvICVXICV4ICV5IgogICAgYmluZGtleSA8SG9tZT4gc2VsZmlyc3RsaW5lCiAgICBiaW5ka2V5IDxFbmQ+IHNlbGxhc3RsaW5lCiAgICBiaW5kIC4gPEtleS1VcD4gInNlbG5leHRsaW5lIC0xIgogICAgYmluZCAuIDxLZXktRG93bj4gInNlbG5leHRsaW5lIDEiCiAgICBiaW5kIC4gPFNoaWZ0LUtleS1VcD4gIm5leHRfaGlnaGxpZ2h0IC0xIgogICAgYmluZCAuIDxTaGlmdC1LZXktRG93bj4gIm5leHRfaGlnaGxpZ2h0IDEiCiAgICBiaW5ka2V5IDxLZXktUmlnaHQ+ICJnb2ZvcnciCiAgICBiaW5ka2V5IDxLZXktTGVmdD4gImdvYmFjayIKICAgIGJpbmQgLiA8S2V5LVByaW9yPiAic2VsbmV4dHBhZ2UgLTEiCiAgICBiaW5kIC4gPEtleS1OZXh0PiAic2VsbmV4dHBhZ2UgMSIKICAgIGJpbmQgLiA8Q29udHJvbC1Ib21lPiAiYWxsY2FudnMgeXZpZXcgbW92ZXRvIDAuMCIKICAgIGJpbmQgLiA8Q29udHJvbC1FbmQ+ICJhbGxjYW52cyB5dmlldyBtb3ZldG8gMS4wIgogICAgYmluZCAuIDxDb250cm9sLUtleS1VcD4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAtMSB1bml0cyIKICAgIGJpbmQgLiA8Q29udHJvbC1LZXktRG93bj4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAxIHVuaXRzIgogICAgYmluZCAuIDxDb250cm9sLUtleS1Qcmlvcj4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKICAgIGJpbmQgLiA8Q29udHJvbC1LZXktTmV4dD4gImFsbGNhbnZzIHl2aWV3IHNjcm9sbCAxIHBhZ2VzIgogICAgYmluZGtleSA8S2V5LURlbGV0ZT4gIiRjdGV4dCB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5ka2V5IDxLZXktQmFja1NwYWNlPiAiJGN0ZXh0IHl2aWV3IHNjcm9sbCAtMSBwYWdlcyIKICAgIGJpbmRrZXkgPEtleS1zcGFjZT4gIiRjdGV4dCB5dmlldyBzY3JvbGwgMSBwYWdlcyIKICAgIGJpbmRrZXkgcCAic2VsbmV4dGxpbmUgLTEiCiAgICBiaW5ka2V5IG4gInNlbG5leHRsaW5lIDEiCiAgICBiaW5ka2V5IHogImdvYmFjayIKICAgIGJpbmRrZXkgeCAiZ29mb3J3IgogICAgYmluZGtleSBpICJzZWxuZXh0bGluZSAtMSIKICAgIGJpbmRrZXkgayAic2VsbmV4dGxpbmUgMSIKICAgIGJpbmRrZXkgaiAiZ29iYWNrIgogICAgYmluZGtleSBsICJnb2ZvcnciCiAgICBiaW5ka2V5IGIgIiRjdGV4dCB5dmlldyBzY3JvbGwgLTEgcGFnZXMiCiAgICBiaW5ka2V5IGQgIiRjdGV4dCB5dmlldyBzY3JvbGwgMTggdW5pdHMiCiAgICBiaW5ka2V5IHUgIiRjdGV4dCB5dmlldyBzY3JvbGwgLTE4IHVuaXRzIgogICAgYmluZGtleSAvIHtmaW5kbmV4dCAxfQogICAgYmluZGtleSA8S2V5LVJldHVybj4ge2ZpbmRuZXh0IDB9CiAgICBiaW5ka2V5ID8gZmluZHByZXYKICAgIGJpbmRrZXkgZiBuZXh0ZmlsZQogICAgYmluZCAuIDxDb250cm9sLXE+IGRvcXVpdAogICAgYmluZCAuIDxDb250cm9sLWY+IGRvZmluZAogICAgYmluZCAuIDxDb250cm9sLWc+IHtmaW5kbmV4dCAwfQogICAgYmluZCAuIDxDb250cm9sLXI+IGRvc2VhcmNoYmFjawogICAgYmluZCAuIDxDb250cm9sLXM+IGRvc2VhcmNoCiAgICBiaW5kIC4gPENvbnRyb2wtZXF1YWw+IHtpbmNyZm9udCAxfQogICAgYmluZCAuIDxDb250cm9sLUtQX0FkZD4ge2luY3Jmb250IDF9CiAgICBiaW5kIC4gPENvbnRyb2wtbWludXM+IHtpbmNyZm9udCAtMX0KICAgIGJpbmQgLiA8Q29udHJvbC1LUF9TdWJ0cmFjdD4ge2luY3Jmb250IC0xfQogICAgYmluZCAuIDxEZXN0cm95PiB7c2F2ZXN0dWZmICVXfQogICAgYmluZCAuIDxCdXR0b24tMT4gImNsaWNrICVXIgogICAgYmluZCAkZnN0cmluZyA8S2V5LVJldHVybj4gZG9maW5kCiAgICBiaW5kICRzaGExZW50cnkgPEtleS1SZXR1cm4+IGdvdG9jb21taXQKICAgIGJpbmQgJHNoYTFlbnRyeSA8PFBhc3RlU2VsZWN0aW9uPj4gY2xlYXJzaGExCiAgICBiaW5kICRjZmxpc3QgPDE+IHtzZWxfZmxpc3QgJVcgJXggJXk7IGJyZWFrfQogICAgYmluZCAkY2ZsaXN0IDxCMS1Nb3Rpb24+IHtzZWxfZmxpc3QgJVcgJXggJXk7IGJyZWFrfQogICAgYmluZCAkY2ZsaXN0IDxCdXR0b25SZWxlYXNlLTE+IHt0cmVlY2xpY2sgJVcgJXggJXl9CgogICAgc2V0IG1haW5jdXJzb3IgWy4gY2dldCAtY3Vyc29yXQogICAgc2V0IHRleHRjdXJzb3IgWyRjdGV4dCBjZ2V0IC1jdXJzb3JdCiAgICBzZXQgY3VydGV4dGN1cnNvciAkdGV4dGN1cnNvcgoKICAgIHNldCByb3djdHhtZW51IC5yb3djdHhtZW51CiAgICBtZW51ICRyb3djdHhtZW51IC10ZWFyb2ZmIDAKICAgICRyb3djdHhtZW51IGFkZCBjb21tYW5kIC1sYWJlbCAiRGlmZiB0aGlzIC0+IHNlbGVjdGVkIiBcCgktY29tbWFuZCB7ZGlmZnZzc2VsIDB9CiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkRpZmYgc2VsZWN0ZWQgLT4gdGhpcyIgXAoJLWNvbW1hbmQge2RpZmZ2c3NlbCAxfQogICAgJHJvd2N0eG1lbnUgYWRkIGNvbW1hbmQgLWxhYmVsICJNYWtlIHBhdGNoIiAtY29tbWFuZCBta3BhdGNoCiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIkNyZWF0ZSB0YWciIC1jb21tYW5kIG1rdGFnCiAgICAkcm93Y3R4bWVudSBhZGQgY29tbWFuZCAtbGFiZWwgIldyaXRlIGNvbW1pdCB0byBmaWxlIiAtY29tbWFuZCB3cml0ZWNvbW1pdAp9CgojIG1vdXNlLTIgbWFrZXMgYWxsIHdpbmRvd3Mgc2NhbiB2ZXJ0aWNhbGx5LCBidXQgb25seSB0aGUgb25lCiMgdGhlIGN1cnNvciBpcyBpbiBzY2FucyBob3Jpem9udGFsbHkKcHJvYyBjYW52c2NhbiB7b3AgdyB4IHl9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzCiAgICBmb3JlYWNoIGMgW2xpc3QgJGNhbnYgJGNhbnYyICRjYW52M10gewoJaWYgeyRjID09ICR3fSB7CgkgICAgJGMgc2NhbiAkb3AgJHggJHkKCX0gZWxzZSB7CgkgICAgJGMgc2NhbiAkb3AgMCAkeQoJfQogICAgfQp9Cgpwcm9jIHNjcm9sbGNhbnYge2NzY3JvbGwgZjAgZjF9IHsKICAgICRjc2Nyb2xsIHNldCAkZjAgJGYxCiAgICBkcmF3ZnJhYyAkZjAgJGYxCiAgICBmbHVzaGhpZ2hsaWdodHMKfQoKIyB3aGVuIHdlIG1ha2UgYSBrZXkgYmluZGluZyBmb3IgdGhlIHRvcGxldmVsLCBtYWtlIHN1cmUKIyBpdCBkb2Vzbid0IGdldCB0cmlnZ2VyZWQgd2hlbiB0aGF0IGtleSBpcyBwcmVzc2VkIGluIHRoZQojIGZpbmQgc3RyaW5nIGVudHJ5IHdpZGdldC4KcHJvYyBiaW5ka2V5IHtldiBzY3JpcHR9IHsKICAgIGdsb2JhbCBlbnRyaWVzCiAgICBiaW5kIC4gJGV2ICRzY3JpcHQKICAgIHNldCBlc2NyaXB0IFtiaW5kIEVudHJ5ICRldl0KICAgIGlmIHskZXNjcmlwdCA9PSB7fX0gewoJc2V0IGVzY3JpcHQgW2JpbmQgRW50cnkgPEtleT5dCiAgICB9CiAgICBmb3JlYWNoIGUgJGVudHJpZXMgewoJYmluZCAkZSAkZXYgIiRlc2NyaXB0OyBicmVhayIKICAgIH0KfQoKIyBzZXQgdGhlIGZvY3VzIGJhY2sgdG8gdGhlIHRvcGxldmVsIGZvciBhbnkgY2xpY2sgb3V0c2lkZQojIHRoZSBlbnRyeSB3aWRnZXRzCnByb2MgY2xpY2sge3d9IHsKICAgIGdsb2JhbCBlbnRyaWVzCiAgICBmb3JlYWNoIGUgJGVudHJpZXMgewoJaWYgeyR3ID09ICRlfSByZXR1cm4KICAgIH0KICAgIGZvY3VzIC4KfQoKcHJvYyBzYXZlc3R1ZmYge3d9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIGN0ZXh0IGNmbGlzdCBtYWluZm9udCB0ZXh0Zm9udCB1aWZvbnQKICAgIGdsb2JhbCBzdHVmZnNhdmVkIGZpbmRtZXJnZWZpbGVzIG1heGdyYXBocGN0CiAgICBnbG9iYWwgbWF4d2lkdGggc2hvd25lYXJ0YWdzCiAgICBnbG9iYWwgdmlld25hbWUgdmlld2ZpbGVzIHZpZXdhcmdzIHZpZXdwZXJtIG5leHR2aWV3bnVtCiAgICBnbG9iYWwgY21pdG1vZGUgd3JhcGNvbW1lbnQKICAgIGdsb2JhbCBjb2xvcnMgYmdjb2xvciBmZ2NvbG9yIGRpZmZjb2xvcnMKCiAgICBpZiB7JHN0dWZmc2F2ZWR9IHJldHVybgogICAgaWYgeyFbd2luZm8gdmlld2FibGUgLl19IHJldHVybgogICAgY2F0Y2ggewoJc2V0IGYgW29wZW4gIn4vLmdpdGstbmV3IiB3XQoJcHV0cyAkZiBbbGlzdCBzZXQgbWFpbmZvbnQgJG1haW5mb250XQoJcHV0cyAkZiBbbGlzdCBzZXQgdGV4dGZvbnQgJHRleHRmb250XQoJcHV0cyAkZiBbbGlzdCBzZXQgdWlmb250ICR1aWZvbnRdCglwdXRzICRmIFtsaXN0IHNldCBmaW5kbWVyZ2VmaWxlcyAkZmluZG1lcmdlZmlsZXNdCglwdXRzICRmIFtsaXN0IHNldCBtYXhncmFwaHBjdCAkbWF4Z3JhcGhwY3RdCglwdXRzICRmIFtsaXN0IHNldCBtYXh3aWR0aCAkbWF4d2lkdGhdCglwdXRzICRmIFtsaXN0IHNldCBjbWl0bW9kZSAkY21pdG1vZGVdCglwdXRzICRmIFtsaXN0IHNldCB3cmFwY29tbWVudCAkd3JhcGNvbW1lbnRdCglwdXRzICRmIFtsaXN0IHNldCBzaG93bmVhcnRhZ3MgJHNob3duZWFydGFnc10KCXB1dHMgJGYgW2xpc3Qgc2V0IGJnY29sb3IgJGJnY29sb3JdCglwdXRzICRmIFtsaXN0IHNldCBmZ2NvbG9yICRmZ2NvbG9yXQoJcHV0cyAkZiBbbGlzdCBzZXQgY29sb3JzICRjb2xvcnNdCglwdXRzICRmIFtsaXN0IHNldCBkaWZmY29sb3JzICRkaWZmY29sb3JzXQoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KHdpZHRoKSBbd2luZm8gd2lkdGggLmN0b3BdIgoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGhlaWdodCkgW3dpbmZvIGhlaWdodCAuY3RvcF0iCglwdXRzICRmICJzZXQgZ2VvbWV0cnkoY2FudjEpIFtleHByIHtbd2luZm8gd2lkdGggJGNhbnZdLTJ9XSIKCXB1dHMgJGYgInNldCBnZW9tZXRyeShjYW52MikgW2V4cHIge1t3aW5mbyB3aWR0aCAkY2FudjJdLTJ9XSIKCXB1dHMgJGYgInNldCBnZW9tZXRyeShjYW52MykgW2V4cHIge1t3aW5mbyB3aWR0aCAkY2FudjNdLTJ9XSIKCXB1dHMgJGYgInNldCBnZW9tZXRyeShjYW52aCkgW2V4cHIge1t3aW5mbyBoZWlnaHQgJGNhbnZdLTJ9XSIKCXNldCB3aWQgW2V4cHIgeyhbd2luZm8gd2lkdGggJGN0ZXh0XSAtIDgpIFwKCQkJICAgLyBbZm9udCBtZWFzdXJlICR0ZXh0Zm9udCAiMCJdfV0KCXB1dHMgJGYgInNldCBnZW9tZXRyeShjdGV4dHcpICR3aWQiCglzZXQgd2lkIFtleHByIHsoW3dpbmZvIHdpZHRoICRjZmxpc3RdIC0gMTEpIFwKCQkJICAgLyBbZm9udCBtZWFzdXJlIFskY2ZsaXN0IGNnZXQgLWZvbnRdICIwIl19XQoJcHV0cyAkZiAic2V0IGdlb21ldHJ5KGNmbGlzdHcpICR3aWQiCglwdXRzIC1ub25ld2xpbmUgJGYgInNldCBwZXJtdmlld3MgeyIKCWZvciB7c2V0IHYgMH0geyR2IDwgJG5leHR2aWV3bnVtfSB7aW5jciB2fSB7CgkgICAgaWYgeyR2aWV3cGVybSgkdil9IHsKCQlwdXRzICRmICJ7W2xpc3QgJHZpZXduYW1lKCR2KSAkdmlld2ZpbGVzKCR2KSAkdmlld2FyZ3MoJHYpXX0iCgkgICAgfQoJfQoJcHV0cyAkZiAifSIKCWNsb3NlICRmCglmaWxlIHJlbmFtZSAtZm9yY2UgIn4vLmdpdGstbmV3IiAifi8uZ2l0ayIKICAgIH0KICAgIHNldCBzdHVmZnNhdmVkIDEKfQoKcHJvYyByZXNpemVjbGlzdHBhbmVzIHt3aW4gd30gewogICAgZ2xvYmFsIG9sZHdpZHRoCiAgICBpZiB7W2luZm8gZXhpc3RzIG9sZHdpZHRoKCR3aW4pXX0gewoJc2V0IHMwIFskd2luIHNhc2ggY29vcmQgMF0KCXNldCBzMSBbJHdpbiBzYXNoIGNvb3JkIDFdCglpZiB7JHcgPCA2MH0gewoJICAgIHNldCBzYXNoMCBbZXhwciB7aW50KCR3LzIgLSAyKX1dCgkgICAgc2V0IHNhc2gxIFtleHByIHtpbnQoJHcqNS82IC0gMil9XQoJfSBlbHNlIHsKCSAgICBzZXQgZmFjdG9yIFtleHByIHsxLjAgKiAkdyAvICRvbGR3aWR0aCgkd2luKX1dCgkgICAgc2V0IHNhc2gwIFtleHByIHtpbnQoJGZhY3RvciAqIFtsaW5kZXggJHMwIDBdKX1dCgkgICAgc2V0IHNhc2gxIFtleHByIHtpbnQoJGZhY3RvciAqIFtsaW5kZXggJHMxIDBdKX1dCgkgICAgaWYgeyRzYXNoMCA8IDMwfSB7CgkJc2V0IHNhc2gwIDMwCgkgICAgfQoJICAgIGlmIHskc2FzaDEgPCAkc2FzaDAgKyAyMH0gewoJCXNldCBzYXNoMSBbZXhwciB7JHNhc2gwICsgMjB9XQoJICAgIH0KCSAgICBpZiB7JHNhc2gxID4gJHcgLSAxMH0gewoJCXNldCBzYXNoMSBbZXhwciB7JHcgLSAxMH1dCgkJaWYgeyRzYXNoMCA+ICRzYXNoMSAtIDIwfSB7CgkJICAgIHNldCBzYXNoMCBbZXhwciB7JHNhc2gxIC0gMjB9XQoJCX0KCSAgICB9Cgl9Cgkkd2luIHNhc2ggcGxhY2UgMCAkc2FzaDAgW2xpbmRleCAkczAgMV0KCSR3aW4gc2FzaCBwbGFjZSAxICRzYXNoMSBbbGluZGV4ICRzMSAxXQogICAgfQogICAgc2V0IG9sZHdpZHRoKCR3aW4pICR3Cn0KCnByb2MgcmVzaXplY2RldHBhbmVzIHt3aW4gd30gewogICAgZ2xvYmFsIG9sZHdpZHRoCiAgICBpZiB7W2luZm8gZXhpc3RzIG9sZHdpZHRoKCR3aW4pXX0gewoJc2V0IHMwIFskd2luIHNhc2ggY29vcmQgMF0KCWlmIHskdyA8IDYwfSB7CgkgICAgc2V0IHNhc2gwIFtleHByIHtpbnQoJHcqMy80IC0gMil9XQoJfSBlbHNlIHsKCSAgICBzZXQgZmFjdG9yIFtleHByIHsxLjAgKiAkdyAvICRvbGR3aWR0aCgkd2luKX1dCgkgICAgc2V0IHNhc2gwIFtleHByIHtpbnQoJGZhY3RvciAqIFtsaW5kZXggJHMwIDBdKX1dCgkgICAgaWYgeyRzYXNoMCA8IDQ1fSB7CgkJc2V0IHNhc2gwIDQ1CgkgICAgfQoJICAgIGlmIHskc2FzaDAgPiAkdyAtIDE1fSB7CgkJc2V0IHNhc2gwIFtleHByIHskdyAtIDE1fV0KCSAgICB9Cgl9Cgkkd2luIHNhc2ggcGxhY2UgMCAkc2FzaDAgW2xpbmRleCAkczAgMV0KICAgIH0KICAgIHNldCBvbGR3aWR0aCgkd2luKSAkdwp9Cgpwcm9jIGFsbGNhbnZzIGFyZ3MgewogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMKICAgIGV2YWwgJGNhbnYgJGFyZ3MKICAgIGV2YWwgJGNhbnYyICRhcmdzCiAgICBldmFsICRjYW52MyAkYXJncwp9Cgpwcm9jIGJpbmRhbGwge2V2ZW50IGFjdGlvbn0gewogICAgZ2xvYmFsIGNhbnYgY2FudjIgY2FudjMKICAgIGJpbmQgJGNhbnYgJGV2ZW50ICRhY3Rpb24KICAgIGJpbmQgJGNhbnYyICRldmVudCAkYWN0aW9uCiAgICBiaW5kICRjYW52MyAkZXZlbnQgJGFjdGlvbgp9Cgpwcm9jIGFib3V0IHt9IHsKICAgIHNldCB3IC5hYm91dAogICAgaWYge1t3aW5mbyBleGlzdHMgJHddfSB7CglyYWlzZSAkdwoJcmV0dXJuCiAgICB9CiAgICB0b3BsZXZlbCAkdwogICAgd20gdGl0bGUgJHcgIkFib3V0IGdpdGsiCiAgICBtZXNzYWdlICR3Lm0gLXRleHQgewpHaXRrIC0gYSBjb21taXQgdmlld2VyIGZvciBnaXQKCkNvcHlyaWdodCCpIDIwMDUtMjAwNiBQYXVsIE1hY2tlcnJhcwoKVXNlIGFuZCByZWRpc3RyaWJ1dGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZX0gXAoJICAgIC1qdXN0aWZ5IGNlbnRlciAtYXNwZWN0IDQwMAogICAgcGFjayAkdy5tIC1zaWRlIHRvcCAtZmlsbCB4IC1wYWR4IDIwIC1wYWR5IDIwCiAgICBidXR0b24gJHcub2sgLXRleHQgQ2xvc2UgLWNvbW1hbmQgImRlc3Ryb3kgJHciCiAgICBwYWNrICR3Lm9rIC1zaWRlIGJvdHRvbQp9Cgpwcm9jIGtleXMge30gewogICAgc2V0IHcgLmtleXMKICAgIGlmIHtbd2luZm8gZXhpc3RzICR3XX0gewoJcmFpc2UgJHcKCXJldHVybgogICAgfQogICAgdG9wbGV2ZWwgJHcKICAgIHdtIHRpdGxlICR3ICJHaXRrIGtleSBiaW5kaW5ncyIKICAgIG1lc3NhZ2UgJHcubSAtdGV4dCB7CkdpdGsga2V5IGJpbmRpbmdzOgoKPEN0cmwtUT4JCVF1aXQKPEhvbWU+CQlNb3ZlIHRvIGZpcnN0IGNvbW1pdAo8RW5kPgkJTW92ZSB0byBsYXN0IGNvbW1pdAo8VXA+LCBwLCBpCU1vdmUgdXAgb25lIGNvbW1pdAo8RG93bj4sIG4sIGsJTW92ZSBkb3duIG9uZSBjb21taXQKPExlZnQ+LCB6LCBqCUdvIGJhY2sgaW4gaGlzdG9yeSBsaXN0CjxSaWdodD4sIHgsIGwJR28gZm9yd2FyZCBpbiBoaXN0b3J5IGxpc3QKPFBhZ2VVcD4JTW92ZSB1cCBvbmUgcGFnZSBpbiBjb21taXQgbGlzdAo8UGFnZURvd24+CU1vdmUgZG93biBvbmUgcGFnZSBpbiBjb21taXQgbGlzdAo8Q3RybC1Ib21lPglTY3JvbGwgdG8gdG9wIG9mIGNvbW1pdCBsaXN0CjxDdHJsLUVuZD4JU2Nyb2xsIHRvIGJvdHRvbSBvZiBjb21taXQgbGlzdAo8Q3RybC1VcD4JU2Nyb2xsIGNvbW1pdCBsaXN0IHVwIG9uZSBsaW5lCjxDdHJsLURvd24+CVNjcm9sbCBjb21taXQgbGlzdCBkb3duIG9uZSBsaW5lCjxDdHJsLVBhZ2VVcD4JU2Nyb2xsIGNvbW1pdCBsaXN0IHVwIG9uZSBwYWdlCjxDdHJsLVBhZ2VEb3duPglTY3JvbGwgY29tbWl0IGxpc3QgZG93biBvbmUgcGFnZQo8U2hpZnQtVXA+CU1vdmUgdG8gcHJldmlvdXMgaGlnaGxpZ2h0ZWQgbGluZQo8U2hpZnQtRG93bj4JTW92ZSB0byBuZXh0IGhpZ2hsaWdodGVkIGxpbmUKPERlbGV0ZT4sIGIJU2Nyb2xsIGRpZmYgdmlldyB1cCBvbmUgcGFnZQo8QmFja3NwYWNlPglTY3JvbGwgZGlmZiB2aWV3IHVwIG9uZSBwYWdlCjxTcGFjZT4JCVNjcm9sbCBkaWZmIHZpZXcgZG93biBvbmUgcGFnZQp1CQlTY3JvbGwgZGlmZiB2aWV3IHVwIDE4IGxpbmVzCmQJCVNjcm9sbCBkaWZmIHZpZXcgZG93biAxOCBsaW5lcwo8Q3RybC1GPgkJRmluZAo8Q3RybC1HPgkJTW92ZSB0byBuZXh0IGZpbmQgaGl0CjxSZXR1cm4+CU1vdmUgdG8gbmV4dCBmaW5kIGhpdAovCQlNb3ZlIHRvIG5leHQgZmluZCBoaXQsIG9yIHJlZG8gZmluZAo/CQlNb3ZlIHRvIHByZXZpb3VzIGZpbmQgaGl0CmYJCVNjcm9sbCBkaWZmIHZpZXcgdG8gbmV4dCBmaWxlCjxDdHJsLVM+CQlTZWFyY2ggZm9yIG5leHQgaGl0IGluIGRpZmYgdmlldwo8Q3RybC1SPgkJU2VhcmNoIGZvciBwcmV2aW91cyBoaXQgaW4gZGlmZiB2aWV3CjxDdHJsLUtQKz4JSW5jcmVhc2UgZm9udCBzaXplCjxDdHJsLXBsdXM+CUluY3JlYXNlIGZvbnQgc2l6ZQo8Q3RybC1LUC0+CURlY3JlYXNlIGZvbnQgc2l6ZQo8Q3RybC1taW51cz4JRGVjcmVhc2UgZm9udCBzaXplCn0gXAoJICAgIC1qdXN0aWZ5IGxlZnQgLWJnIHdoaXRlIC1ib3JkZXIgMiAtcmVsaWVmIHN1bmtlbgogICAgcGFjayAkdy5tIC1zaWRlIHRvcCAtZmlsbCBib3RoCiAgICBidXR0b24gJHcub2sgLXRleHQgQ2xvc2UgLWNvbW1hbmQgImRlc3Ryb3kgJHciCiAgICBwYWNrICR3Lm9rIC1zaWRlIGJvdHRvbQp9CgojIFByb2NlZHVyZXMgZm9yIG1hbmlwdWxhdGluZyB0aGUgZmlsZSBsaXN0IHdpbmRvdyBhdCB0aGUKIyBib3R0b20gcmlnaHQgb2YgdGhlIG92ZXJhbGwgd2luZG93LgoKcHJvYyB0cmVldmlldyB7dyBsIG9wZW5sZXZzfSB7CiAgICBnbG9iYWwgdHJlZWNvbnRlbnRzIHRyZWVkaXJvcGVuIHRyZWVoZWlnaHQgdHJlZXBhcmVudCB0cmVlaW5kZXgKCiAgICBzZXQgaXggMAogICAgc2V0IHRyZWVpbmRleCgpIDAKICAgIHNldCBsZXYgMAogICAgc2V0IHByZWZpeCB7fQogICAgc2V0IHByZWZpeGVuZCAtMQogICAgc2V0IHByZWZlbmRzdGFjayB7fQogICAgc2V0IGh0c3RhY2sge30KICAgIHNldCBodCAwCiAgICBzZXQgdHJlZWNvbnRlbnRzKCkge30KICAgICR3IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgZm9yZWFjaCBmICRsIHsKCXdoaWxlIHtbc3RyaW5nIHJhbmdlICRmIDAgJHByZWZpeGVuZF0gbmUgJHByZWZpeH0gewoJICAgIGlmIHskbGV2IDw9ICRvcGVubGV2c30gewoJCSR3IG1hcmsgc2V0IGU6JHRyZWVpbmRleCgkcHJlZml4KSAiZW5kIC0xYyIKCQkkdyBtYXJrIGdyYXZpdHkgZTokdHJlZWluZGV4KCRwcmVmaXgpIGxlZnQKCSAgICB9CgkgICAgc2V0IHRyZWVoZWlnaHQoJHByZWZpeCkgJGh0CgkgICAgaW5jciBodCBbbGluZGV4ICRodHN0YWNrIGVuZF0KCSAgICBzZXQgaHRzdGFjayBbbHJlcGxhY2UgJGh0c3RhY2sgZW5kIGVuZF0KCSAgICBzZXQgcHJlZml4ZW5kIFtsaW5kZXggJHByZWZlbmRzdGFjayBlbmRdCgkgICAgc2V0IHByZWZlbmRzdGFjayBbbHJlcGxhY2UgJHByZWZlbmRzdGFjayBlbmQgZW5kXQoJICAgIHNldCBwcmVmaXggW3N0cmluZyByYW5nZSAkcHJlZml4IDAgJHByZWZpeGVuZF0KCSAgICBpbmNyIGxldiAtMQoJfQoJc2V0IHRhaWwgW3N0cmluZyByYW5nZSAkZiBbZXhwciB7JHByZWZpeGVuZCsxfV0gZW5kXQoJd2hpbGUge1tzZXQgc2xhc2ggW3N0cmluZyBmaXJzdCAiLyIgJHRhaWxdXSA+PSAwfSB7CgkgICAgbGFwcGVuZCBodHN0YWNrICRodAoJICAgIHNldCBodCAwCgkgICAgbGFwcGVuZCBwcmVmZW5kc3RhY2sgJHByZWZpeGVuZAoJICAgIGluY3IgcHJlZml4ZW5kIFtleHByIHskc2xhc2ggKyAxfV0KCSAgICBzZXQgZCBbc3RyaW5nIHJhbmdlICR0YWlsIDAgJHNsYXNoXQoJICAgIGxhcHBlbmQgdHJlZWNvbnRlbnRzKCRwcmVmaXgpICRkCgkgICAgc2V0IG9sZHByZWZpeCAkcHJlZml4CgkgICAgYXBwZW5kIHByZWZpeCAkZAoJICAgIHNldCB0cmVlY29udGVudHMoJHByZWZpeCkge30KCSAgICBzZXQgdHJlZWluZGV4KCRwcmVmaXgpIFtpbmNyIGl4XQoJICAgIHNldCB0cmVlcGFyZW50KCRwcmVmaXgpICRvbGRwcmVmaXgKCSAgICBzZXQgdGFpbCBbc3RyaW5nIHJhbmdlICR0YWlsIFtleHByIHskc2xhc2grMX1dIGVuZF0KCSAgICBpZiB7JGxldiA8PSAkb3BlbmxldnN9IHsKCQlzZXQgaHQgMQoJCXNldCB0cmVlZGlyb3BlbigkcHJlZml4KSBbZXhwciB7JGxldiA8ICRvcGVubGV2c31dCgkJc2V0IGJtIFtleHByIHskbGV2ID09ICRvcGVubGV2cz8gInRyaS1ydCI6ICJ0cmktZG4ifV0KCQkkdyBtYXJrIHNldCBkOiRpeCAiZW5kIC0xYyIKCQkkdyBtYXJrIGdyYXZpdHkgZDokaXggbGVmdAoJCXNldCBzdHIgIlxuIgoJCWZvciB7c2V0IGkgMH0geyRpIDwgJGxldn0ge2luY3IgaX0ge2FwcGVuZCBzdHIgIlx0In0KCQkkdyBpbnNlcnQgZW5kICRzdHIKCQkkdyBpbWFnZSBjcmVhdGUgZW5kIC1hbGlnbiBjZW50ZXIgLWltYWdlICRibSAtcGFkeCAxIFwKCQkgICAgLW5hbWUgYTokaXgKCQkkdyBpbnNlcnQgZW5kICRkIFtoaWdobGlnaHRfdGFnICRwcmVmaXhdCgkJJHcgbWFyayBzZXQgczokaXggImVuZCAtMWMiCgkJJHcgbWFyayBncmF2aXR5IHM6JGl4IGxlZnQKCSAgICB9CgkgICAgaW5jciBsZXYKCX0KCWlmIHskdGFpbCBuZSB7fX0gewoJICAgIGlmIHskbGV2IDw9ICRvcGVubGV2c30gewoJCWluY3IgaHQKCQlzZXQgc3RyICJcbiIKCQlmb3Ige3NldCBpIDB9IHskaSA8ICRsZXZ9IHtpbmNyIGl9IHthcHBlbmQgc3RyICJcdCJ9CgkJJHcgaW5zZXJ0IGVuZCAkc3RyCgkJJHcgaW5zZXJ0IGVuZCAkdGFpbCBbaGlnaGxpZ2h0X3RhZyAkZl0KCSAgICB9CgkgICAgbGFwcGVuZCB0cmVlY29udGVudHMoJHByZWZpeCkgJHRhaWwKCX0KICAgIH0KICAgIHdoaWxlIHskaHRzdGFjayBuZSB7fX0gewoJc2V0IHRyZWVoZWlnaHQoJHByZWZpeCkgJGh0CglpbmNyIGh0IFtsaW5kZXggJGh0c3RhY2sgZW5kXQoJc2V0IGh0c3RhY2sgW2xyZXBsYWNlICRodHN0YWNrIGVuZCBlbmRdCiAgICB9CiAgICAkdyBjb25mIC1zdGF0ZSBkaXNhYmxlZAp9Cgpwcm9jIGxpbmV0b2VsdCB7bH0gewogICAgZ2xvYmFsIHRyZWVoZWlnaHQgdHJlZWNvbnRlbnRzCgogICAgc2V0IHkgMgogICAgc2V0IHByZWZpeCB7fQogICAgd2hpbGUgezF9IHsKCWZvcmVhY2ggZSAkdHJlZWNvbnRlbnRzKCRwcmVmaXgpIHsKCSAgICBpZiB7JHkgPT0gJGx9IHsKCQlyZXR1cm4gIiRwcmVmaXgkZSIKCSAgICB9CgkgICAgc2V0IG4gMQoJICAgIGlmIHtbc3RyaW5nIGluZGV4ICRlIGVuZF0gZXEgIi8ifSB7CgkJc2V0IG4gJHRyZWVoZWlnaHQoJHByZWZpeCRlKQoJCWlmIHskeSArICRuID4gJGx9IHsKCQkgICAgYXBwZW5kIHByZWZpeCAkZQoJCSAgICBpbmNyIHkKCQkgICAgYnJlYWsKCQl9CgkgICAgfQoJICAgIGluY3IgeSAkbgoJfQogICAgfQp9Cgpwcm9jIGhpZ2hsaWdodF90cmVlIHt5IHByZWZpeH0gewogICAgZ2xvYmFsIHRyZWVoZWlnaHQgdHJlZWNvbnRlbnRzIGNmbGlzdAoKICAgIGZvcmVhY2ggZSAkdHJlZWNvbnRlbnRzKCRwcmVmaXgpIHsKCXNldCBwYXRoICRwcmVmaXgkZQoJaWYge1toaWdobGlnaHRfdGFnICRwYXRoXSBuZSB7fX0gewoJICAgICRjZmxpc3QgdGFnIGFkZCBib2xkICR5LjAgIiR5LjAgbGluZWVuZCIKCX0KCWluY3IgeQoJaWYge1tzdHJpbmcgaW5kZXggJGUgZW5kXSBlcSAiLyIgJiYgJHRyZWVoZWlnaHQoJHBhdGgpID4gMX0gewoJICAgIHNldCB5IFtoaWdobGlnaHRfdHJlZSAkeSAkcGF0aF0KCX0KICAgIH0KICAgIHJldHVybiAkeQp9Cgpwcm9jIHRyZWVjbG9zZWRpciB7dyBkaXJ9IHsKICAgIGdsb2JhbCB0cmVlZGlyb3BlbiB0cmVlaGVpZ2h0IHRyZWVwYXJlbnQgdHJlZWluZGV4CgogICAgc2V0IGl4ICR0cmVlaW5kZXgoJGRpcikKICAgICR3IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJHcgZGVsZXRlIHM6JGl4IGU6JGl4CiAgICBzZXQgdHJlZWRpcm9wZW4oJGRpcikgMAogICAgJHcgaW1hZ2UgY29uZmlndXJlIGE6JGl4IC1pbWFnZSB0cmktcnQKICAgICR3IGNvbmYgLXN0YXRlIGRpc2FibGVkCiAgICBzZXQgbiBbZXhwciB7MSAtICR0cmVlaGVpZ2h0KCRkaXIpfV0KICAgIHdoaWxlIHskZGlyIG5lIHt9fSB7CglpbmNyIHRyZWVoZWlnaHQoJGRpcikgJG4KCXNldCBkaXIgJHRyZWVwYXJlbnQoJGRpcikKICAgIH0KfQoKcHJvYyB0cmVlb3BlbmRpciB7dyBkaXJ9IHsKICAgIGdsb2JhbCB0cmVlZGlyb3BlbiB0cmVlaGVpZ2h0IHRyZWVwYXJlbnQgdHJlZWNvbnRlbnRzIHRyZWVpbmRleAoKICAgIHNldCBpeCAkdHJlZWluZGV4KCRkaXIpCiAgICAkdyBjb25mIC1zdGF0ZSBub3JtYWwKICAgICR3IGltYWdlIGNvbmZpZ3VyZSBhOiRpeCAtaW1hZ2UgdHJpLWRuCiAgICAkdyBtYXJrIHNldCBlOiRpeCBzOiRpeAogICAgJHcgbWFyayBncmF2aXR5IGU6JGl4IHJpZ2h0CiAgICBzZXQgbGV2IDAKICAgIHNldCBzdHIgIlxuIgogICAgc2V0IG4gW2xsZW5ndGggJHRyZWVjb250ZW50cygkZGlyKV0KICAgIGZvciB7c2V0IHggJGRpcn0geyR4IG5lIHt9fSB7c2V0IHggJHRyZWVwYXJlbnQoJHgpfSB7CglpbmNyIGxldgoJYXBwZW5kIHN0ciAiXHQiCglpbmNyIHRyZWVoZWlnaHQoJHgpICRuCiAgICB9CiAgICBmb3JlYWNoIGUgJHRyZWVjb250ZW50cygkZGlyKSB7CglzZXQgZGUgJGRpciRlCglpZiB7W3N0cmluZyBpbmRleCAkZSBlbmRdIGVxICIvIn0gewoJICAgIHNldCBpeSAkdHJlZWluZGV4KCRkZSkKCSAgICAkdyBtYXJrIHNldCBkOiRpeSBlOiRpeAoJICAgICR3IG1hcmsgZ3Jhdml0eSBkOiRpeSBsZWZ0CgkgICAgJHcgaW5zZXJ0IGU6JGl4ICRzdHIKCSAgICBzZXQgdHJlZWRpcm9wZW4oJGRlKSAwCgkgICAgJHcgaW1hZ2UgY3JlYXRlIGU6JGl4IC1hbGlnbiBjZW50ZXIgLWltYWdlIHRyaS1ydCAtcGFkeCAxIFwKCQktbmFtZSBhOiRpeQoJICAgICR3IGluc2VydCBlOiRpeCAkZSBbaGlnaGxpZ2h0X3RhZyAkZGVdCgkgICAgJHcgbWFyayBzZXQgczokaXkgZTokaXgKCSAgICAkdyBtYXJrIGdyYXZpdHkgczokaXkgbGVmdAoJICAgIHNldCB0cmVlaGVpZ2h0KCRkZSkgMQoJfSBlbHNlIHsKCSAgICAkdyBpbnNlcnQgZTokaXggJHN0cgoJICAgICR3IGluc2VydCBlOiRpeCAkZSBbaGlnaGxpZ2h0X3RhZyAkZGVdCgl9CiAgICB9CiAgICAkdyBtYXJrIGdyYXZpdHkgZTokaXggbGVmdAogICAgJHcgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIHNldCB0cmVlZGlyb3BlbigkZGlyKSAxCiAgICBzZXQgdG9wIFtsaW5kZXggW3NwbGl0IFskdyBpbmRleCBAMCwwXSAuXSAwXQogICAgc2V0IGh0IFskdyBjZ2V0IC1oZWlnaHRdCiAgICBzZXQgbCBbbGluZGV4IFtzcGxpdCBbJHcgaW5kZXggczokaXhdIC5dIDBdCiAgICBpZiB7JGwgPCAkdG9wfSB7CgkkdyB5dmlldyAkbC4wCiAgICB9IGVsc2VpZiB7JGwgKyAkbiArIDEgPiAkdG9wICsgJGh0fSB7CglzZXQgdG9wIFtleHByIHskbCArICRuICsgMiAtICRodH1dCglpZiB7JGwgPCAkdG9wfSB7CgkgICAgc2V0IHRvcCAkbAoJfQoJJHcgeXZpZXcgJHRvcC4wCiAgICB9Cn0KCnByb2MgdHJlZWNsaWNrIHt3IHggeX0gewogICAgZ2xvYmFsIHRyZWVkaXJvcGVuIGNtaXRtb2RlIGN0ZXh0IGNmbGlzdCBjZmxpc3RfdG9wCgogICAgaWYgeyRjbWl0bW9kZSBuZSAidHJlZSJ9IHJldHVybgogICAgaWYgeyFbaW5mbyBleGlzdHMgY2ZsaXN0X3RvcF19IHJldHVybgogICAgc2V0IGwgW2xpbmRleCBbc3BsaXQgWyR3IGluZGV4ICJAJHgsJHkiXSAiLiJdIDBdCiAgICAkY2ZsaXN0IHRhZyByZW1vdmUgaGlnaGxpZ2h0ICRjZmxpc3RfdG9wLjAgIiRjZmxpc3RfdG9wLjAgbGluZWVuZCIKICAgICRjZmxpc3QgdGFnIGFkZCBoaWdobGlnaHQgJGwuMCAiJGwuMCBsaW5lZW5kIgogICAgc2V0IGNmbGlzdF90b3AgJGwKICAgIGlmIHskbCA9PSAxfSB7CgkkY3RleHQgeXZpZXcgMS4wCglyZXR1cm4KICAgIH0KICAgIHNldCBlIFtsaW5ldG9lbHQgJGxdCiAgICBpZiB7W3N0cmluZyBpbmRleCAkZSBlbmRdIG5lICIvIn0gewoJc2hvd2ZpbGUgJGUKICAgIH0gZWxzZWlmIHskdHJlZWRpcm9wZW4oJGUpfSB7Cgl0cmVlY2xvc2VkaXIgJHcgJGUKICAgIH0gZWxzZSB7Cgl0cmVlb3BlbmRpciAkdyAkZQogICAgfQp9Cgpwcm9jIHNldGZpbGVsaXN0IHtpZH0gewogICAgZ2xvYmFsIHRyZWVmaWxlbGlzdCBjZmxpc3QKCiAgICB0cmVldmlldyAkY2ZsaXN0ICR0cmVlZmlsZWxpc3QoJGlkKSAwCn0KCmltYWdlIGNyZWF0ZSBiaXRtYXAgdHJpLXJ0IC1iYWNrZ3JvdW5kIGJsYWNrIC1mb3JlZ3JvdW5kIGJsdWUgLWRhdGEgewogICAgI2RlZmluZSB0cmktcnRfd2lkdGggMTMKICAgICNkZWZpbmUgdHJpLXJ0X2hlaWdodCAxMwogICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgdHJpLXJ0X2JpdHNbXSA9IHsKICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MzAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4ZjAsIDB4MDAsCiAgICAgICAweGYwLCAweDAxLCAweGYwLCAweDAwLCAweDcwLCAweDAwLCAweDMwLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLAogICAgICAgMHgwMCwgMHgwMH07Cn0gLW1hc2tkYXRhIHsKICAgICNkZWZpbmUgdHJpLXJ0LW1hc2tfd2lkdGggMTMKICAgICNkZWZpbmUgdHJpLXJ0LW1hc2tfaGVpZ2h0IDEzCiAgICBzdGF0aWMgdW5zaWduZWQgY2hhciB0cmktcnQtbWFza19iaXRzW10gPSB7CiAgICAgICAweDA4LCAweDAwLCAweDE4LCAweDAwLCAweDM4LCAweDAwLCAweDc4LCAweDAwLCAweGY4LCAweDAwLCAweGY4LCAweDAxLAogICAgICAgMHhmOCwgMHgwMywgMHhmOCwgMHgwMSwgMHhmOCwgMHgwMCwgMHg3OCwgMHgwMCwgMHgzOCwgMHgwMCwgMHgxOCwgMHgwMCwKICAgICAgIDB4MDgsIDB4MDB9Owp9CmltYWdlIGNyZWF0ZSBiaXRtYXAgdHJpLWRuIC1iYWNrZ3JvdW5kIGJsYWNrIC1mb3JlZ3JvdW5kIGJsdWUgLWRhdGEgewogICAgI2RlZmluZSB0cmktZG5fd2lkdGggMTMKICAgICNkZWZpbmUgdHJpLWRuX2hlaWdodCAxMwogICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgdHJpLWRuX2JpdHNbXSA9IHsKICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmMsIDB4MDcsIDB4ZjgsIDB4MDMsCiAgICAgICAweGYwLCAweDAxLCAweGUwLCAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAgICAgMHgwMCwgMHgwMH07Cn0gLW1hc2tkYXRhIHsKICAgICNkZWZpbmUgdHJpLWRuLW1hc2tfd2lkdGggMTMKICAgICNkZWZpbmUgdHJpLWRuLW1hc2tfaGVpZ2h0IDEzCiAgICBzdGF0aWMgdW5zaWduZWQgY2hhciB0cmktZG4tbWFza19iaXRzW10gPSB7CiAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweDFmLCAweGZlLCAweDBmLCAweGZjLCAweDA3LAogICAgICAgMHhmOCwgMHgwMywgMHhmMCwgMHgwMSwgMHhlMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKICAgICAgIDB4MDAsIDB4MDB9Owp9Cgpwcm9jIGluaXRfZmxpc3Qge2ZpcnN0fSB7CiAgICBnbG9iYWwgY2ZsaXN0IGNmbGlzdF90b3Agc2VsZWN0ZWRsaW5lIGRpZmZmaWxlc3RhcnQKCiAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJGNmbGlzdCBkZWxldGUgMC4wIGVuZAogICAgaWYgeyRmaXJzdCBuZSB7fX0gewoJJGNmbGlzdCBpbnNlcnQgZW5kICRmaXJzdAoJc2V0IGNmbGlzdF90b3AgMQoJJGNmbGlzdCB0YWcgYWRkIGhpZ2hsaWdodCAxLjAgIjEuMCBsaW5lZW5kIgogICAgfSBlbHNlIHsKCWNhdGNoIHt1bnNldCBjZmxpc3RfdG9wfQogICAgfQogICAgJGNmbGlzdCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgc2V0IGRpZmZmaWxlc3RhcnQge30KfQoKcHJvYyBoaWdobGlnaHRfdGFnIHtmfSB7CiAgICBnbG9iYWwgaGlnaGxpZ2h0X3BhdGhzCgogICAgZm9yZWFjaCBwICRoaWdobGlnaHRfcGF0aHMgewoJaWYge1tzdHJpbmcgbWF0Y2ggJHAgJGZdfSB7CgkgICAgcmV0dXJuICJib2xkIgoJfQogICAgfQogICAgcmV0dXJuIHt9Cn0KCnByb2MgaGlnaGxpZ2h0X2ZpbGVsaXN0IHt9IHsKICAgIGdsb2JhbCBjbWl0bW9kZSBjZmxpc3QKCiAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgaWYgeyRjbWl0bW9kZSBuZSAidHJlZSJ9IHsKCXNldCBlbmQgW2xpbmRleCBbc3BsaXQgWyRjZmxpc3QgaW5kZXggZW5kXSAuXSAwXQoJZm9yIHtzZXQgbCAyfSB7JGwgPCAkZW5kfSB7aW5jciBsfSB7CgkgICAgc2V0IGxpbmUgWyRjZmxpc3QgZ2V0ICRsLjAgIiRsLjAgbGluZWVuZCJdCgkgICAgaWYge1toaWdobGlnaHRfdGFnICRsaW5lXSBuZSB7fX0gewoJCSRjZmxpc3QgdGFnIGFkZCBib2xkICRsLjAgIiRsLjAgbGluZWVuZCIKCSAgICB9Cgl9CiAgICB9IGVsc2UgewoJaGlnaGxpZ2h0X3RyZWUgMiB7fQogICAgfQogICAgJGNmbGlzdCBjb25mIC1zdGF0ZSBkaXNhYmxlZAp9Cgpwcm9jIHVuaGlnaGxpZ2h0X2ZpbGVsaXN0IHt9IHsKICAgIGdsb2JhbCBjZmxpc3QKCiAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgJGNmbGlzdCB0YWcgcmVtb3ZlIGJvbGQgMS4wIGVuZAogICAgJGNmbGlzdCBjb25mIC1zdGF0ZSBkaXNhYmxlZAp9Cgpwcm9jIGFkZF9mbGlzdCB7Zmx9IHsKICAgIGdsb2JhbCBjZmxpc3QKCiAgICAkY2ZsaXN0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgZm9yZWFjaCBmICRmbCB7CgkkY2ZsaXN0IGluc2VydCBlbmQgIlxuIgoJJGNmbGlzdCBpbnNlcnQgZW5kICRmIFtoaWdobGlnaHRfdGFnICRmXQogICAgfQogICAgJGNmbGlzdCBjb25mIC1zdGF0ZSBkaXNhYmxlZAp9Cgpwcm9jIHNlbF9mbGlzdCB7dyB4IHl9IHsKICAgIGdsb2JhbCBjdGV4dCBkaWZmZmlsZXN0YXJ0IGNmbGlzdCBjZmxpc3RfdG9wIGNtaXRtb2RlCgogICAgaWYgeyRjbWl0bW9kZSBlcSAidHJlZSJ9IHJldHVybgogICAgaWYgeyFbaW5mbyBleGlzdHMgY2ZsaXN0X3RvcF19IHJldHVybgogICAgc2V0IGwgW2xpbmRleCBbc3BsaXQgWyR3IGluZGV4ICJAJHgsJHkiXSAiLiJdIDBdCiAgICAkY2ZsaXN0IHRhZyByZW1vdmUgaGlnaGxpZ2h0ICRjZmxpc3RfdG9wLjAgIiRjZmxpc3RfdG9wLjAgbGluZWVuZCIKICAgICRjZmxpc3QgdGFnIGFkZCBoaWdobGlnaHQgJGwuMCAiJGwuMCBsaW5lZW5kIgogICAgc2V0IGNmbGlzdF90b3AgJGwKICAgIGlmIHskbCA9PSAxfSB7CgkkY3RleHQgeXZpZXcgMS4wCiAgICB9IGVsc2UgewoJY2F0Y2ggeyRjdGV4dCB5dmlldyBbbGluZGV4ICRkaWZmZmlsZXN0YXJ0IFtleHByIHskbCAtIDJ9XV19CiAgICB9Cn0KCiMgRnVuY3Rpb25zIGZvciBhZGRpbmcgYW5kIHJlbW92aW5nIHNoZWxsLXR5cGUgcXVvdGluZwoKcHJvYyBzaGVsbHF1b3RlIHtzdHJ9IHsKICAgIGlmIHshW3N0cmluZyBtYXRjaCAiKlxbJ1wiXFwgXHRdKiIgJHN0cl19IHsKCXJldHVybiAkc3RyCiAgICB9CiAgICBpZiB7IVtzdHJpbmcgbWF0Y2ggIipcWydcIlxcXSoiICRzdHJdfSB7CglyZXR1cm4gIlwiJHN0clwiIgogICAgfQogICAgaWYgeyFbc3RyaW5nIG1hdGNoICIqJyoiICRzdHJdfSB7CglyZXR1cm4gIickc3RyJyIKICAgIH0KICAgIHJldHVybiAiXCJbc3RyaW5nIG1hcCB7XCIgXFxcIiBcXCBcXFxcfSAkc3RyXVwiIgp9Cgpwcm9jIHNoZWxsYXJnbGlzdCB7bH0gewogICAgc2V0IHN0ciB7fQogICAgZm9yZWFjaCBhICRsIHsKCWlmIHskc3RyIG5lIHt9fSB7CgkgICAgYXBwZW5kIHN0ciAiICIKCX0KCWFwcGVuZCBzdHIgW3NoZWxscXVvdGUgJGFdCiAgICB9CiAgICByZXR1cm4gJHN0cgp9Cgpwcm9jIHNoZWxsZGVxdW90ZSB7c3RyfSB7CiAgICBzZXQgcmV0IHt9CiAgICBzZXQgdXNlZCAtMQogICAgd2hpbGUgezF9IHsKCWluY3IgdXNlZAoJaWYgeyFbcmVnZXhwIC1zdGFydCAkdXNlZCAtaW5kaWNlcyAiXFsnXCJcXFxcIFx0XSIgJHN0ciBmaXJzdF19IHsKCSAgICBhcHBlbmQgcmV0IFtzdHJpbmcgcmFuZ2UgJHN0ciAkdXNlZCBlbmRdCgkgICAgc2V0IHVzZWQgW3N0cmluZyBsZW5ndGggJHN0cl0KCSAgICBicmVhawoJfQoJc2V0IGZpcnN0IFtsaW5kZXggJGZpcnN0IDBdCglzZXQgY2ggW3N0cmluZyBpbmRleCAkc3RyICRmaXJzdF0KCWlmIHskZmlyc3QgPiAkdXNlZH0gewoJICAgIGFwcGVuZCByZXQgW3N0cmluZyByYW5nZSAkc3RyICR1c2VkIFtleHByIHskZmlyc3QgLSAxfV1dCgkgICAgc2V0IHVzZWQgJGZpcnN0Cgl9CglpZiB7JGNoIGVxICIgIiB8fCAkY2ggZXEgIlx0In0gYnJlYWsKCWluY3IgdXNlZAoJaWYgeyRjaCBlcSAiJyJ9IHsKCSAgICBzZXQgZmlyc3QgW3N0cmluZyBmaXJzdCAiJyIgJHN0ciAkdXNlZF0KCSAgICBpZiB7JGZpcnN0IDwgMH0gewoJCWVycm9yICJ1bm1hdGNoZWQgc2luZ2xlLXF1b3RlIgoJICAgIH0KCSAgICBhcHBlbmQgcmV0IFtzdHJpbmcgcmFuZ2UgJHN0ciAkdXNlZCBbZXhwciB7JGZpcnN0IC0gMX1dXQoJICAgIHNldCB1c2VkICRmaXJzdAoJICAgIGNvbnRpbnVlCgl9CglpZiB7JGNoIGVxICJcXCJ9IHsKCSAgICBpZiB7JHVzZWQgPj0gW3N0cmluZyBsZW5ndGggJHN0cl19IHsKCQllcnJvciAidHJhaWxpbmcgYmFja3NsYXNoIgoJICAgIH0KCSAgICBhcHBlbmQgcmV0IFtzdHJpbmcgaW5kZXggJHN0ciAkdXNlZF0KCSAgICBjb250aW51ZQoJfQoJIyBoZXJlIGNoID09ICJcIiIKCXdoaWxlIHsxfSB7CgkgICAgaWYgeyFbcmVnZXhwIC1zdGFydCAkdXNlZCAtaW5kaWNlcyAiXFtcIlxcXFxdIiAkc3RyIGZpcnN0XX0gewoJCWVycm9yICJ1bm1hdGNoZWQgZG91YmxlLXF1b3RlIgoJICAgIH0KCSAgICBzZXQgZmlyc3QgW2xpbmRleCAkZmlyc3QgMF0KCSAgICBzZXQgY2ggW3N0cmluZyBpbmRleCAkc3RyICRmaXJzdF0KCSAgICBpZiB7JGZpcnN0ID4gJHVzZWR9IHsKCQlhcHBlbmQgcmV0IFtzdHJpbmcgcmFuZ2UgJHN0ciAkdXNlZCBbZXhwciB7JGZpcnN0IC0gMX1dXQoJCXNldCB1c2VkICRmaXJzdAoJICAgIH0KCSAgICBpZiB7JGNoIGVxICJcIiJ9IGJyZWFrCgkgICAgaW5jciB1c2VkCgkgICAgYXBwZW5kIHJldCBbc3RyaW5nIGluZGV4ICRzdHIgJHVzZWRdCgkgICAgaW5jciB1c2VkCgl9CiAgICB9CiAgICByZXR1cm4gW2xpc3QgJHVzZWQgJHJldF0KfQoKcHJvYyBzaGVsbHNwbGl0IHtzdHJ9IHsKICAgIHNldCBsIHt9CiAgICB3aGlsZSB7MX0gewoJc2V0IHN0ciBbc3RyaW5nIHRyaW1sZWZ0ICRzdHJdCglpZiB7JHN0ciBlcSB7fX0gYnJlYWsKCXNldCBkcSBbc2hlbGxkZXF1b3RlICRzdHJdCglzZXQgbiBbbGluZGV4ICRkcSAwXQoJc2V0IHdvcmQgW2xpbmRleCAkZHEgMV0KCXNldCBzdHIgW3N0cmluZyByYW5nZSAkc3RyICRuIGVuZF0KCWxhcHBlbmQgbCAkd29yZAogICAgfQogICAgcmV0dXJuICRsCn0KCiMgQ29kZSB0byBpbXBsZW1lbnQgbXVsdGlwbGUgdmlld3MKCnByb2MgbmV3dmlldyB7aXNoaWdobGlnaHR9IHsKICAgIGdsb2JhbCBuZXh0dmlld251bSBuZXd2aWV3bmFtZSBuZXd2aWV3cGVybSB1aWZvbnQgbmV3aXNoaWdobGlnaHQKICAgIGdsb2JhbCBuZXd2aWV3YXJncyByZXZ0cmVlYXJncwoKICAgIHNldCBuZXdpc2hpZ2hsaWdodCAkaXNoaWdobGlnaHQKICAgIHNldCB0b3AgLmdpdGt2aWV3CiAgICBpZiB7W3dpbmZvIGV4aXN0cyAkdG9wXX0gewoJcmFpc2UgJHRvcAoJcmV0dXJuCiAgICB9CiAgICBzZXQgbmV3dmlld25hbWUoJG5leHR2aWV3bnVtKSAiVmlldyAkbmV4dHZpZXdudW0iCiAgICBzZXQgbmV3dmlld3Blcm0oJG5leHR2aWV3bnVtKSAwCiAgICBzZXQgbmV3dmlld2FyZ3MoJG5leHR2aWV3bnVtKSBbc2hlbGxhcmdsaXN0ICRyZXZ0cmVlYXJnc10KICAgIHZpZXdlZGl0b3IgJHRvcCAkbmV4dHZpZXdudW0gIkdpdGsgdmlldyBkZWZpbml0aW9uIiAKfQoKcHJvYyBlZGl0dmlldyB7fSB7CiAgICBnbG9iYWwgY3VydmlldwogICAgZ2xvYmFsIHZpZXduYW1lIHZpZXdwZXJtIG5ld3ZpZXduYW1lIG5ld3ZpZXdwZXJtCiAgICBnbG9iYWwgdmlld2FyZ3MgbmV3dmlld2FyZ3MKCiAgICBzZXQgdG9wIC5naXRrdmVkaXQtJGN1cnZpZXcKICAgIGlmIHtbd2luZm8gZXhpc3RzICR0b3BdfSB7CglyYWlzZSAkdG9wCglyZXR1cm4KICAgIH0KICAgIHNldCBuZXd2aWV3bmFtZSgkY3VydmlldykgJHZpZXduYW1lKCRjdXJ2aWV3KQogICAgc2V0IG5ld3ZpZXdwZXJtKCRjdXJ2aWV3KSAkdmlld3Blcm0oJGN1cnZpZXcpCiAgICBzZXQgbmV3dmlld2FyZ3MoJGN1cnZpZXcpIFtzaGVsbGFyZ2xpc3QgJHZpZXdhcmdzKCRjdXJ2aWV3KV0KICAgIHZpZXdlZGl0b3IgJHRvcCAkY3VydmlldyAiR2l0azogZWRpdCB2aWV3ICR2aWV3bmFtZSgkY3VydmlldykiCn0KCnByb2Mgdmlld2VkaXRvciB7dG9wIG4gdGl0bGV9IHsKICAgIGdsb2JhbCBuZXd2aWV3bmFtZSBuZXd2aWV3cGVybSB2aWV3ZmlsZXMKICAgIGdsb2JhbCB1aWZvbnQKCiAgICB0b3BsZXZlbCAkdG9wCiAgICB3bSB0aXRsZSAkdG9wICR0aXRsZQogICAgbGFiZWwgJHRvcC5ubCAtdGV4dCAiTmFtZSIgLWZvbnQgJHVpZm9udAogICAgZW50cnkgJHRvcC5uYW1lIC13aWR0aCAyMCAtdGV4dHZhcmlhYmxlIG5ld3ZpZXduYW1lKCRuKQogICAgZ3JpZCAkdG9wLm5sICR0b3AubmFtZSAtc3RpY2t5IHcgLXBhZHkgNQogICAgY2hlY2tidXR0b24gJHRvcC5wZXJtIC10ZXh0ICJSZW1lbWJlciB0aGlzIHZpZXciIC12YXJpYWJsZSBuZXd2aWV3cGVybSgkbikKICAgIGdyaWQgJHRvcC5wZXJtIC0gLXBhZHkgNSAtc3RpY2t5IHcKICAgIG1lc3NhZ2UgJHRvcC5hbCAtYXNwZWN0IDEwMDAgLWZvbnQgJHVpZm9udCBcCgktdGV4dCAiQ29tbWl0cyB0byBpbmNsdWRlIChhcmd1bWVudHMgdG8gZ2l0IHJldi1saXN0KToiCiAgICBncmlkICR0b3AuYWwgLSAtc3RpY2t5IHcgLXBhZHkgNQogICAgZW50cnkgJHRvcC5hcmdzIC13aWR0aCA1MCAtdGV4dHZhcmlhYmxlIG5ld3ZpZXdhcmdzKCRuKSBcCgktYmFja2dyb3VuZCB3aGl0ZQogICAgZ3JpZCAkdG9wLmFyZ3MgLSAtc3RpY2t5IGV3IC1wYWR4IDUKICAgIG1lc3NhZ2UgJHRvcC5sIC1hc3BlY3QgMTAwMCAtZm9udCAkdWlmb250IFwKCS10ZXh0ICJFbnRlciBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgdG8gaW5jbHVkZSwgb25lIHBlciBsaW5lOiIKICAgIGdyaWQgJHRvcC5sIC0gLXN0aWNreSB3CiAgICB0ZXh0ICR0b3AudCAtd2lkdGggNDAgLWhlaWdodCAxMCAtYmFja2dyb3VuZCB3aGl0ZQogICAgaWYge1tpbmZvIGV4aXN0cyB2aWV3ZmlsZXMoJG4pXX0gewoJZm9yZWFjaCBmICR2aWV3ZmlsZXMoJG4pIHsKCSAgICAkdG9wLnQgaW5zZXJ0IGVuZCAkZgoJICAgICR0b3AudCBpbnNlcnQgZW5kICJcbiIKCX0KCSR0b3AudCBkZWxldGUge2VuZCAtIDFjfSBlbmQKCSR0b3AudCBtYXJrIHNldCBpbnNlcnQgMC4wCiAgICB9CiAgICBncmlkICR0b3AudCAtIC1zdGlja3kgZXcgLXBhZHggNQogICAgZnJhbWUgJHRvcC5idXRzCiAgICBidXR0b24gJHRvcC5idXRzLm9rIC10ZXh0ICJPSyIgLWNvbW1hbmQgW2xpc3QgbmV3dmlld29rICR0b3AgJG5dCiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCBbbGlzdCBkZXN0cm95ICR0b3BdCiAgICBncmlkICR0b3AuYnV0cy5vayAkdG9wLmJ1dHMuY2FuCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgJHRvcC5idXRzIC0gLXBhZHkgMTAgLXN0aWNreSBldwogICAgZm9jdXMgJHRvcC50Cn0KCnByb2MgZG92aWV3bWVudSB7bSBmaXJzdCBjbWQgb3AgYXJndn0gewogICAgc2V0IG5tZW51IFskbSBpbmRleCBlbmRdCiAgICBmb3Ige3NldCBpICRmaXJzdH0geyRpIDw9ICRubWVudX0ge2luY3IgaX0gewoJaWYge1skbSBlbnRyeWNnZXQgJGkgLWNvbW1hbmRdIGVxICRjbWR9IHsKCSAgICBldmFsICRtICRvcCAkaSAkYXJndgoJICAgIGJyZWFrCgl9CiAgICB9Cn0KCnByb2MgYWxsdmlld21lbnVzIHtuIG9wIGFyZ3N9IHsKICAgIGdsb2JhbCB2aWV3aGxtZW51CgogICAgZG92aWV3bWVudSAuYmFyLnZpZXcgNyBbbGlzdCBzaG93dmlldyAkbl0gJG9wICRhcmdzCiAgICBkb3ZpZXdtZW51ICR2aWV3aGxtZW51IDEgW2xpc3QgYWRkdmhpZ2hsaWdodCAkbl0gJG9wICRhcmdzCn0KCnByb2MgbmV3dmlld29rIHt0b3Agbn0gewogICAgZ2xvYmFsIG5leHR2aWV3bnVtIG5ld3ZpZXdwZXJtIG5ld3ZpZXduYW1lIG5ld2lzaGlnaGxpZ2h0CiAgICBnbG9iYWwgdmlld25hbWUgdmlld2ZpbGVzIHZpZXdwZXJtIHNlbGVjdGVkdmlldyBjdXJ2aWV3CiAgICBnbG9iYWwgdmlld2FyZ3MgbmV3dmlld2FyZ3Mgdmlld2hsbWVudQoKICAgIGlmIHtbY2F0Y2ggewoJc2V0IG5ld2FyZ3MgW3NoZWxsc3BsaXQgJG5ld3ZpZXdhcmdzKCRuKV0KICAgIH0gZXJyXX0gewoJZXJyb3JfcG9wdXAgIkVycm9yIGluIGNvbW1pdCBzZWxlY3Rpb24gYXJndW1lbnRzOiAkZXJyIgoJd20gcmFpc2UgJHRvcAoJZm9jdXMgJHRvcAoJcmV0dXJuCiAgICB9CiAgICBzZXQgZmlsZXMge30KICAgIGZvcmVhY2ggZiBbc3BsaXQgWyR0b3AudCBnZXQgMC4wIGVuZF0gIlxuIl0gewoJc2V0IGZ0IFtzdHJpbmcgdHJpbSAkZl0KCWlmIHskZnQgbmUge319IHsKCSAgICBsYXBwZW5kIGZpbGVzICRmdAoJfQogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgdmlld2ZpbGVzKCRuKV19IHsKCSMgY3JlYXRpbmcgYSBuZXcgdmlldwoJaW5jciBuZXh0dmlld251bQoJc2V0IHZpZXduYW1lKCRuKSAkbmV3dmlld25hbWUoJG4pCglzZXQgdmlld3Blcm0oJG4pICRuZXd2aWV3cGVybSgkbikKCXNldCB2aWV3ZmlsZXMoJG4pICRmaWxlcwoJc2V0IHZpZXdhcmdzKCRuKSAkbmV3YXJncwoJYWRkdmlld21lbnUgJG4KCWlmIHshJG5ld2lzaGlnaGxpZ2h0fSB7CgkgICAgYWZ0ZXIgaWRsZSBzaG93dmlldyAkbgoJfSBlbHNlIHsKCSAgICBhZnRlciBpZGxlIGFkZHZoaWdobGlnaHQgJG4KCX0KICAgIH0gZWxzZSB7CgkjIGVkaXRpbmcgYW4gZXhpc3RpbmcgdmlldwoJc2V0IHZpZXdwZXJtKCRuKSAkbmV3dmlld3Blcm0oJG4pCglpZiB7JG5ld3ZpZXduYW1lKCRuKSBuZSAkdmlld25hbWUoJG4pfSB7CgkgICAgc2V0IHZpZXduYW1lKCRuKSAkbmV3dmlld25hbWUoJG4pCgkgICAgZG92aWV3bWVudSAuYmFyLnZpZXcgNyBbbGlzdCBzaG93dmlldyAkbl0gXAoJCWVudHJ5Y29uZiBbbGlzdCAtbGFiZWwgJHZpZXduYW1lKCRuKV0KCSAgICBkb3ZpZXdtZW51ICR2aWV3aGxtZW51IDEgW2xpc3QgYWRkdmhpZ2hsaWdodCAkbl0gXAoJCWVudHJ5Y29uZiBbbGlzdCAtbGFiZWwgJHZpZXduYW1lKCRuKSAtdmFsdWUgJHZpZXduYW1lKCRuKV0KCX0KCWlmIHskZmlsZXMgbmUgJHZpZXdmaWxlcygkbikgfHwgJG5ld2FyZ3MgbmUgJHZpZXdhcmdzKCRuKX0gewoJICAgIHNldCB2aWV3ZmlsZXMoJG4pICRmaWxlcwoJICAgIHNldCB2aWV3YXJncygkbikgJG5ld2FyZ3MKCSAgICBpZiB7JGN1cnZpZXcgPT0gJG59IHsKCQlhZnRlciBpZGxlIHVwZGF0ZWNvbW1pdHMKCSAgICB9Cgl9CiAgICB9CiAgICBjYXRjaCB7ZGVzdHJveSAkdG9wfQp9Cgpwcm9jIGRlbHZpZXcge30gewogICAgZ2xvYmFsIGN1cnZpZXcgdmlld2RhdGEgdmlld3Blcm0gaGx2aWV3IHNlbGVjdGVkaGx2aWV3CgogICAgaWYgeyRjdXJ2aWV3ID09IDB9IHJldHVybgogICAgaWYge1tpbmZvIGV4aXN0cyBobHZpZXddICYmICRobHZpZXcgPT0gJGN1cnZpZXd9IHsKCXNldCBzZWxlY3RlZGhsdmlldyBOb25lCgl1bnNldCBobHZpZXcKICAgIH0KICAgIGFsbHZpZXdtZW51cyAkY3VydmlldyBkZWxldGUKICAgIHNldCB2aWV3ZGF0YSgkY3Vydmlldykge30KICAgIHNldCB2aWV3cGVybSgkY3VydmlldykgMAogICAgc2hvd3ZpZXcgMAp9Cgpwcm9jIGFkZHZpZXdtZW51IHtufSB7CiAgICBnbG9iYWwgdmlld25hbWUgdmlld2hsbWVudQoKICAgIC5iYXIudmlldyBhZGQgcmFkaW9idXR0b24gLWxhYmVsICR2aWV3bmFtZSgkbikgXAoJLWNvbW1hbmQgW2xpc3Qgc2hvd3ZpZXcgJG5dIC12YXJpYWJsZSBzZWxlY3RlZHZpZXcgLXZhbHVlICRuCiAgICAkdmlld2hsbWVudSBhZGQgcmFkaW9idXR0b24gLWxhYmVsICR2aWV3bmFtZSgkbikgXAoJLWNvbW1hbmQgW2xpc3QgYWRkdmhpZ2hsaWdodCAkbl0gLXZhcmlhYmxlIHNlbGVjdGVkaGx2aWV3Cn0KCnByb2MgZmxhdHRlbiB7dmFyfSB7CiAgICBnbG9iYWwgJHZhcgoKICAgIHNldCByZXQge30KICAgIGZvcmVhY2ggaSBbYXJyYXkgbmFtZXMgJHZhcl0gewoJbGFwcGVuZCByZXQgJGkgW3NldCAkdmFyXCgkaVwpXQogICAgfQogICAgcmV0dXJuICRyZXQKfQoKcHJvYyB1bmZsYXR0ZW4ge3ZhciBsfSB7CiAgICBnbG9iYWwgJHZhcgoKICAgIGNhdGNoIHt1bnNldCAkdmFyfQogICAgZm9yZWFjaCB7aSB2fSAkbCB7CglzZXQgJHZhclwoJGlcKSAkdgogICAgfQp9Cgpwcm9jIHNob3d2aWV3IHtufSB7CiAgICBnbG9iYWwgY3VydmlldyB2aWV3ZGF0YSB2aWV3ZmlsZXMKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgcGFyZW50bGlzdCBjaGlsZGxpc3Qgcm93aWRsaXN0IHJvd29mZnNldHMKICAgIGdsb2JhbCBjb2xvcm1hcCByb3d0ZXh0eCBjb21taXRyb3cgbmV4dGNvbG9yIGNhbnZ4bWF4CiAgICBnbG9iYWwgbnVtY29tbWl0cyByb3dyYW5nZWxpc3QgY29tbWl0bGlzdGVkIGlkcm93cmFuZ2VzCiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lIGN1cnJlbnRpZCBjYW52IGNhbnZ5MAogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgdHJlZWRpZmZzCiAgICBnbG9iYWwgcGVuZGluZ19zZWxlY3QgcGhhc2UKICAgIGdsb2JhbCBjb21taXRpZHggcm93bGFpZG91dCByb3dvcHRpbSBsaW5lc2VnZW5kcwogICAgZ2xvYmFsIGNvbW1mZCBuZXh0dXBkYXRlCiAgICBnbG9iYWwgc2VsZWN0ZWR2aWV3CiAgICBnbG9iYWwgdnBhcmVudGxpc3QgdmNoaWxkbGlzdCB2ZGlzcG9yZGVyIHZjbWl0bGlzdGVkCiAgICBnbG9iYWwgaGx2aWV3IHNlbGVjdGVkaGx2aWV3CgogICAgaWYgeyRuID09ICRjdXJ2aWV3fSByZXR1cm4KICAgIHNldCBzZWxpZCB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CglzZXQgc2VsaWQgJGN1cnJlbnRpZAoJc2V0IHkgW3ljICRzZWxlY3RlZGxpbmVdCglzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCglzZXQgc3BhbiBbJGNhbnYgeXZpZXddCglzZXQgeXRvcCBbZXhwciB7W2xpbmRleCAkc3BhbiAwXSAqICR5bWF4fV0KCXNldCB5Ym90IFtleHByIHtbbGluZGV4ICRzcGFuIDFdICogJHltYXh9XQoJaWYgeyR5dG9wIDwgJHkgJiYgJHkgPCAkeWJvdH0gewoJICAgIHNldCB5c2NyZWVuIFtleHByIHskeSAtICR5dG9wfV0KCX0gZWxzZSB7CgkgICAgc2V0IHlzY3JlZW4gW2V4cHIgeygkeWJvdCAtICR5dG9wKSAvIDJ9XQoJfQogICAgfQogICAgdW5zZWxlY3RsaW5lCiAgICBub3JtYWxsaW5lCiAgICBzdG9wZmluZHByb2MKICAgIGlmIHskY3VydmlldyA+PSAwfSB7CglzZXQgdnBhcmVudGxpc3QoJGN1cnZpZXcpICRwYXJlbnRsaXN0CglzZXQgdmNoaWxkbGlzdCgkY3VydmlldykgJGNoaWxkbGlzdAoJc2V0IHZkaXNwb3JkZXIoJGN1cnZpZXcpICRkaXNwbGF5b3JkZXIKCXNldCB2Y21pdGxpc3RlZCgkY3VydmlldykgJGNvbW1pdGxpc3RlZAoJaWYgeyRwaGFzZSBuZSB7fX0gewoJICAgIHNldCB2aWV3ZGF0YSgkY3VydmlldykgXAoJCVtsaXN0ICRwaGFzZSAkcm93aWRsaXN0ICRyb3dvZmZzZXRzICRyb3dyYW5nZWxpc3QgXAoJCSAgICAgW2ZsYXR0ZW4gaWRyb3dyYW5nZXNdIFtmbGF0dGVuIGlkaW5saXN0XSBcCgkJICAgICAkcm93bGFpZG91dCAkcm93b3B0aW0gJG51bWNvbW1pdHMgJGxpbmVzZWdlbmRzXQoJfSBlbHNlaWYgeyFbaW5mbyBleGlzdHMgdmlld2RhdGEoJGN1cnZpZXcpXQoJCSAgfHwgW2xpbmRleCAkdmlld2RhdGEoJGN1cnZpZXcpIDBdIG5lIHt9fSB7CgkgICAgc2V0IHZpZXdkYXRhKCRjdXJ2aWV3KSBcCgkJW2xpc3Qge30gJHJvd2lkbGlzdCAkcm93b2Zmc2V0cyAkcm93cmFuZ2VsaXN0XQoJfQogICAgfQogICAgY2F0Y2gge3Vuc2V0IG1hdGNoaW5nbGluZXN9CiAgICBjYXRjaCB7dW5zZXQgdHJlZWRpZmZzfQogICAgY2xlYXJfZGlzcGxheQogICAgaWYge1tpbmZvIGV4aXN0cyBobHZpZXddICYmICRobHZpZXcgPT0gJG59IHsKCXVuc2V0IGhsdmlldwoJc2V0IHNlbGVjdGVkaGx2aWV3IE5vbmUKICAgIH0KCiAgICBzZXQgY3VydmlldyAkbgogICAgc2V0IHNlbGVjdGVkdmlldyAkbgogICAgLmJhci52aWV3IGVudHJ5Y29uZiAyIC1zdGF0ZSBbZXhwciB7JG4gPT0gMD8gImRpc2FibGVkIjogIm5vcm1hbCJ9XQogICAgLmJhci52aWV3IGVudHJ5Y29uZiAzIC1zdGF0ZSBbZXhwciB7JG4gPT0gMD8gImRpc2FibGVkIjogIm5vcm1hbCJ9XQoKICAgIGlmIHshW2luZm8gZXhpc3RzIHZpZXdkYXRhKCRuKV19IHsKCXNldCBwZW5kaW5nX3NlbGVjdCAkc2VsaWQKCWdldGNvbW1pdHMKCXJldHVybgogICAgfQoKICAgIHNldCB2ICR2aWV3ZGF0YSgkbikKICAgIHNldCBwaGFzZSBbbGluZGV4ICR2IDBdCiAgICBzZXQgZGlzcGxheW9yZGVyICR2ZGlzcG9yZGVyKCRuKQogICAgc2V0IHBhcmVudGxpc3QgJHZwYXJlbnRsaXN0KCRuKQogICAgc2V0IGNoaWxkbGlzdCAkdmNoaWxkbGlzdCgkbikKICAgIHNldCBjb21taXRsaXN0ZWQgJHZjbWl0bGlzdGVkKCRuKQogICAgc2V0IHJvd2lkbGlzdCBbbGluZGV4ICR2IDFdCiAgICBzZXQgcm93b2Zmc2V0cyBbbGluZGV4ICR2IDJdCiAgICBzZXQgcm93cmFuZ2VsaXN0IFtsaW5kZXggJHYgM10KICAgIGlmIHskcGhhc2UgZXEge319IHsKCXNldCBudW1jb21taXRzIFtsbGVuZ3RoICRkaXNwbGF5b3JkZXJdCgljYXRjaCB7dW5zZXQgaWRyb3dyYW5nZXN9CiAgICB9IGVsc2UgewoJdW5mbGF0dGVuIGlkcm93cmFuZ2VzIFtsaW5kZXggJHYgNF0KCXVuZmxhdHRlbiBpZGlubGlzdCBbbGluZGV4ICR2IDVdCglzZXQgcm93bGFpZG91dCBbbGluZGV4ICR2IDZdCglzZXQgcm93b3B0aW0gW2xpbmRleCAkdiA3XQoJc2V0IG51bWNvbW1pdHMgW2xpbmRleCAkdiA4XQoJc2V0IGxpbmVzZWdlbmRzIFtsaW5kZXggJHYgOV0KICAgIH0KCiAgICBjYXRjaCB7dW5zZXQgY29sb3JtYXB9CiAgICBjYXRjaCB7dW5zZXQgcm93dGV4dHh9CiAgICBzZXQgbmV4dGNvbG9yIDAKICAgIHNldCBjYW52eG1heCBbJGNhbnYgY2dldCAtd2lkdGhdCiAgICBzZXQgY3VydmlldyAkbgogICAgc2V0IHJvdyAwCiAgICBzZXRjYW52c2Nyb2xsCiAgICBzZXQgeWYgMAogICAgc2V0IHJvdyAwCiAgICBpZiB7JHNlbGlkIG5lIHt9ICYmIFtpbmZvIGV4aXN0cyBjb21taXRyb3coJG4sJHNlbGlkKV19IHsKCXNldCByb3cgJGNvbW1pdHJvdygkbiwkc2VsaWQpCgkjIHRyeSB0byBnZXQgdGhlIHNlbGVjdGVkIHJvdyBpbiB0aGUgc2FtZSBwb3NpdGlvbiBvbiB0aGUgc2NyZWVuCglzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCglzZXQgeXRvcCBbZXhwciB7W3ljICRyb3ddIC0gJHlzY3JlZW59XQoJaWYgeyR5dG9wIDwgMH0gewoJICAgIHNldCB5dG9wIDAKCX0KCXNldCB5ZiBbZXhwciB7JHl0b3AgKiAxLjAgLyAkeW1heH1dCiAgICB9CiAgICBhbGxjYW52cyB5dmlldyBtb3ZldG8gJHlmCiAgICBkcmF3dmlzaWJsZQogICAgc2VsZWN0bGluZSAkcm93IDAKICAgIGlmIHskcGhhc2UgbmUge319IHsKCWlmIHskcGhhc2UgZXEgImdldGNvbW1pdHMifSB7CgkgICAgc2hvd19zdGF0dXMgIlJlYWRpbmcgY29tbWl0cy4uLiIKCX0KCWlmIHtbaW5mbyBleGlzdHMgY29tbWZkKCRuKV19IHsKCSAgICBsYXlvdXRtb3JlCgl9IGVsc2UgewoJICAgIGZpbmlzaGNvbW1pdHMKCX0KICAgIH0gZWxzZWlmIHskbnVtY29tbWl0cyA9PSAwfSB7CglzaG93X3N0YXR1cyAiTm8gY29tbWl0cyBzZWxlY3RlZCIKICAgIH0KfQoKIyBTdHVmZiByZWxhdGluZyB0byB0aGUgaGlnaGxpZ2h0aW5nIGZhY2lsaXR5Cgpwcm9jIGlzaGlnaGxpZ2h0ZWQge3Jvd30gewogICAgZ2xvYmFsIHZoaWdobGlnaHRzIGZoaWdobGlnaHRzIG5oaWdobGlnaHRzIHJoaWdobGlnaHRzCgogICAgaWYge1tpbmZvIGV4aXN0cyBuaGlnaGxpZ2h0cygkcm93KV0gJiYgJG5oaWdobGlnaHRzKCRyb3cpID4gMH0gewoJcmV0dXJuICRuaGlnaGxpZ2h0cygkcm93KQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyB2aGlnaGxpZ2h0cygkcm93KV0gJiYgJHZoaWdobGlnaHRzKCRyb3cpID4gMH0gewoJcmV0dXJuICR2aGlnaGxpZ2h0cygkcm93KQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBmaGlnaGxpZ2h0cygkcm93KV0gJiYgJGZoaWdobGlnaHRzKCRyb3cpID4gMH0gewoJcmV0dXJuICRmaGlnaGxpZ2h0cygkcm93KQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyByaGlnaGxpZ2h0cygkcm93KV0gJiYgJHJoaWdobGlnaHRzKCRyb3cpID4gMH0gewoJcmV0dXJuICRyaGlnaGxpZ2h0cygkcm93KQogICAgfQogICAgcmV0dXJuIDAKfQoKcHJvYyBib2xkZW4ge3JvdyBmb250fSB7CiAgICBnbG9iYWwgY2FudiBsaW5laHRhZyBzZWxlY3RlZGxpbmUgYm9sZHJvd3MKCiAgICBsYXBwZW5kIGJvbGRyb3dzICRyb3cKICAgICRjYW52IGl0ZW1jb25mICRsaW5laHRhZygkcm93KSAtZm9udCAkZm9udAogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdICYmICRyb3cgPT0gJHNlbGVjdGVkbGluZX0gewoJJGNhbnYgZGVsZXRlIHNlY3NlbAoJc2V0IHQgW2V2YWwgJGNhbnYgY3JlYXRlIHJlY3QgWyRjYW52IGJib3ggJGxpbmVodGFnKCRyb3cpXSBcCgkJICAgLW91dGxpbmUge3t9fSAtdGFncyBzZWNzZWwgXAoJCSAgIC1maWxsIFskY2FudiBjZ2V0IC1zZWxlY3RiYWNrZ3JvdW5kXV0KCSRjYW52IGxvd2VyICR0CiAgICB9Cn0KCnByb2MgYm9sZGVuX25hbWUge3JvdyBmb250fSB7CiAgICBnbG9iYWwgY2FudjIgbGluZW50YWcgc2VsZWN0ZWRsaW5lIGJvbGRuYW1lcm93cwoKICAgIGxhcHBlbmQgYm9sZG5hbWVyb3dzICRyb3cKICAgICRjYW52MiBpdGVtY29uZiAkbGluZW50YWcoJHJvdykgLWZvbnQgJGZvbnQKICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXSAmJiAkcm93ID09ICRzZWxlY3RlZGxpbmV9IHsKCSRjYW52MiBkZWxldGUgc2Vjc2VsCglzZXQgdCBbZXZhbCAkY2FudjIgY3JlYXRlIHJlY3QgWyRjYW52MiBiYm94ICRsaW5lbnRhZygkcm93KV0gXAoJCSAgIC1vdXRsaW5lIHt7fX0gLXRhZ3Mgc2Vjc2VsIFwKCQkgICAtZmlsbCBbJGNhbnYyIGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQoJJGNhbnYyIGxvd2VyICR0CiAgICB9Cn0KCnByb2MgdW5ib2xkZW4ge30gewogICAgZ2xvYmFsIG1haW5mb250IGJvbGRyb3dzCgogICAgc2V0IHN0aWxsYm9sZCB7fQogICAgZm9yZWFjaCByb3cgJGJvbGRyb3dzIHsKCWlmIHshW2lzaGlnaGxpZ2h0ZWQgJHJvd119IHsKCSAgICBib2xkZW4gJHJvdyAkbWFpbmZvbnQKCX0gZWxzZSB7CgkgICAgbGFwcGVuZCBzdGlsbGJvbGQgJHJvdwoJfQogICAgfQogICAgc2V0IGJvbGRyb3dzICRzdGlsbGJvbGQKfQoKcHJvYyBhZGR2aGlnaGxpZ2h0IHtufSB7CiAgICBnbG9iYWwgaGx2aWV3IGN1cnZpZXcgdmlld2RhdGEgdmhsX2RvbmUgdmhpZ2hsaWdodHMgY29tbWl0aWR4CgogICAgaWYge1tpbmZvIGV4aXN0cyBobHZpZXddfSB7CglkZWx2aGlnaGxpZ2h0CiAgICB9CiAgICBzZXQgaGx2aWV3ICRuCiAgICBpZiB7JG4gIT0gJGN1cnZpZXcgJiYgIVtpbmZvIGV4aXN0cyB2aWV3ZGF0YSgkbildfSB7CglzZXQgdmlld2RhdGEoJG4pIFtsaXN0IGdldGNvbW1pdHMge3t9fSB7e319IHt9IHt9IHt9IDAgMCAwIHt9XQoJc2V0IHZwYXJlbnRsaXN0KCRuKSB7fQoJc2V0IHZjaGlsZGxpc3QoJG4pIHt9CglzZXQgdmRpc3BvcmRlcigkbikge30KCXNldCB2Y21pdGxpc3RlZCgkbikge30KCXN0YXJ0X3Jldl9saXN0ICRuCiAgICB9CiAgICBzZXQgdmhsX2RvbmUgJGNvbW1pdGlkeCgkaGx2aWV3KQogICAgaWYgeyR2aGxfZG9uZSA+IDB9IHsKCWRyYXd2aXNpYmxlCiAgICB9Cn0KCnByb2MgZGVsdmhpZ2hsaWdodCB7fSB7CiAgICBnbG9iYWwgaGx2aWV3IHZoaWdobGlnaHRzCgogICAgaWYgeyFbaW5mbyBleGlzdHMgaGx2aWV3XX0gcmV0dXJuCiAgICB1bnNldCBobHZpZXcKICAgIGNhdGNoIHt1bnNldCB2aGlnaGxpZ2h0c30KICAgIHVuYm9sZGVuCn0KCnByb2MgdmhpZ2hsaWdodG1vcmUge30gewogICAgZ2xvYmFsIGhsdmlldyB2aGxfZG9uZSBjb21taXRpZHggdmhpZ2hsaWdodHMKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgdmRpc3BvcmRlciBjdXJ2aWV3IG1haW5mb250CgogICAgc2V0IGZvbnQgW2NvbmNhdCAkbWFpbmZvbnQgYm9sZF0KICAgIHNldCBtYXggJGNvbW1pdGlkeCgkaGx2aWV3KQogICAgaWYgeyRobHZpZXcgPT0gJGN1cnZpZXd9IHsKCXNldCBkaXNwICRkaXNwbGF5b3JkZXIKICAgIH0gZWxzZSB7CglzZXQgZGlzcCAkdmRpc3BvcmRlcigkaGx2aWV3KQogICAgfQogICAgc2V0IHZyIFt2aXNpYmxlcm93c10KICAgIHNldCByMCBbbGluZGV4ICR2ciAwXQogICAgc2V0IHIxIFtsaW5kZXggJHZyIDFdCiAgICBmb3Ige3NldCBpICR2aGxfZG9uZX0geyRpIDwgJG1heH0ge2luY3IgaX0gewoJc2V0IGlkIFtsaW5kZXggJGRpc3AgJGldCglpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXX0gewoJICAgIHNldCByb3cgJGNvbW1pdHJvdygkY3VydmlldywkaWQpCgkgICAgaWYgeyRyMCA8PSAkcm93ICYmICRyb3cgPD0gJHIxfSB7CgkJaWYgeyFbaGlnaGxpZ2h0ZWQgJHJvd119IHsKCQkgICAgYm9sZGVuICRyb3cgJGZvbnQKCQl9CgkJc2V0IHZoaWdobGlnaHRzKCRyb3cpIDEKCSAgICB9Cgl9CiAgICB9CiAgICBzZXQgdmhsX2RvbmUgJG1heAp9Cgpwcm9jIGFza3ZoaWdobGlnaHQge3JvdyBpZH0gewogICAgZ2xvYmFsIGhsdmlldyB2aGlnaGxpZ2h0cyBjb21taXRyb3cgaWRkcmF3biBtYWluZm9udAoKICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRobHZpZXcsJGlkKV19IHsKCWlmIHtbaW5mbyBleGlzdHMgaWRkcmF3bigkaWQpXSAmJiAhW2lzaGlnaGxpZ2h0ZWQgJHJvd119IHsKCSAgICBib2xkZW4gJHJvdyBbY29uY2F0ICRtYWluZm9udCBib2xkXQoJfQoJc2V0IHZoaWdobGlnaHRzKCRyb3cpIDEKICAgIH0gZWxzZSB7CglzZXQgdmhpZ2hsaWdodHMoJHJvdykgMAogICAgfQp9Cgpwcm9jIGhmaWxlc19jaGFuZ2Uge25hbWUgaXggb3B9IHsKICAgIGdsb2JhbCBoaWdobGlnaHRfZmlsZXMgZmlsZWhpZ2hsaWdodCBmaGlnaGxpZ2h0cyBmaF9zZXJpYWwKICAgIGdsb2JhbCBtYWluZm9udCBoaWdobGlnaHRfcGF0aHMKCiAgICBpZiB7W2luZm8gZXhpc3RzIGZpbGVoaWdobGlnaHRdfSB7CgkjIGRlbGV0ZSBwcmV2aW91cyBoaWdobGlnaHRzCgljYXRjaCB7Y2xvc2UgJGZpbGVoaWdobGlnaHR9Cgl1bnNldCBmaWxlaGlnaGxpZ2h0CgljYXRjaCB7dW5zZXQgZmhpZ2hsaWdodHN9Cgl1bmJvbGRlbgoJdW5oaWdobGlnaHRfZmlsZWxpc3QKICAgIH0KICAgIHNldCBoaWdobGlnaHRfcGF0aHMge30KICAgIGFmdGVyIGNhbmNlbCBkb19maWxlX2hsICRmaF9zZXJpYWwKICAgIGluY3IgZmhfc2VyaWFsCiAgICBpZiB7JGhpZ2hsaWdodF9maWxlcyBuZSB7fX0gewoJYWZ0ZXIgMzAwIGRvX2ZpbGVfaGwgJGZoX3NlcmlhbAogICAgfQp9Cgpwcm9jIG1ha2VwYXR0ZXJucyB7bH0gewogICAgc2V0IHJldCB7fQogICAgZm9yZWFjaCBlICRsIHsKCXNldCBlZSBbc3RyaW5nIG1hcCB7IioiICJcXCoiICI/IiAiXFw/IiAiXFsiICJcXFxbIiAiXFwiICJcXFxcIn0gJGVdCglpZiB7W3N0cmluZyBpbmRleCAkZWUgZW5kXSBlcSAiLyJ9IHsKCSAgICBsYXBwZW5kIHJldCAiJGVlKiIKCX0gZWxzZSB7CgkgICAgbGFwcGVuZCByZXQgJGVlCgkgICAgbGFwcGVuZCByZXQgIiRlZS8qIgoJfQogICAgfQogICAgcmV0dXJuICRyZXQKfQoKcHJvYyBkb19maWxlX2hsIHtzZXJpYWx9IHsKICAgIGdsb2JhbCBoaWdobGlnaHRfZmlsZXMgZmlsZWhpZ2hsaWdodCBoaWdobGlnaHRfcGF0aHMgZ2R0dHlwZSBmaGxfbGlzdAoKICAgIGlmIHskZ2R0dHlwZSBlcSAidG91Y2hpbmcgcGF0aHM6In0gewoJaWYge1tjYXRjaCB7c2V0IHBhdGhzIFtzaGVsbHNwbGl0ICRoaWdobGlnaHRfZmlsZXNdfV19IHJldHVybgoJc2V0IGhpZ2hsaWdodF9wYXRocyBbbWFrZXBhdHRlcm5zICRwYXRoc10KCWhpZ2hsaWdodF9maWxlbGlzdAoJc2V0IGdkdGFyZ3MgW2NvbmNhdCAtLSAkcGF0aHNdCiAgICB9IGVsc2UgewoJc2V0IGdkdGFyZ3MgW2xpc3QgIi1TJGhpZ2hsaWdodF9maWxlcyJdCiAgICB9CiAgICBzZXQgY21kIFtjb25jYXQgfCBnaXQtZGlmZi10cmVlIC1yIC1zIC0tc3RkaW4gJGdkdGFyZ3NdCiAgICBzZXQgZmlsZWhpZ2hsaWdodCBbb3BlbiAkY21kIHIrXQogICAgZmNvbmZpZ3VyZSAkZmlsZWhpZ2hsaWdodCAtYmxvY2tpbmcgMAogICAgZmlsZWV2ZW50ICRmaWxlaGlnaGxpZ2h0IHJlYWRhYmxlIHJlYWRmaGlnaGxpZ2h0CiAgICBzZXQgZmhsX2xpc3Qge30KICAgIGRyYXd2aXNpYmxlCiAgICBmbHVzaGhpZ2hsaWdodHMKfQoKcHJvYyBmbHVzaGhpZ2hsaWdodHMge30gewogICAgZ2xvYmFsIGZpbGVoaWdobGlnaHQgZmhsX2xpc3QKCiAgICBpZiB7W2luZm8gZXhpc3RzIGZpbGVoaWdobGlnaHRdfSB7CglsYXBwZW5kIGZobF9saXN0IHt9CglwdXRzICRmaWxlaGlnaGxpZ2h0ICIiCglmbHVzaCAkZmlsZWhpZ2hsaWdodAogICAgfQp9Cgpwcm9jIGFza2ZpbGVoaWdobGlnaHQge3JvdyBpZH0gewogICAgZ2xvYmFsIGZpbGVoaWdobGlnaHQgZmhpZ2hsaWdodHMgZmhsX2xpc3QKCiAgICBsYXBwZW5kIGZobF9saXN0ICRpZAogICAgc2V0IGZoaWdobGlnaHRzKCRyb3cpIC0xCiAgICBwdXRzICRmaWxlaGlnaGxpZ2h0ICRpZAp9Cgpwcm9jIHJlYWRmaGlnaGxpZ2h0IHt9IHsKICAgIGdsb2JhbCBmaWxlaGlnaGxpZ2h0IGZoaWdobGlnaHRzIGNvbW1pdHJvdyBjdXJ2aWV3IG1haW5mb250IGlkZHJhd24KICAgIGdsb2JhbCBmaGxfbGlzdAoKICAgIHdoaWxlIHtbZ2V0cyAkZmlsZWhpZ2hsaWdodCBsaW5lXSA+PSAwfSB7CglzZXQgbGluZSBbc3RyaW5nIHRyaW0gJGxpbmVdCglzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGZobF9saXN0ICRsaW5lXQoJaWYgeyRpIDwgMH0gY29udGludWUKCWZvciB7c2V0IGogMH0geyRqIDwgJGl9IHtpbmNyIGp9IHsKCSAgICBzZXQgaWQgW2xpbmRleCAkZmhsX2xpc3QgJGpdCgkgICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGlkKV19IHsKCQlzZXQgZmhpZ2hsaWdodHMoJGNvbW1pdHJvdygkY3VydmlldywkaWQpKSAwCgkgICAgfQoJfQoJc2V0IGZobF9saXN0IFtscmFuZ2UgJGZobF9saXN0IFtleHByIHskaSsxfV0gZW5kXQoJaWYgeyRsaW5lIGVxIHt9fSBjb250aW51ZQoJaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRsaW5lKV19IGNvbnRpbnVlCglzZXQgcm93ICRjb21taXRyb3coJGN1cnZpZXcsJGxpbmUpCglpZiB7W2luZm8gZXhpc3RzIGlkZHJhd24oJGxpbmUpXSAmJiAhW2lzaGlnaGxpZ2h0ZWQgJHJvd119IHsKCSAgICBib2xkZW4gJHJvdyBbY29uY2F0ICRtYWluZm9udCBib2xkXQoJfQoJc2V0IGZoaWdobGlnaHRzKCRyb3cpIDEKICAgIH0KICAgIGlmIHtbZW9mICRmaWxlaGlnaGxpZ2h0XX0gewoJIyBzdHJhbmdlLi4uCglwdXRzICJvb3BzLCBnaXQtZGlmZi10cmVlIGRpZWQiCgljYXRjaCB7Y2xvc2UgJGZpbGVoaWdobGlnaHR9Cgl1bnNldCBmaWxlaGlnaGxpZ2h0CiAgICB9CiAgICBuZXh0X2hsY29udAp9Cgpwcm9jIGZpbmRfY2hhbmdlIHtuYW1lIGl4IG9wfSB7CiAgICBnbG9iYWwgbmhpZ2hsaWdodHMgbWFpbmZvbnQgYm9sZG5hbWVyb3dzCiAgICBnbG9iYWwgZmluZHN0cmluZyBmaW5kcGF0dGVybiBmaW5kdHlwZQoKICAgICMgZGVsZXRlIHByZXZpb3VzIGhpZ2hsaWdodHMsIGlmIGFueQogICAgZm9yZWFjaCByb3cgJGJvbGRuYW1lcm93cyB7Cglib2xkZW5fbmFtZSAkcm93ICRtYWluZm9udAogICAgfQogICAgc2V0IGJvbGRuYW1lcm93cyB7fQogICAgY2F0Y2gge3Vuc2V0IG5oaWdobGlnaHRzfQogICAgdW5ib2xkZW4KICAgIGlmIHskZmluZHR5cGUgbmUgIlJlZ2V4cCJ9IHsKCXNldCBlIFtzdHJpbmcgbWFwIHsiKiIgIlxcKiIgIj8iICJcXD8iICJcWyIgIlxcXFsiICJcXCIgIlxcXFwifSBcCgkJICAgJGZpbmRzdHJpbmddCglzZXQgZmluZHBhdHRlcm4gIiokZSoiCiAgICB9CiAgICBkcmF3dmlzaWJsZQp9Cgpwcm9jIGFza2ZpbmRoaWdobGlnaHQge3JvdyBpZH0gewogICAgZ2xvYmFsIG5oaWdobGlnaHRzIGNvbW1pdGluZm8gaWRkcmF3biBtYWluZm9udAogICAgZ2xvYmFsIGZpbmRzdHJpbmcgZmluZHR5cGUgZmluZGxvYyBmaW5kcGF0dGVybgoKICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJGlkKV19IHsKCWdldGNvbW1pdCAkaWQKICAgIH0KICAgIHNldCBpbmZvICRjb21taXRpbmZvKCRpZCkKICAgIHNldCBpc2JvbGQgMAogICAgc2V0IGZsZHR5cGVzIHtIZWFkbGluZSBBdXRob3IgRGF0ZSBDb21taXR0ZXIgQ0RhdGUgQ29tbWVudHN9CiAgICBmb3JlYWNoIGYgJGluZm8gdHkgJGZsZHR5cGVzIHsKCWlmIHskZmluZGxvYyBuZSAiQWxsIGZpZWxkcyIgJiYgJGZpbmRsb2MgbmUgJHR5fSB7CgkgICAgY29udGludWUKCX0KCWlmIHskZmluZHR5cGUgZXEgIlJlZ2V4cCJ9IHsKCSAgICBzZXQgZG9lc21hdGNoIFtyZWdleHAgJGZpbmRzdHJpbmcgJGZdCgl9IGVsc2VpZiB7JGZpbmR0eXBlIGVxICJJZ25DYXNlIn0gewoJICAgIHNldCBkb2VzbWF0Y2ggW3N0cmluZyBtYXRjaCAtbm9jYXNlICRmaW5kcGF0dGVybiAkZl0KCX0gZWxzZSB7CgkgICAgc2V0IGRvZXNtYXRjaCBbc3RyaW5nIG1hdGNoICRmaW5kcGF0dGVybiAkZl0KCX0KCWlmIHskZG9lc21hdGNofSB7CgkgICAgaWYgeyR0eSBlcSAiQXV0aG9yIn0gewoJCXNldCBpc2JvbGQgMgoJICAgIH0gZWxzZSB7CgkJc2V0IGlzYm9sZCAxCgkgICAgfQoJfQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGRyYXduKCRpZCldfSB7CglpZiB7JGlzYm9sZCAmJiAhW2lzaGlnaGxpZ2h0ZWQgJHJvd119IHsKCSAgICBib2xkZW4gJHJvdyBbY29uY2F0ICRtYWluZm9udCBib2xkXQoJfQoJaWYgeyRpc2JvbGQgPj0gMn0gewoJICAgIGJvbGRlbl9uYW1lICRyb3cgW2NvbmNhdCAkbWFpbmZvbnQgYm9sZF0KCX0KICAgIH0KICAgIHNldCBuaGlnaGxpZ2h0cygkcm93KSAkaXNib2xkCn0KCnByb2MgdnJlbF9jaGFuZ2Uge25hbWUgaXggb3B9IHsKICAgIGdsb2JhbCBoaWdobGlnaHRfcmVsYXRlZAoKICAgIHJoaWdobGlnaHRfbm9uZQogICAgaWYgeyRoaWdobGlnaHRfcmVsYXRlZCBuZSAiTm9uZSJ9IHsKCWFmdGVyIGlkbGUgZHJhd3Zpc2libGUKICAgIH0KfQoKIyBwcmVwYXJlIGZvciB0ZXN0aW5nIHdoZXRoZXIgY29tbWl0cyBhcmUgZGVzY2VuZGVudHMgb3IgYW5jZXN0b3JzIG9mIGEKcHJvYyByaGlnaGxpZ2h0X3NlbCB7YX0gewogICAgZ2xvYmFsIGRlc2NlbmRlbnQgZGVzY190b2RvIGFuY2VzdG9yIGFuY190b2RvCiAgICBnbG9iYWwgaGlnaGxpZ2h0X3JlbGF0ZWQgcmhpZ2hsaWdodHMKCiAgICBjYXRjaCB7dW5zZXQgZGVzY2VuZGVudH0KICAgIHNldCBkZXNjX3RvZG8gW2xpc3QgJGFdCiAgICBjYXRjaCB7dW5zZXQgYW5jZXN0b3J9CiAgICBzZXQgYW5jX3RvZG8gW2xpc3QgJGFdCiAgICBpZiB7JGhpZ2hsaWdodF9yZWxhdGVkIG5lICJOb25lIn0gewoJcmhpZ2hsaWdodF9ub25lCglhZnRlciBpZGxlIGRyYXd2aXNpYmxlCiAgICB9Cn0KCnByb2MgcmhpZ2hsaWdodF9ub25lIHt9IHsKICAgIGdsb2JhbCByaGlnaGxpZ2h0cwoKICAgIGNhdGNoIHt1bnNldCByaGlnaGxpZ2h0c30KICAgIHVuYm9sZGVuCn0KCnByb2MgaXNfZGVzY2VuZGVudCB7YX0gewogICAgZ2xvYmFsIGN1cnZpZXcgY2hpbGRyZW4gY29tbWl0cm93IGRlc2NlbmRlbnQgZGVzY190b2RvCgogICAgc2V0IHYgJGN1cnZpZXcKICAgIHNldCBsYSAkY29tbWl0cm93KCR2LCRhKQogICAgc2V0IHRvZG8gJGRlc2NfdG9kbwogICAgc2V0IGxlZnRvdmVyIHt9CiAgICBzZXQgZG9uZSAwCiAgICBmb3Ige3NldCBpIDB9IHskaSA8IFtsbGVuZ3RoICR0b2RvXX0ge2luY3IgaX0gewoJc2V0IGRvIFtsaW5kZXggJHRvZG8gJGldCglpZiB7JGNvbW1pdHJvdygkdiwkZG8pIDwgJGxhfSB7CgkgICAgbGFwcGVuZCBsZWZ0b3ZlciAkZG8KCSAgICBjb250aW51ZQoJfQoJZm9yZWFjaCBuayAkY2hpbGRyZW4oJHYsJGRvKSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgZGVzY2VuZGVudCgkbmspXX0gewoJCXNldCBkZXNjZW5kZW50KCRuaykgMQoJCWxhcHBlbmQgdG9kbyAkbmsKCQlpZiB7JG5rIGVxICRhfSB7CgkJICAgIHNldCBkb25lIDEKCQl9CgkgICAgfQoJfQoJaWYgeyRkb25lfSB7CgkgICAgc2V0IGRlc2NfdG9kbyBbY29uY2F0ICRsZWZ0b3ZlciBbbHJhbmdlICR0b2RvIFtleHByIHskaSsxfV0gZW5kXV0KCSAgICByZXR1cm4KCX0KICAgIH0KICAgIHNldCBkZXNjZW5kZW50KCRhKSAwCiAgICBzZXQgZGVzY190b2RvICRsZWZ0b3Zlcgp9Cgpwcm9jIGlzX2FuY2VzdG9yIHthfSB7CiAgICBnbG9iYWwgY3VydmlldyBwYXJlbnRsaXN0IGNvbW1pdHJvdyBhbmNlc3RvciBhbmNfdG9kbwoKICAgIHNldCB2ICRjdXJ2aWV3CiAgICBzZXQgbGEgJGNvbW1pdHJvdygkdiwkYSkKICAgIHNldCB0b2RvICRhbmNfdG9kbwogICAgc2V0IGxlZnRvdmVyIHt9CiAgICBzZXQgZG9uZSAwCiAgICBmb3Ige3NldCBpIDB9IHskaSA8IFtsbGVuZ3RoICR0b2RvXX0ge2luY3IgaX0gewoJc2V0IGRvIFtsaW5kZXggJHRvZG8gJGldCglpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRyb3coJHYsJGRvKV0gfHwgJGNvbW1pdHJvdygkdiwkZG8pID4gJGxhfSB7CgkgICAgbGFwcGVuZCBsZWZ0b3ZlciAkZG8KCSAgICBjb250aW51ZQoJfQoJZm9yZWFjaCBucCBbbGluZGV4ICRwYXJlbnRsaXN0ICRjb21taXRyb3coJHYsJGRvKV0gewoJICAgIGlmIHshW2luZm8gZXhpc3RzIGFuY2VzdG9yKCRucCldfSB7CgkJc2V0IGFuY2VzdG9yKCRucCkgMQoJCWxhcHBlbmQgdG9kbyAkbnAKCQlpZiB7JG5wIGVxICRhfSB7CgkJICAgIHNldCBkb25lIDEKCQl9CgkgICAgfQoJfQoJaWYgeyRkb25lfSB7CgkgICAgc2V0IGFuY190b2RvIFtjb25jYXQgJGxlZnRvdmVyIFtscmFuZ2UgJHRvZG8gW2V4cHIgeyRpKzF9XSBlbmRdXQoJICAgIHJldHVybgoJfQogICAgfQogICAgc2V0IGFuY2VzdG9yKCRhKSAwCiAgICBzZXQgYW5jX3RvZG8gJGxlZnRvdmVyCn0KCnByb2MgYXNrcmVsaGlnaGxpZ2h0IHtyb3cgaWR9IHsKICAgIGdsb2JhbCBkZXNjZW5kZW50IGhpZ2hsaWdodF9yZWxhdGVkIGlkZHJhd24gbWFpbmZvbnQgcmhpZ2hsaWdodHMKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUgYW5jZXN0b3IKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KICAgIHNldCBpc2JvbGQgMAogICAgaWYgeyRoaWdobGlnaHRfcmVsYXRlZCBlcSAiRGVzY2VuZGVudCIgfHwKCSRoaWdobGlnaHRfcmVsYXRlZCBlcSAiTm90IGRlc2NlbmRlbnQifSB7CglpZiB7IVtpbmZvIGV4aXN0cyBkZXNjZW5kZW50KCRpZCldfSB7CgkgICAgaXNfZGVzY2VuZGVudCAkaWQKCX0KCWlmIHskZGVzY2VuZGVudCgkaWQpID09ICgkaGlnaGxpZ2h0X3JlbGF0ZWQgZXEgIkRlc2NlbmRlbnQiKX0gewoJICAgIHNldCBpc2JvbGQgMQoJfQogICAgfSBlbHNlaWYgeyRoaWdobGlnaHRfcmVsYXRlZCBlcSAiQW5jZXN0b3IiIHx8CgkgICAgICAkaGlnaGxpZ2h0X3JlbGF0ZWQgZXEgIk5vdCBhbmNlc3RvciJ9IHsKCWlmIHshW2luZm8gZXhpc3RzIGFuY2VzdG9yKCRpZCldfSB7CgkgICAgaXNfYW5jZXN0b3IgJGlkCgl9CglpZiB7JGFuY2VzdG9yKCRpZCkgPT0gKCRoaWdobGlnaHRfcmVsYXRlZCBlcSAiQW5jZXN0b3IiKX0gewoJICAgIHNldCBpc2JvbGQgMQoJfQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGRyYXduKCRpZCldfSB7CglpZiB7JGlzYm9sZCAmJiAhW2lzaGlnaGxpZ2h0ZWQgJHJvd119IHsKCSAgICBib2xkZW4gJHJvdyBbY29uY2F0ICRtYWluZm9udCBib2xkXQoJfQogICAgfQogICAgc2V0IHJoaWdobGlnaHRzKCRyb3cpICRpc2JvbGQKfQoKcHJvYyBuZXh0X2hsY29udCB7fSB7CiAgICBnbG9iYWwgZmhsX3JvdyBmaGxfZGlybiBkaXNwbGF5b3JkZXIgbnVtY29tbWl0cwogICAgZ2xvYmFsIHZoaWdobGlnaHRzIGZoaWdobGlnaHRzIG5oaWdobGlnaHRzIHJoaWdobGlnaHRzCiAgICBnbG9iYWwgaGx2aWV3IGZpbGVoaWdobGlnaHQgZmluZHN0cmluZyBoaWdobGlnaHRfcmVsYXRlZAoKICAgIGlmIHshW2luZm8gZXhpc3RzIGZobF9kaXJuXSB8fCAkZmhsX2Rpcm4gPT0gMH0gcmV0dXJuCiAgICBzZXQgcm93ICRmaGxfcm93CiAgICB3aGlsZSB7MX0gewoJaWYgeyRyb3cgPCAwIHx8ICRyb3cgPj0gJG51bWNvbW1pdHN9IHsKCSAgICBiZWxsCgkgICAgc2V0IGZobF9kaXJuIDAKCSAgICByZXR1cm4KCX0KCXNldCBpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHJvd10KCWlmIHtbaW5mbyBleGlzdHMgaGx2aWV3XX0gewoJICAgIGlmIHshW2luZm8gZXhpc3RzIHZoaWdobGlnaHRzKCRyb3cpXX0gewoJCWFza3ZoaWdobGlnaHQgJHJvdyAkaWQKCSAgICB9CgkgICAgaWYgeyR2aGlnaGxpZ2h0cygkcm93KSA+IDB9IGJyZWFrCgl9CglpZiB7JGZpbmRzdHJpbmcgbmUge319IHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyBuaGlnaGxpZ2h0cygkcm93KV19IHsKCQlhc2tmaW5kaGlnaGxpZ2h0ICRyb3cgJGlkCgkgICAgfQoJICAgIGlmIHskbmhpZ2hsaWdodHMoJHJvdykgPiAwfSBicmVhawoJfQoJaWYgeyRoaWdobGlnaHRfcmVsYXRlZCBuZSAiTm9uZSJ9IHsKCSAgICBpZiB7IVtpbmZvIGV4aXN0cyByaGlnaGxpZ2h0cygkcm93KV19IHsKCQlhc2tyZWxoaWdobGlnaHQgJHJvdyAkaWQKCSAgICB9CgkgICAgaWYgeyRyaGlnaGxpZ2h0cygkcm93KSA+IDB9IGJyZWFrCgl9CglpZiB7W2luZm8gZXhpc3RzIGZpbGVoaWdobGlnaHRdfSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgZmhpZ2hsaWdodHMoJHJvdyldfSB7CgkJIyBhc2sgZm9yIGEgZmV3IG1vcmUgd2hpbGUgd2UncmUgYXQgaXQuLi4KCQlzZXQgciAkcm93CgkJZm9yIHtzZXQgbiAwfSB7JG4gPCAxMDB9IHtpbmNyIG59IHsKCQkgICAgaWYgeyFbaW5mbyBleGlzdHMgZmhpZ2hsaWdodHMoJHIpXX0gewoJCQlhc2tmaWxlaGlnaGxpZ2h0ICRyIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcl0KCQkgICAgfQoJCSAgICBpbmNyIHIgJGZobF9kaXJuCgkJICAgIGlmIHskciA8IDAgfHwgJHIgPj0gJG51bWNvbW1pdHN9IGJyZWFrCgkJfQoJCWZsdXNoaGlnaGxpZ2h0cwoJICAgIH0KCSAgICBpZiB7JGZoaWdobGlnaHRzKCRyb3cpIDwgMH0gewoJCXNldCBmaGxfcm93ICRyb3cKCQlyZXR1cm4KCSAgICB9CgkgICAgaWYgeyRmaGlnaGxpZ2h0cygkcm93KSA+IDB9IGJyZWFrCgl9CglpbmNyIHJvdyAkZmhsX2Rpcm4KICAgIH0KICAgIHNldCBmaGxfZGlybiAwCiAgICBzZWxlY3RsaW5lICRyb3cgMQp9Cgpwcm9jIG5leHRfaGlnaGxpZ2h0IHtkaXJufSB7CiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lIGZobF9yb3cgZmhsX2Rpcm4KICAgIGdsb2JhbCBobHZpZXcgZmlsZWhpZ2hsaWdodCBmaW5kc3RyaW5nIGhpZ2hsaWdodF9yZWxhdGVkCgogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBpZiB7IShbaW5mbyBleGlzdHMgaGx2aWV3XSB8fCAkZmluZHN0cmluZyBuZSB7fSB8fAoJICAkaGlnaGxpZ2h0X3JlbGF0ZWQgbmUgIk5vbmUiIHx8IFtpbmZvIGV4aXN0cyBmaWxlaGlnaGxpZ2h0XSl9IHJldHVybgogICAgc2V0IGZobF9yb3cgW2V4cHIgeyRzZWxlY3RlZGxpbmUgKyAkZGlybn1dCiAgICBzZXQgZmhsX2Rpcm4gJGRpcm4KICAgIG5leHRfaGxjb250Cn0KCnByb2MgY2FuY2VsX25leHRfaGlnaGxpZ2h0IHt9IHsKICAgIGdsb2JhbCBmaGxfZGlybgoKICAgIHNldCBmaGxfZGlybiAwCn0KCiMgR3JhcGggbGF5b3V0IGZ1bmN0aW9ucwoKcHJvYyBzaG9ydGlkcyB7aWRzfSB7CiAgICBzZXQgcmVzIHt9CiAgICBmb3JlYWNoIGlkICRpZHMgewoJaWYge1tsbGVuZ3RoICRpZF0gPiAxfSB7CgkgICAgbGFwcGVuZCByZXMgW3Nob3J0aWRzICRpZF0KCX0gZWxzZWlmIHtbcmVnZXhwIHteWzAtOWEtZl17NDB9JH0gJGlkXX0gewoJICAgIGxhcHBlbmQgcmVzIFtzdHJpbmcgcmFuZ2UgJGlkIDAgN10KCX0gZWxzZSB7CgkgICAgbGFwcGVuZCByZXMgJGlkCgl9CiAgICB9CiAgICByZXR1cm4gJHJlcwp9Cgpwcm9jIGluY3JhbmdlIHtsIHggb30gewogICAgc2V0IG4gW2xsZW5ndGggJGxdCiAgICB3aGlsZSB7JHggPCAkbn0gewoJc2V0IGUgW2xpbmRleCAkbCAkeF0KCWlmIHskZSBuZSB7fX0gewoJICAgIGxzZXQgbCAkeCBbZXhwciB7JGUgKyAkb31dCgl9CglpbmNyIHgKICAgIH0KICAgIHJldHVybiAkbAp9Cgpwcm9jIG50aW1lcyB7biBvfSB7CiAgICBzZXQgcmV0IHt9CiAgICBmb3Ige30geyRuID4gMH0ge2luY3IgbiAtMX0gewoJbGFwcGVuZCByZXQgJG8KICAgIH0KICAgIHJldHVybiAkcmV0Cn0KCnByb2MgdXNlZGlucmFuZ2Uge2lkIGwxIGwyfSB7CiAgICBnbG9iYWwgY2hpbGRyZW4gY29tbWl0cm93IGNoaWxkbGlzdCBjdXJ2aWV3CgogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGlkKV19IHsKCXNldCByICRjb21taXRyb3coJGN1cnZpZXcsJGlkKQoJaWYgeyRsMSA8PSAkciAmJiAkciA8PSAkbDJ9IHsKCSAgICByZXR1cm4gW2V4cHIgeyRyIC0gJGwxICsgMX1dCgl9CglzZXQga2lkcyBbbGluZGV4ICRjaGlsZGxpc3QgJHJdCiAgICB9IGVsc2UgewoJc2V0IGtpZHMgJGNoaWxkcmVuKCRjdXJ2aWV3LCRpZCkKICAgIH0KICAgIGZvcmVhY2ggYyAka2lkcyB7CglzZXQgciAkY29tbWl0cm93KCRjdXJ2aWV3LCRjKQoJaWYgeyRsMSA8PSAkciAmJiAkciA8PSAkbDJ9IHsKCSAgICByZXR1cm4gW2V4cHIgeyRyIC0gJGwxICsgMX1dCgl9CiAgICB9CiAgICByZXR1cm4gMAp9Cgpwcm9jIHNhbml0eSB7cm93IHtmdWxsIDB9fSB7CiAgICBnbG9iYWwgcm93aWRsaXN0IHJvd29mZnNldHMKCiAgICBzZXQgY29sIC0xCiAgICBzZXQgaWRzIFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XQogICAgZm9yZWFjaCBpZCAkaWRzIHsKCWluY3IgY29sCglpZiB7JGlkIGVxIHt9fSBjb250aW51ZQoJaWYgeyRjb2wgPCBbbGxlbmd0aCAkaWRzXSAtIDEgJiYKCSAgICBbbHNlYXJjaCAtZXhhY3QgLXN0YXJ0IFtleHByIHskY29sKzF9XSAkaWRzICRpZF0gPj0gMH0gewoJICAgIHB1dHMgIm9vcHM6IFtzaG9ydGlkcyAkaWRdIHJlcGVhdGVkIGluIHJvdyAkcm93IGNvbCAkY29sOiB7W3Nob3J0aWRzIFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XV19IgoJfQoJc2V0IG8gW2xpbmRleCAkcm93b2Zmc2V0cyAkcm93ICRjb2xdCglzZXQgeSAkcm93CglzZXQgeCAkY29sCgl3aGlsZSB7JG8gbmUge319IHsKCSAgICBpbmNyIHkgLTEKCSAgICBpbmNyIHggJG8KCSAgICBpZiB7W2xpbmRleCAkcm93aWRsaXN0ICR5ICR4XSAhPSAkaWR9IHsKCQlwdXRzICJvb3BzOiByb3dvZmZzZXRzIHdyb25nIGF0IHJvdyBbZXhwciB7JHkrMX1dIGNvbCBbZXhwciB7JHgtJG99XSIKCQlwdXRzICIgIGlkPVtzaG9ydGlkcyAkaWRdIGNoZWNrIHN0YXJ0ZWQgYXQgcm93ICRyb3ciCgkJZm9yIHtzZXQgaSAkcm93fSB7JGkgPj0gJHl9IHtpbmNyIGkgLTF9IHsKCQkgICAgcHV0cyAiICByb3cgJGkgaWRzPXtbc2hvcnRpZHMgW2xpbmRleCAkcm93aWRsaXN0ICRpXV19IG9mZnM9e1tsaW5kZXggJHJvd29mZnNldHMgJGldfSIKCQl9CgkJYnJlYWsKCSAgICB9CgkgICAgaWYgeyEkZnVsbH0gYnJlYWsKCSAgICBzZXQgbyBbbGluZGV4ICRyb3dvZmZzZXRzICR5ICR4XQoJfQogICAgfQp9Cgpwcm9jIG1ha2V1cGFycm93IHtvaWQgeCB5IHp9IHsKICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cyB1cGFycm93bGVuIGlkcm93cmFuZ2VzCgogICAgZm9yIHtzZXQgaSAxfSB7JGkgPCAkdXBhcnJvd2xlbiAmJiAkeSA+IDF9IHtpbmNyIGl9IHsKCWluY3IgeSAtMQoJaW5jciB4ICR6CglzZXQgb2ZmMCBbbGluZGV4ICRyb3dvZmZzZXRzICR5XQoJZm9yIHtzZXQgeDAgJHh9IHsxfSB7aW5jciB4MH0gewoJICAgIGlmIHskeDAgPj0gW2xsZW5ndGggJG9mZjBdfSB7CgkJc2V0IHgwIFtsbGVuZ3RoIFtsaW5kZXggJHJvd29mZnNldHMgW2V4cHIgeyR5LTF9XV1dCgkJYnJlYWsKCSAgICB9CgkgICAgc2V0IHogW2xpbmRleCAkb2ZmMCAkeDBdCgkgICAgaWYgeyR6IG5lIHt9fSB7CgkJaW5jciB4MCAkegoJCWJyZWFrCgkgICAgfQoJfQoJc2V0IHogW2V4cHIgeyR4MCAtICR4fV0KCWxzZXQgcm93aWRsaXN0ICR5IFtsaW5zZXJ0IFtsaW5kZXggJHJvd2lkbGlzdCAkeV0gJHggJG9pZF0KCWxzZXQgcm93b2Zmc2V0cyAkeSBbbGluc2VydCBbbGluZGV4ICRyb3dvZmZzZXRzICR5XSAkeCAkel0KICAgIH0KICAgIHNldCB0bXAgW2xyZXBsYWNlIFtsaW5kZXggJHJvd29mZnNldHMgJHldICR4ICR4IHt9XQogICAgbHNldCByb3dvZmZzZXRzICR5IFtpbmNyYW5nZSAkdG1wIFtleHByIHskeCsxfV0gLTFdCiAgICBsYXBwZW5kIGlkcm93cmFuZ2VzKCRvaWQpICR5Cn0KCnByb2MgaW5pdGxheW91dCB7fSB7CiAgICBnbG9iYWwgcm93aWRsaXN0IHJvd29mZnNldHMgZGlzcGxheW9yZGVyIGNvbW1pdGxpc3RlZAogICAgZ2xvYmFsIHJvd2xhaWRvdXQgcm93b3B0aW0KICAgIGdsb2JhbCBpZGlubGlzdCByb3djaGsgcm93cmFuZ2VsaXN0IGlkcm93cmFuZ2VzCiAgICBnbG9iYWwgbnVtY29tbWl0cyBjYW52eG1heCBjYW52CiAgICBnbG9iYWwgbmV4dGNvbG9yCiAgICBnbG9iYWwgcGFyZW50bGlzdCBjaGlsZGxpc3QgY2hpbGRyZW4KICAgIGdsb2JhbCBjb2xvcm1hcCByb3d0ZXh0eAogICAgZ2xvYmFsIGxpbmVzZWdlbmRzCgogICAgc2V0IG51bWNvbW1pdHMgMAogICAgc2V0IGRpc3BsYXlvcmRlciB7fQogICAgc2V0IGNvbW1pdGxpc3RlZCB7fQogICAgc2V0IHBhcmVudGxpc3Qge30KICAgIHNldCBjaGlsZGxpc3Qge30KICAgIHNldCByb3dyYW5nZWxpc3Qge30KICAgIHNldCBuZXh0Y29sb3IgMAogICAgc2V0IHJvd2lkbGlzdCB7e319CiAgICBzZXQgcm93b2Zmc2V0cyB7e319CiAgICBjYXRjaCB7dW5zZXQgaWRpbmxpc3R9CiAgICBjYXRjaCB7dW5zZXQgcm93Y2hrfQogICAgc2V0IHJvd2xhaWRvdXQgMAogICAgc2V0IHJvd29wdGltIDAKICAgIHNldCBjYW52eG1heCBbJGNhbnYgY2dldCAtd2lkdGhdCiAgICBjYXRjaCB7dW5zZXQgY29sb3JtYXB9CiAgICBjYXRjaCB7dW5zZXQgcm93dGV4dHh9CiAgICBjYXRjaCB7dW5zZXQgaWRyb3dyYW5nZXN9CiAgICBzZXQgbGluZXNlZ2VuZHMge30KfQoKcHJvYyBzZXRjYW52c2Nyb2xsIHt9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIG51bWNvbW1pdHMgbGluZXNwYyBjYW52eG1heCBjYW52eTAKCiAgICBzZXQgeW1heCBbZXhwciB7JGNhbnZ5MCArICgkbnVtY29tbWl0cyAtIDAuNSkgKiAkbGluZXNwYyArIDJ9XQogICAgJGNhbnYgY29uZiAtc2Nyb2xscmVnaW9uIFtsaXN0IDAgMCAkY2FudnhtYXggJHltYXhdCiAgICAkY2FudjIgY29uZiAtc2Nyb2xscmVnaW9uIFtsaXN0IDAgMCAwICR5bWF4XQogICAgJGNhbnYzIGNvbmYgLXNjcm9sbHJlZ2lvbiBbbGlzdCAwIDAgMCAkeW1heF0KfQoKcHJvYyB2aXNpYmxlcm93cyB7fSB7CiAgICBnbG9iYWwgY2FudiBudW1jb21taXRzIGxpbmVzcGMKCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggZXEge30gfHwgJHltYXggPT0gMH0gcmV0dXJuCiAgICBzZXQgZiBbJGNhbnYgeXZpZXddCiAgICBzZXQgeTAgW2V4cHIge2ludChbbGluZGV4ICRmIDBdICogJHltYXgpfV0KICAgIHNldCByMCBbZXhwciB7aW50KCgkeTAgLSAzKSAvICRsaW5lc3BjKSAtIDF9XQogICAgaWYgeyRyMCA8IDB9IHsKCXNldCByMCAwCiAgICB9CiAgICBzZXQgeTEgW2V4cHIge2ludChbbGluZGV4ICRmIDFdICogJHltYXgpfV0KICAgIHNldCByMSBbZXhwciB7aW50KCgkeTEgLSAzKSAvICRsaW5lc3BjKSArIDF9XQogICAgaWYgeyRyMSA+PSAkbnVtY29tbWl0c30gewoJc2V0IHIxIFtleHByIHskbnVtY29tbWl0cyAtIDF9XQogICAgfQogICAgcmV0dXJuIFtsaXN0ICRyMCAkcjFdCn0KCnByb2MgbGF5b3V0bW9yZSB7fSB7CiAgICBnbG9iYWwgcm93bGFpZG91dCByb3dvcHRpbSBjb21taXRpZHggbnVtY29tbWl0cyBvcHRpbV9kZWxheQogICAgZ2xvYmFsIHVwYXJyb3dsZW4gY3VydmlldwoKICAgIHNldCByb3cgJHJvd2xhaWRvdXQKICAgIHNldCByb3dsYWlkb3V0IFtsYXlvdXRyb3dzICRyb3cgJGNvbW1pdGlkeCgkY3VydmlldykgMF0KICAgIHNldCBvcm93IFtleHByIHskcm93bGFpZG91dCAtICR1cGFycm93bGVuIC0gMX1dCiAgICBpZiB7JG9yb3cgPiAkcm93b3B0aW19IHsKCW9wdGltaXplX3Jvd3MgJHJvd29wdGltIDAgJG9yb3cKCXNldCByb3dvcHRpbSAkb3JvdwogICAgfQogICAgc2V0IGNhbnNob3cgW2V4cHIgeyRyb3dvcHRpbSAtICRvcHRpbV9kZWxheX1dCiAgICBpZiB7JGNhbnNob3cgPiAkbnVtY29tbWl0c30gewoJc2hvd3N0dWZmICRjYW5zaG93CiAgICB9Cn0KCnByb2Mgc2hvd3N0dWZmIHtjYW5zaG93fSB7CiAgICBnbG9iYWwgbnVtY29tbWl0cyBjb21taXRyb3cgcGVuZGluZ19zZWxlY3Qgc2VsZWN0ZWRsaW5lCiAgICBnbG9iYWwgbGluZXNlZ2VuZHMgaWRyb3dyYW5nZXMgaWRyYW5nZWRyYXduIGN1cnZpZXcKCiAgICBpZiB7JG51bWNvbW1pdHMgPT0gMH0gewoJZ2xvYmFsIHBoYXNlCglzZXQgcGhhc2UgImluY3JkcmF3IgoJYWxsY2FudnMgZGVsZXRlIGFsbAogICAgfQogICAgc2V0IHJvdyAkbnVtY29tbWl0cwogICAgc2V0IG51bWNvbW1pdHMgJGNhbnNob3cKICAgIHNldGNhbnZzY3JvbGwKICAgIHNldCByb3dzIFt2aXNpYmxlcm93c10KICAgIHNldCByMCBbbGluZGV4ICRyb3dzIDBdCiAgICBzZXQgcjEgW2xpbmRleCAkcm93cyAxXQogICAgc2V0IHNlbHJvdyAtMQogICAgZm9yIHtzZXQgciAkcm93fSB7JHIgPCAkY2Fuc2hvd30ge2luY3Igcn0gewoJZm9yZWFjaCBpZCBbbGluZGV4ICRsaW5lc2VnZW5kcyBbZXhwciB7JHIrMX1dXSB7CgkgICAgc2V0IGkgLTEKCSAgICBmb3JlYWNoIHtzIGV9IFtyb3dyYW5nZXMgJGlkXSB7CgkJaW5jciBpCgkJaWYgeyRlIG5lIHt9ICYmICRlIDwgJG51bWNvbW1pdHMgJiYgJHMgPD0gJHIxICYmICRlID49ICRyMAoJCSAgICAmJiAhW2luZm8gZXhpc3RzIGlkcmFuZ2VkcmF3bigkaWQsJGkpXX0gewoJCSAgICBkcmF3bGluZXNlZyAkaWQgJGkKCQkgICAgc2V0IGlkcmFuZ2VkcmF3bigkaWQsJGkpIDEKCQl9CgkgICAgfQoJfQogICAgfQogICAgaWYgeyRjYW5zaG93ID4gJHIxfSB7CglzZXQgY2Fuc2hvdyAkcjEKICAgIH0KICAgIHdoaWxlIHskcm93IDwgJGNhbnNob3d9IHsKCWRyYXdjbWl0cm93ICRyb3cKCWluY3Igcm93CiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHBlbmRpbmdfc2VsZWN0XSAmJgoJW2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkcGVuZGluZ19zZWxlY3QpXSAmJgoJJGNvbW1pdHJvdygkY3VydmlldywkcGVuZGluZ19zZWxlY3QpIDwgJG51bWNvbW1pdHN9IHsKCXNlbGVjdGxpbmUgJGNvbW1pdHJvdygkY3VydmlldywkcGVuZGluZ19zZWxlY3QpIDEKICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV0gJiYgIVtpbmZvIGV4aXN0cyBwZW5kaW5nX3NlbGVjdF19IHsKCXNlbGVjdGxpbmUgMCAxCiAgICB9Cn0KCnByb2MgbGF5b3V0cm93cyB7cm93IGVuZHJvdyBsYXN0fSB7CiAgICBnbG9iYWwgcm93aWRsaXN0IHJvd29mZnNldHMgZGlzcGxheW9yZGVyCiAgICBnbG9iYWwgdXBhcnJvd2xlbiBkb3duYXJyb3dsZW4gbWF4d2lkdGggbWluZ2FwbGVuCiAgICBnbG9iYWwgY2hpbGRsaXN0IHBhcmVudGxpc3QKICAgIGdsb2JhbCBpZHJvd3JhbmdlcyBsaW5lc2VnZW5kcwogICAgZ2xvYmFsIGNvbW1pdGlkeCBjdXJ2aWV3CiAgICBnbG9iYWwgaWRpbmxpc3Qgcm93Y2hrIHJvd3JhbmdlbGlzdAoKICAgIHNldCBpZGxpc3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddCiAgICBzZXQgb2ZmcyBbbGluZGV4ICRyb3dvZmZzZXRzICRyb3ddCiAgICB3aGlsZSB7JHJvdyA8ICRlbmRyb3d9IHsKCXNldCBpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHJvd10KCXNldCBvbGRvbGRzIHt9CglzZXQgbmV3b2xkcyB7fQoJZm9yZWFjaCBwIFtsaW5kZXggJHBhcmVudGxpc3QgJHJvd10gewoJICAgIGlmIHshW2luZm8gZXhpc3RzIGlkaW5saXN0KCRwKV19IHsKCQlsYXBwZW5kIG5ld29sZHMgJHAKCSAgICB9IGVsc2VpZiB7ISRpZGlubGlzdCgkcCl9IHsKCQlsYXBwZW5kIG9sZG9sZHMgJHAKCSAgICB9Cgl9CglzZXQgbHNlIHt9CglzZXQgbmV2IFtleHByIHtbbGxlbmd0aCAkaWRsaXN0XSArIFtsbGVuZ3RoICRuZXdvbGRzXQoJCSAgICAgICArIFtsbGVuZ3RoICRvbGRvbGRzXSAtICRtYXh3aWR0aCArIDF9XQoJaWYgeyRuZXYgPiAwfSB7CgkgICAgaWYgeyEkbGFzdCAmJgoJCSRyb3cgKyAkdXBhcnJvd2xlbiArICRtaW5nYXBsZW4gPj0gJGNvbW1pdGlkeCgkY3Vydmlldyl9IGJyZWFrCgkgICAgZm9yIHtzZXQgeCBbbGxlbmd0aCAkaWRsaXN0XX0ge1tpbmNyIHggLTFdID49IDB9IHt9IHsKCQlzZXQgaSBbbGluZGV4ICRpZGxpc3QgJHhdCgkJaWYgeyFbaW5mbyBleGlzdHMgcm93Y2hrKCRpKV0gfHwgJHJvdyA+PSAkcm93Y2hrKCRpKX0gewoJCSAgICBzZXQgciBbdXNlZGlucmFuZ2UgJGkgW2V4cHIgeyRyb3cgLSAkZG93bmFycm93bGVufV0gXAoJCQkgICAgICAgW2V4cHIgeyRyb3cgKyAkdXBhcnJvd2xlbiArICRtaW5nYXBsZW59XV0KCQkgICAgaWYgeyRyID09IDB9IHsKCQkJc2V0IGlkbGlzdCBbbHJlcGxhY2UgJGlkbGlzdCAkeCAkeF0KCQkJc2V0IG9mZnMgW2xyZXBsYWNlICRvZmZzICR4ICR4XQoJCQlzZXQgb2ZmcyBbaW5jcmFuZ2UgJG9mZnMgJHggMV0KCQkJc2V0IGlkaW5saXN0KCRpKSAwCgkJCXNldCBybTEgW2V4cHIgeyRyb3cgLSAxfV0KCQkJbGFwcGVuZCBsc2UgJGkKCQkJbGFwcGVuZCBpZHJvd3JhbmdlcygkaSkgJHJtMQoJCQlpZiB7W2luY3IgbmV2IC0xXSA8PSAwfSBicmVhawoJCQljb250aW51ZQoJCSAgICB9CgkJICAgIHNldCByb3djaGsoJGlkKSBbZXhwciB7JHJvdyArICRyfV0KCQl9CgkgICAgfQoJICAgIGxzZXQgcm93aWRsaXN0ICRyb3cgJGlkbGlzdAoJICAgIGxzZXQgcm93b2Zmc2V0cyAkcm93ICRvZmZzCgl9CglsYXBwZW5kIGxpbmVzZWdlbmRzICRsc2UKCXNldCBjb2wgW2xzZWFyY2ggLWV4YWN0ICRpZGxpc3QgJGlkXQoJaWYgeyRjb2wgPCAwfSB7CgkgICAgc2V0IGNvbCBbbGxlbmd0aCAkaWRsaXN0XQoJICAgIGxhcHBlbmQgaWRsaXN0ICRpZAoJICAgIGxzZXQgcm93aWRsaXN0ICRyb3cgJGlkbGlzdAoJICAgIHNldCB6IHt9CgkgICAgaWYge1tsaW5kZXggJGNoaWxkbGlzdCAkcm93XSBuZSB7fX0gewoJCXNldCB6IFtleHByIHtbbGxlbmd0aCBbbGluZGV4ICRyb3dpZGxpc3QgW2V4cHIgeyRyb3ctMX1dXV0gLSAkY29sfV0KCQl1bnNldCBpZGlubGlzdCgkaWQpCgkgICAgfQoJICAgIGxhcHBlbmQgb2ZmcyAkegoJICAgIGxzZXQgcm93b2Zmc2V0cyAkcm93ICRvZmZzCgkgICAgaWYgeyR6IG5lIHt9fSB7CgkJbWFrZXVwYXJyb3cgJGlkICRjb2wgJHJvdyAkegoJICAgIH0KCX0gZWxzZSB7CgkgICAgdW5zZXQgaWRpbmxpc3QoJGlkKQoJfQoJc2V0IHJhbmdlcyB7fQoJaWYge1tpbmZvIGV4aXN0cyBpZHJvd3JhbmdlcygkaWQpXX0gewoJICAgIHNldCByYW5nZXMgJGlkcm93cmFuZ2VzKCRpZCkKCSAgICBsYXBwZW5kIHJhbmdlcyAkcm93CgkgICAgdW5zZXQgaWRyb3dyYW5nZXMoJGlkKQoJfQoJbGFwcGVuZCByb3dyYW5nZWxpc3QgJHJhbmdlcwoJaW5jciByb3cKCXNldCBvZmZzIFtudGltZXMgW2xsZW5ndGggJGlkbGlzdF0gMF0KCXNldCBsIFtsbGVuZ3RoICRuZXdvbGRzXQoJc2V0IGlkbGlzdCBbZXZhbCBscmVwbGFjZSBcJGlkbGlzdCAkY29sICRjb2wgJG5ld29sZHNdCglzZXQgbyAwCglpZiB7JGwgIT0gMX0gewoJICAgIHNldCBvZmZzIFtscmFuZ2UgJG9mZnMgMCBbZXhwciB7JGNvbCAtIDF9XV0KCSAgICBmb3JlYWNoIHggJG5ld29sZHMgewoJCWxhcHBlbmQgb2ZmcyB7fQoJCWluY3IgbyAtMQoJICAgIH0KCSAgICBpbmNyIG8KCSAgICBzZXQgdG1wIFtleHByIHtbbGxlbmd0aCAkaWRsaXN0XSAtIFtsbGVuZ3RoICRvZmZzXX1dCgkgICAgaWYgeyR0bXAgPiAwfSB7CgkJc2V0IG9mZnMgW2NvbmNhdCAkb2ZmcyBbbnRpbWVzICR0bXAgJG9dXQoJICAgIH0KCX0gZWxzZSB7CgkgICAgbHNldCBvZmZzICRjb2wge30KCX0KCWZvcmVhY2ggaSAkbmV3b2xkcyB7CgkgICAgc2V0IGlkaW5saXN0KCRpKSAxCgkgICAgc2V0IGlkcm93cmFuZ2VzKCRpKSAkcm93Cgl9CglpbmNyIGNvbCAkbAoJZm9yZWFjaCBvaWQgJG9sZG9sZHMgewoJICAgIHNldCBpZGlubGlzdCgkb2lkKSAxCgkgICAgc2V0IGlkbGlzdCBbbGluc2VydCAkaWRsaXN0ICRjb2wgJG9pZF0KCSAgICBzZXQgb2ZmcyBbbGluc2VydCAkb2ZmcyAkY29sICRvXQoJICAgIG1ha2V1cGFycm93ICRvaWQgJGNvbCAkcm93ICRvCgkgICAgaW5jciBjb2wKCX0KCWxhcHBlbmQgcm93aWRsaXN0ICRpZGxpc3QKCWxhcHBlbmQgcm93b2Zmc2V0cyAkb2ZmcwogICAgfQogICAgcmV0dXJuICRyb3cKfQoKcHJvYyBhZGRleHRyYWlkIHtpZCByb3d9IHsKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIgY29tbWl0cm93IGNvbW1pdGluZm8KICAgIGdsb2JhbCBjb21taXRpZHggY29tbWl0bGlzdGVkCiAgICBnbG9iYWwgcGFyZW50bGlzdCBjaGlsZGxpc3QgY2hpbGRyZW4gY3VydmlldwoKICAgIGluY3IgY29tbWl0aWR4KCRjdXJ2aWV3KQogICAgbGFwcGVuZCBkaXNwbGF5b3JkZXIgJGlkCiAgICBsYXBwZW5kIGNvbW1pdGxpc3RlZCAwCiAgICBsYXBwZW5kIHBhcmVudGxpc3Qge30KICAgIHNldCBjb21taXRyb3coJGN1cnZpZXcsJGlkKSAkcm93CiAgICByZWFkY29tbWl0ICRpZAogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXX0gewoJc2V0IGNvbW1pdGluZm8oJGlkKSB7Ik5vIGNvbW1pdCBpbmZvcm1hdGlvbiBhdmFpbGFibGUifQogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgY2hpbGRyZW4oJGN1cnZpZXcsJGlkKV19IHsKCXNldCBjaGlsZHJlbigkY3VydmlldywkaWQpIHt9CiAgICB9CiAgICBsYXBwZW5kIGNoaWxkbGlzdCAkY2hpbGRyZW4oJGN1cnZpZXcsJGlkKQp9Cgpwcm9jIGxheW91dHRhaWwge30gewogICAgZ2xvYmFsIHJvd2lkbGlzdCByb3dvZmZzZXRzIGlkaW5saXN0IGNvbW1pdGlkeCBjdXJ2aWV3CiAgICBnbG9iYWwgaWRyb3dyYW5nZXMgcm93cmFuZ2VsaXN0CgogICAgc2V0IHJvdyAkY29tbWl0aWR4KCRjdXJ2aWV3KQogICAgc2V0IGlkbGlzdCBbbGluZGV4ICRyb3dpZGxpc3QgJHJvd10KICAgIHdoaWxlIHskaWRsaXN0IG5lIHt9fSB7CglzZXQgY29sIFtleHByIHtbbGxlbmd0aCAkaWRsaXN0XSAtIDF9XQoJc2V0IGlkIFtsaW5kZXggJGlkbGlzdCAkY29sXQoJYWRkZXh0cmFpZCAkaWQgJHJvdwoJdW5zZXQgaWRpbmxpc3QoJGlkKQoJbGFwcGVuZCBpZHJvd3JhbmdlcygkaWQpICRyb3cKCWxhcHBlbmQgcm93cmFuZ2VsaXN0ICRpZHJvd3JhbmdlcygkaWQpCgl1bnNldCBpZHJvd3JhbmdlcygkaWQpCglpbmNyIHJvdwoJc2V0IG9mZnMgW250aW1lcyAkY29sIDBdCglzZXQgaWRsaXN0IFtscmVwbGFjZSAkaWRsaXN0ICRjb2wgJGNvbF0KCWxhcHBlbmQgcm93aWRsaXN0ICRpZGxpc3QKCWxhcHBlbmQgcm93b2Zmc2V0cyAkb2ZmcwogICAgfQoKICAgIGZvcmVhY2ggaWQgW2FycmF5IG5hbWVzIGlkaW5saXN0XSB7CglhZGRleHRyYWlkICRpZCAkcm93Cglsc2V0IHJvd2lkbGlzdCAkcm93IFtsaXN0ICRpZF0KCWxzZXQgcm93b2Zmc2V0cyAkcm93IDAKCW1ha2V1cGFycm93ICRpZCAwICRyb3cgMAoJbGFwcGVuZCBpZHJvd3JhbmdlcygkaWQpICRyb3cKCWxhcHBlbmQgcm93cmFuZ2VsaXN0ICRpZHJvd3JhbmdlcygkaWQpCgl1bnNldCBpZHJvd3JhbmdlcygkaWQpCglpbmNyIHJvdwoJbGFwcGVuZCByb3dpZGxpc3Qge30KCWxhcHBlbmQgcm93b2Zmc2V0cyB7fQogICAgfQp9Cgpwcm9jIGluc2VydF9wYWQge3JvdyBjb2wgbnBhZH0gewogICAgZ2xvYmFsIHJvd2lkbGlzdCByb3dvZmZzZXRzCgogICAgc2V0IHBhZCBbbnRpbWVzICRucGFkIHt9XQogICAgbHNldCByb3dpZGxpc3QgJHJvdyBbZXZhbCBsaW5zZXJ0IFtsaXN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XV0gJGNvbCAkcGFkXQogICAgc2V0IHRtcCBbZXZhbCBsaW5zZXJ0IFtsaXN0IFtsaW5kZXggJHJvd29mZnNldHMgJHJvd11dICRjb2wgJHBhZF0KICAgIGxzZXQgcm93b2Zmc2V0cyAkcm93IFtpbmNyYW5nZSAkdG1wIFtleHByIHskY29sICsgJG5wYWR9XSBbZXhwciB7LSRucGFkfV1dCn0KCnByb2Mgb3B0aW1pemVfcm93cyB7cm93IGNvbCBlbmRyb3d9IHsKICAgIGdsb2JhbCByb3dpZGxpc3Qgcm93b2Zmc2V0cyBpZHJvd3JhbmdlcyBkaXNwbGF5b3JkZXIKCiAgICBmb3Ige30geyRyb3cgPCAkZW5kcm93fSB7aW5jciByb3d9IHsKCXNldCBpZGxpc3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddCglzZXQgb2ZmcyBbbGluZGV4ICRyb3dvZmZzZXRzICRyb3ddCglzZXQgaGFzcGFkIDAKCWZvciB7fSB7JGNvbCA8IFtsbGVuZ3RoICRvZmZzXX0ge2luY3IgY29sfSB7CgkgICAgaWYge1tsaW5kZXggJGlkbGlzdCAkY29sXSBlcSB7fX0gewoJCXNldCBoYXNwYWQgMQoJCWNvbnRpbnVlCgkgICAgfQoJICAgIHNldCB6IFtsaW5kZXggJG9mZnMgJGNvbF0KCSAgICBpZiB7JHogZXEge319IGNvbnRpbnVlCgkgICAgc2V0IGlzYXJyb3cgMAoJICAgIHNldCB4MCBbZXhwciB7JGNvbCArICR6fV0KCSAgICBzZXQgeTAgW2V4cHIgeyRyb3cgLSAxfV0KCSAgICBzZXQgejAgW2xpbmRleCAkcm93b2Zmc2V0cyAkeTAgJHgwXQoJICAgIGlmIHskejAgZXEge319IHsKCQlzZXQgaWQgW2xpbmRleCAkaWRsaXN0ICRjb2xdCgkJc2V0IHJhbmdlcyBbcm93cmFuZ2VzICRpZF0KCQlpZiB7JHJhbmdlcyBuZSB7fSAmJiAkeTAgPiBbbGluZGV4ICRyYW5nZXMgMF19IHsKCQkgICAgc2V0IGlzYXJyb3cgMQoJCX0KCSAgICB9CgkgICAgaWYgeyR6IDwgLTEgfHwgKCR6IDwgMCAmJiAkaXNhcnJvdyl9IHsKCQlzZXQgbnBhZCBbZXhwciB7LTEgLSAkeiArICRpc2Fycm93fV0KCQlzZXQgb2ZmcyBbaW5jcmFuZ2UgJG9mZnMgJGNvbCAkbnBhZF0KCQlpbnNlcnRfcGFkICR5MCAkeDAgJG5wYWQKCQlpZiB7JHkwID4gMH0gewoJCSAgICBvcHRpbWl6ZV9yb3dzICR5MCAkeDAgJHJvdwoJCX0KCQlzZXQgeiBbbGluZGV4ICRvZmZzICRjb2xdCgkJc2V0IHgwIFtleHByIHskY29sICsgJHp9XQoJCXNldCB6MCBbbGluZGV4ICRyb3dvZmZzZXRzICR5MCAkeDBdCgkgICAgfSBlbHNlaWYgeyR6ID4gMSB8fCAoJHogPiAwICYmICRpc2Fycm93KX0gewoJCXNldCBucGFkIFtleHByIHskeiAtIDEgKyAkaXNhcnJvd31dCgkJc2V0IHkxIFtleHByIHskcm93ICsgMX1dCgkJc2V0IG9mZnMyIFtsaW5kZXggJHJvd29mZnNldHMgJHkxXQoJCXNldCB4MSAtMQoJCWZvcmVhY2ggeiAkb2ZmczIgewoJCSAgICBpbmNyIHgxCgkJICAgIGlmIHskeiBlcSB7fSB8fCAkeDEgKyAkeiA8ICRjb2x9IGNvbnRpbnVlCgkJICAgIGlmIHskeDEgKyAkeiA+ICRjb2x9IHsKCQkJaW5jciBucGFkCgkJICAgIH0KCQkgICAgbHNldCByb3dvZmZzZXRzICR5MSBbaW5jcmFuZ2UgJG9mZnMyICR4MSAkbnBhZF0KCQkgICAgYnJlYWsKCQl9CgkJc2V0IHBhZCBbbnRpbWVzICRucGFkIHt9XQoJCXNldCBpZGxpc3QgW2V2YWwgbGluc2VydCBcJGlkbGlzdCAkY29sICRwYWRdCgkJc2V0IHRtcCBbZXZhbCBsaW5zZXJ0IFwkb2ZmcyAkY29sICRwYWRdCgkJaW5jciBjb2wgJG5wYWQKCQlzZXQgb2ZmcyBbaW5jcmFuZ2UgJHRtcCAkY29sIFtleHByIHstJG5wYWR9XV0KCQlzZXQgeiBbbGluZGV4ICRvZmZzICRjb2xdCgkJc2V0IGhhc3BhZCAxCgkgICAgfQoJICAgIGlmIHskejAgZXEge30gJiYgISRpc2Fycm93fSB7CgkJIyB0aGlzIGxpbmUgbGlua3MgdG8gaXRzIGZpcnN0IGNoaWxkIG9uIHJvdyAkcm93LTIKCQlzZXQgcm0yIFtleHByIHskcm93IC0gMn1dCgkJc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcm0yXQoJCXNldCB4YyBbbHNlYXJjaCAtZXhhY3QgW2xpbmRleCAkcm93aWRsaXN0ICRybTJdICRpZF0KCQlpZiB7JHhjID49IDB9IHsKCQkgICAgc2V0IHowIFtleHByIHskeGMgLSAkeDB9XQoJCX0KCSAgICB9CgkgICAgaWYgeyR6MCBuZSB7fSAmJiAkeiA8IDAgJiYgJHowID4gMH0gewoJCWluc2VydF9wYWQgJHkwICR4MCAxCgkJc2V0IG9mZnMgW2luY3JhbmdlICRvZmZzICRjb2wgMV0KCQlvcHRpbWl6ZV9yb3dzICR5MCBbZXhwciB7JHgwICsgMX1dICRyb3cKCSAgICB9Cgl9CglpZiB7ISRoYXNwYWR9IHsKCSAgICBzZXQgbyB7fQoJICAgIGZvciB7c2V0IGNvbCBbbGxlbmd0aCAkaWRsaXN0XX0ge1tpbmNyIGNvbCAtMV0gPj0gMH0ge30gewoJCXNldCBvIFtsaW5kZXggJG9mZnMgJGNvbF0KCQlpZiB7JG8gZXEge319IHsKCQkgICAgIyBjaGVjayBpZiB0aGlzIGlzIHRoZSBsaW5rIHRvIHRoZSBmaXJzdCBjaGlsZAoJCSAgICBzZXQgaWQgW2xpbmRleCAkaWRsaXN0ICRjb2xdCgkJICAgIHNldCByYW5nZXMgW3Jvd3JhbmdlcyAkaWRdCgkJICAgIGlmIHskcmFuZ2VzIG5lIHt9ICYmICRyb3cgPT0gW2xpbmRleCAkcmFuZ2VzIDBdfSB7CgkJCSMgaXQgaXMsIHdvcmsgb3V0IG9mZnNldCB0byBjaGlsZAoJCQlzZXQgeTAgW2V4cHIgeyRyb3cgLSAxfV0KCQkJc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkeTBdCgkJCXNldCB4MCBbbHNlYXJjaCAtZXhhY3QgW2xpbmRleCAkcm93aWRsaXN0ICR5MF0gJGlkXQoJCQlpZiB7JHgwID49IDB9IHsKCQkJICAgIHNldCBvIFtleHByIHskeDAgLSAkY29sfV0KCQkJfQoJCSAgICB9CgkJfQoJCWlmIHskbyBlcSB7fSB8fCAkbyA8PSAwfSBicmVhawoJICAgIH0KCSAgICBpZiB7JG8gbmUge30gJiYgW2luY3IgY29sXSA8IFtsbGVuZ3RoICRpZGxpc3RdfSB7CgkJc2V0IHkxIFtleHByIHskcm93ICsgMX1dCgkJc2V0IG9mZnMyIFtsaW5kZXggJHJvd29mZnNldHMgJHkxXQoJCXNldCB4MSAtMQoJCWZvcmVhY2ggeiAkb2ZmczIgewoJCSAgICBpbmNyIHgxCgkJICAgIGlmIHskeiBlcSB7fSB8fCAkeDEgKyAkeiA8ICRjb2x9IGNvbnRpbnVlCgkJICAgIGxzZXQgcm93b2Zmc2V0cyAkeTEgW2luY3JhbmdlICRvZmZzMiAkeDEgMV0KCQkgICAgYnJlYWsKCQl9CgkJc2V0IGlkbGlzdCBbbGluc2VydCAkaWRsaXN0ICRjb2wge31dCgkJc2V0IHRtcCBbbGluc2VydCAkb2ZmcyAkY29sIHt9XQoJCWluY3IgY29sCgkJc2V0IG9mZnMgW2luY3JhbmdlICR0bXAgJGNvbCAtMV0KCSAgICB9Cgl9Cglsc2V0IHJvd2lkbGlzdCAkcm93ICRpZGxpc3QKCWxzZXQgcm93b2Zmc2V0cyAkcm93ICRvZmZzCglzZXQgY29sIDAKICAgIH0KfQoKcHJvYyB4YyB7cm93IGNvbH0gewogICAgZ2xvYmFsIGNhbnZ4MCBsaW5lc3BjCiAgICByZXR1cm4gW2V4cHIgeyRjYW52eDAgKyAkY29sICogJGxpbmVzcGN9XQp9Cgpwcm9jIHljIHtyb3d9IHsKICAgIGdsb2JhbCBjYW52eTAgbGluZXNwYwogICAgcmV0dXJuIFtleHByIHskY2FudnkwICsgJHJvdyAqICRsaW5lc3BjfV0KfQoKcHJvYyBsaW5ld2lkdGgge2lkfSB7CiAgICBnbG9iYWwgdGhpY2tlcmxpbmUgbHRoaWNrbmVzcwoKICAgIHNldCB3aWQgJGx0aGlja25lc3MKICAgIGlmIHtbaW5mbyBleGlzdHMgdGhpY2tlcmxpbmVdICYmICRpZCBlcSAkdGhpY2tlcmxpbmV9IHsKCXNldCB3aWQgW2V4cHIgezIgKiAkbHRoaWNrbmVzc31dCiAgICB9CiAgICByZXR1cm4gJHdpZAp9Cgpwcm9jIHJvd3JhbmdlcyB7aWR9IHsKICAgIGdsb2JhbCBwaGFzZSBpZHJvd3JhbmdlcyBjb21taXRyb3cgcm93bGFpZG91dCByb3dyYW5nZWxpc3QgY3VydmlldwoKICAgIHNldCByYW5nZXMge30KICAgIGlmIHskcGhhc2UgZXEge30gfHwKCShbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCldCgkgJiYgJGNvbW1pdHJvdygkY3VydmlldywkaWQpIDwgJHJvd2xhaWRvdXQpfSB7CglzZXQgcmFuZ2VzIFtsaW5kZXggJHJvd3JhbmdlbGlzdCAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCldCiAgICB9IGVsc2VpZiB7W2luZm8gZXhpc3RzIGlkcm93cmFuZ2VzKCRpZCldfSB7CglzZXQgcmFuZ2VzICRpZHJvd3JhbmdlcygkaWQpCiAgICB9CiAgICByZXR1cm4gJHJhbmdlcwp9Cgpwcm9jIGRyYXdsaW5lc2VnIHtpZCBpfSB7CiAgICBnbG9iYWwgcm93b2Zmc2V0cyByb3dpZGxpc3QKICAgIGdsb2JhbCBkaXNwbGF5b3JkZXIKICAgIGdsb2JhbCBjYW52IGNvbG9ybWFwIGxpbmVzcGMKICAgIGdsb2JhbCBudW1jb21taXRzIGNvbW1pdHJvdyBjdXJ2aWV3CgogICAgc2V0IHJhbmdlcyBbcm93cmFuZ2VzICRpZF0KICAgIHNldCBkb3duYXJyb3cgMQogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGlkKV0KCSYmICRjb21taXRyb3coJGN1cnZpZXcsJGlkKSA8ICRudW1jb21taXRzfSB7CglzZXQgZG93bmFycm93IFtleHByIHskaSA8IFtsbGVuZ3RoICRyYW5nZXNdIC8gMiAtIDF9XQogICAgfSBlbHNlIHsKCXNldCBkb3duYXJyb3cgMQogICAgfQogICAgc2V0IHN0YXJ0cm93IFtsaW5kZXggJHJhbmdlcyBbZXhwciB7MiAqICRpfV1dCiAgICBzZXQgcm93IFtsaW5kZXggJHJhbmdlcyBbZXhwciB7MiAqICRpICsgMX1dXQogICAgaWYgeyRzdGFydHJvdyA9PSAkcm93fSByZXR1cm4KICAgIGFzc2lnbmNvbG9yICRpZAogICAgc2V0IGNvb3JkcyB7fQogICAgc2V0IGNvbCBbbHNlYXJjaCAtZXhhY3QgW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddICRpZF0KICAgIGlmIHskY29sIDwgMH0gewoJcHV0cyAib29wczogZHJhd2xpbmU6IGlkICRpZCBub3Qgb24gcm93ICRyb3ciCglyZXR1cm4KICAgIH0KICAgIHNldCBsYXN0byB7fQogICAgc2V0IG5zIDAKICAgIHdoaWxlIHsxfSB7CglzZXQgbyBbbGluZGV4ICRyb3dvZmZzZXRzICRyb3cgJGNvbF0KCWlmIHskbyBlcSB7fX0gYnJlYWsKCWlmIHskbyBuZSAkbGFzdG99IHsKCSAgICAjIGNoYW5naW5nIGRpcmVjdGlvbgoJICAgIHNldCB4IFt4YyAkcm93ICRjb2xdCgkgICAgc2V0IHkgW3ljICRyb3ddCgkgICAgbGFwcGVuZCBjb29yZHMgJHggJHkKCSAgICBzZXQgbGFzdG8gJG8KCX0KCWluY3IgY29sICRvCglpbmNyIHJvdyAtMQogICAgfQogICAgc2V0IHggW3hjICRyb3cgJGNvbF0KICAgIHNldCB5IFt5YyAkcm93XQogICAgbGFwcGVuZCBjb29yZHMgJHggJHkKICAgIGlmIHskaSA9PSAwfSB7CgkjIGRyYXcgdGhlIGxpbmsgdG8gdGhlIGZpcnN0IGNoaWxkIGFzIHBhcnQgb2YgdGhpcyBsaW5lCglpbmNyIHJvdyAtMQoJc2V0IGNoaWxkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkcm93XQoJc2V0IGNjb2wgW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XSAkY2hpbGRdCglpZiB7JGNjb2wgPj0gMH0gewoJICAgIHNldCB4IFt4YyAkcm93ICRjY29sXQoJICAgIHNldCB5IFt5YyAkcm93XQoJICAgIGlmIHskY2NvbCA8ICRjb2wgLSAxfSB7CgkJbGFwcGVuZCBjb29yZHMgW3hjICRyb3cgW2V4cHIgeyRjb2wgLSAxfV1dIFt5YyAkcm93XQoJICAgIH0gZWxzZWlmIHskY2NvbCA+ICRjb2wgKyAxfSB7CgkJbGFwcGVuZCBjb29yZHMgW3hjICRyb3cgW2V4cHIgeyRjb2wgKyAxfV1dIFt5YyAkcm93XQoJICAgIH0KCSAgICBsYXBwZW5kIGNvb3JkcyAkeCAkeQoJfQogICAgfQogICAgaWYge1tsbGVuZ3RoICRjb29yZHNdIDwgNH0gcmV0dXJuCiAgICBpZiB7JGRvd25hcnJvd30gewoJIyBUaGlzIGxpbmUgaGFzIGFuIGFycm93IGF0IHRoZSBsb3dlciBlbmQ6IGNoZWNrIGlmIHRoZSBhcnJvdyBpcwoJIyBvbiBhIGRpYWdvbmFsIHNlZ21lbnQsIGFuZCBpZiBzbywgd29yayBhcm91bmQgdGhlIFRrIDguNAoJIyByZWZ1c2FsIHRvIGRyYXcgYXJyb3dzIG9uIGRpYWdvbmFsIGxpbmVzLgoJc2V0IHgwIFtsaW5kZXggJGNvb3JkcyAwXQoJc2V0IHgxIFtsaW5kZXggJGNvb3JkcyAyXQoJaWYgeyR4MCAhPSAkeDF9IHsKCSAgICBzZXQgeTAgW2xpbmRleCAkY29vcmRzIDFdCgkgICAgc2V0IHkxIFtsaW5kZXggJGNvb3JkcyAzXQoJICAgIGlmIHskeTAgLSAkeTEgPD0gMiAqICRsaW5lc3BjICYmICR4MSA9PSBbbGluZGV4ICRjb29yZHMgNF19IHsKCQkjIHdlIGhhdmUgYSBuZWFyYnkgdmVydGljYWwgc2VnbWVudCwganVzdCB0cmltIG9mZiB0aGUgZGlhZyBiaXQKCQlzZXQgY29vcmRzIFtscmFuZ2UgJGNvb3JkcyAyIGVuZF0KCSAgICB9IGVsc2UgewoJCXNldCBzbG9wZSBbZXhwciB7KCR4MCAtICR4MSkgLyAoJHkwIC0gJHkxKX1dCgkJc2V0IHhpIFtleHByIHskeDAgLSAkc2xvcGUgKiAkbGluZXNwYyAvIDJ9XQoJCXNldCB5aSBbZXhwciB7JHkwIC0gJGxpbmVzcGMgLyAyfV0KCQlzZXQgY29vcmRzIFtscmVwbGFjZSAkY29vcmRzIDAgMSAkeGkgJHkwICR4aSAkeWldCgkgICAgfQoJfQogICAgfQogICAgc2V0IGFycm93IFtleHByIHsyICogKCRpID4gMCkgKyAkZG93bmFycm93fV0KICAgIHNldCBhcnJvdyBbbGluZGV4IHtub25lIGZpcnN0IGxhc3QgYm90aH0gJGFycm93XQogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSBsaW5lICRjb29yZHMgLXdpZHRoIFtsaW5ld2lkdGggJGlkXSBcCgkgICAgICAgLWZpbGwgJGNvbG9ybWFwKCRpZCkgLXRhZ3MgbGluZXMuJGlkIC1hcnJvdyAkYXJyb3ddCiAgICAkY2FudiBsb3dlciAkdAogICAgYmluZGxpbmUgJHQgJGlkCn0KCnByb2MgZHJhd3BhcmVudGxpbmtzIHtpZCByb3cgY29sIG9sZHN9IHsKICAgIGdsb2JhbCByb3dpZGxpc3QgY2FudiBjb2xvcm1hcAoKICAgIHNldCByb3cyIFtleHByIHskcm93ICsgMX1dCiAgICBzZXQgeCBbeGMgJHJvdyAkY29sXQogICAgc2V0IHkgW3ljICRyb3ddCiAgICBzZXQgeTIgW3ljICRyb3cyXQogICAgc2V0IGlkcyBbbGluZGV4ICRyb3dpZGxpc3QgJHJvdzJdCiAgICAjIHJteCA9IHJpZ2h0LW1vc3QgWCBjb29yZCB1c2VkCiAgICBzZXQgcm14IDAKICAgIGZvcmVhY2ggcCAkb2xkcyB7CglzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGlkcyAkcF0KCWlmIHskaSA8IDB9IHsKCSAgICBwdXRzICJvb3BzLCBwYXJlbnQgJHAgb2YgJGlkIG5vdCBpbiBsaXN0IgoJICAgIGNvbnRpbnVlCgl9CglzZXQgeDIgW3hjICRyb3cyICRpXQoJaWYgeyR4MiA+ICRybXh9IHsKCSAgICBzZXQgcm14ICR4MgoJfQoJc2V0IHJhbmdlcyBbcm93cmFuZ2VzICRwXQoJaWYgeyRyYW5nZXMgbmUge30gJiYgJHJvdzIgPT0gW2xpbmRleCAkcmFuZ2VzIDBdCgkgICAgJiYgJHJvdzIgPCBbbGluZGV4ICRyYW5nZXMgMV19IHsKCSAgICAjIGRyYXdsaW5lc2VnIHdpbGwgZG8gdGhpcyBvbmUgZm9yIHVzCgkgICAgY29udGludWUKCX0KCWFzc2lnbmNvbG9yICRwCgkjIHNob3VsZCBoYW5kbGUgZHVwbGljYXRlZCBwYXJlbnRzIGhlcmUuLi4KCXNldCBjb29yZHMgW2xpc3QgJHggJHldCglpZiB7JGkgPCAkY29sIC0gMX0gewoJICAgIGxhcHBlbmQgY29vcmRzIFt4YyAkcm93IFtleHByIHskaSArIDF9XV0gJHkKCX0gZWxzZWlmIHskaSA+ICRjb2wgKyAxfSB7CgkgICAgbGFwcGVuZCBjb29yZHMgW3hjICRyb3cgW2V4cHIgeyRpIC0gMX1dXSAkeQoJfQoJbGFwcGVuZCBjb29yZHMgJHgyICR5MgoJc2V0IHQgWyRjYW52IGNyZWF0ZSBsaW5lICRjb29yZHMgLXdpZHRoIFtsaW5ld2lkdGggJHBdIFwKCQkgICAtZmlsbCAkY29sb3JtYXAoJHApIC10YWdzIGxpbmVzLiRwXQoJJGNhbnYgbG93ZXIgJHQKCWJpbmRsaW5lICR0ICRwCiAgICB9CiAgICByZXR1cm4gJHJteAp9Cgpwcm9jIGRyYXdsaW5lcyB7aWR9IHsKICAgIGdsb2JhbCBjb2xvcm1hcCBjYW52CiAgICBnbG9iYWwgaWRyYW5nZWRyYXduCiAgICBnbG9iYWwgY2hpbGRyZW4gaWRkcmF3biBjb21taXRyb3cgcm93aWRsaXN0IGN1cnZpZXcKCiAgICAkY2FudiBkZWxldGUgbGluZXMuJGlkCiAgICBzZXQgbnIgW2V4cHIge1tsbGVuZ3RoIFtyb3dyYW5nZXMgJGlkXV0gLyAyfV0KICAgIGZvciB7c2V0IGkgMH0geyRpIDwgJG5yfSB7aW5jciBpfSB7CglpZiB7W2luZm8gZXhpc3RzIGlkcmFuZ2VkcmF3bigkaWQsJGkpXX0gewoJICAgIGRyYXdsaW5lc2VnICRpZCAkaQoJfQogICAgfQogICAgZm9yZWFjaCBjaGlsZCAkY2hpbGRyZW4oJGN1cnZpZXcsJGlkKSB7CglpZiB7W2luZm8gZXhpc3RzIGlkZHJhd24oJGNoaWxkKV19IHsKCSAgICBzZXQgcm93ICRjb21taXRyb3coJGN1cnZpZXcsJGNoaWxkKQoJICAgIHNldCBjb2wgW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XSAkY2hpbGRdCgkgICAgaWYgeyRjb2wgPj0gMH0gewoJCWRyYXdwYXJlbnRsaW5rcyAkY2hpbGQgJHJvdyAkY29sIFtsaXN0ICRpZF0KCSAgICB9Cgl9CiAgICB9Cn0KCnByb2MgZHJhd2NtaXR0ZXh0IHtpZCByb3cgY29sIHJteH0gewogICAgZ2xvYmFsIGxpbmVzcGMgY2FudiBjYW52MiBjYW52MyBjYW52eTAgZmdjb2xvcgogICAgZ2xvYmFsIGNvbW1pdGxpc3RlZCBjb21taXRpbmZvIHJvd2lkbGlzdAogICAgZ2xvYmFsIHJvd3RleHR4IGlkcG9zIGlkdGFncyBpZGhlYWRzIGlkb3RoZXJyZWZzCiAgICBnbG9iYWwgbGluZWh0YWcgbGluZW50YWcgbGluZWR0YWcKICAgIGdsb2JhbCBtYWluZm9udCBjYW52eG1heCBib2xkcm93cyBib2xkbmFtZXJvd3MgZmdjb2xvcgoKICAgIHNldCBvZmlsbCBbZXhwciB7W2xpbmRleCAkY29tbWl0bGlzdGVkICRyb3ddPyAiYmx1ZSI6ICJ3aGl0ZSJ9XQogICAgc2V0IHggW3hjICRyb3cgJGNvbF0KICAgIHNldCB5IFt5YyAkcm93XQogICAgc2V0IG9yYWQgW2V4cHIgeyRsaW5lc3BjIC8gM31dCiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIG92YWwgW2V4cHIgeyR4IC0gJG9yYWR9XSBbZXhwciB7JHkgLSAkb3JhZH1dIFwKCSAgICAgICBbZXhwciB7JHggKyAkb3JhZCAtIDF9XSBbZXhwciB7JHkgKyAkb3JhZCAtIDF9XSBcCgkgICAgICAgLWZpbGwgJG9maWxsIC1vdXRsaW5lICRmZ2NvbG9yIC13aWR0aCAxIC10YWdzIGNpcmNsZV0KICAgICRjYW52IHJhaXNlICR0CiAgICAkY2FudiBiaW5kICR0IDwxPiB7c2VsY2FudmxpbmUge30gJXggJXl9CiAgICBzZXQgeHQgW3hjICRyb3cgW2xsZW5ndGggW2xpbmRleCAkcm93aWRsaXN0ICRyb3ddXV0KICAgIGlmIHskeHQgPCAkcm14fSB7CglzZXQgeHQgJHJteAogICAgfQogICAgc2V0IHJvd3RleHR4KCRyb3cpICR4dAogICAgc2V0IGlkcG9zKCRpZCkgW2xpc3QgJHggJHh0ICR5XQogICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV0gfHwgW2luZm8gZXhpc3RzIGlkaGVhZHMoJGlkKV0KCXx8IFtpbmZvIGV4aXN0cyBpZG90aGVycmVmcygkaWQpXX0gewoJc2V0IHh0IFtkcmF3dGFncyAkaWQgJHggJHh0ICR5XQogICAgfQogICAgc2V0IGhlYWRsaW5lIFtsaW5kZXggJGNvbW1pdGluZm8oJGlkKSAwXQogICAgc2V0IG5hbWUgW2xpbmRleCAkY29tbWl0aW5mbygkaWQpIDFdCiAgICBzZXQgZGF0ZSBbbGluZGV4ICRjb21taXRpbmZvKCRpZCkgMl0KICAgIHNldCBkYXRlIFtmb3JtYXRkYXRlICRkYXRlXQogICAgc2V0IGZvbnQgJG1haW5mb250CiAgICBzZXQgbmZvbnQgJG1haW5mb250CiAgICBzZXQgaXNib2xkIFtpc2hpZ2hsaWdodGVkICRyb3ddCiAgICBpZiB7JGlzYm9sZCA+IDB9IHsKCWxhcHBlbmQgYm9sZHJvd3MgJHJvdwoJbGFwcGVuZCBmb250IGJvbGQKCWlmIHskaXNib2xkID4gMX0gewoJICAgIGxhcHBlbmQgYm9sZG5hbWVyb3dzICRyb3cKCSAgICBsYXBwZW5kIG5mb250IGJvbGQKCX0KICAgIH0KICAgIHNldCBsaW5laHRhZygkcm93KSBbJGNhbnYgY3JlYXRlIHRleHQgJHh0ICR5IC1hbmNob3IgdyAtZmlsbCAkZmdjb2xvciBcCgkJCSAgICAtdGV4dCAkaGVhZGxpbmUgLWZvbnQgJGZvbnQgLXRhZ3MgdGV4dF0KICAgICRjYW52IGJpbmQgJGxpbmVodGFnKCRyb3cpIDxCdXR0b24tMz4gInJvd21lbnUgJVggJVkgJGlkIgogICAgc2V0IGxpbmVudGFnKCRyb3cpIFskY2FudjIgY3JlYXRlIHRleHQgMyAkeSAtYW5jaG9yIHcgLWZpbGwgJGZnY29sb3IgXAoJCQkgICAgLXRleHQgJG5hbWUgLWZvbnQgJG5mb250IC10YWdzIHRleHRdCiAgICBzZXQgbGluZWR0YWcoJHJvdykgWyRjYW52MyBjcmVhdGUgdGV4dCAzICR5IC1hbmNob3IgdyAtZmlsbCAkZmdjb2xvciBcCgkJCSAgICAtdGV4dCAkZGF0ZSAtZm9udCAkbWFpbmZvbnQgLXRhZ3MgdGV4dF0KICAgIHNldCB4ciBbZXhwciB7JHh0ICsgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgJGhlYWRsaW5lXX1dCiAgICBpZiB7JHhyID4gJGNhbnZ4bWF4fSB7CglzZXQgY2FudnhtYXggJHhyCglzZXRjYW52c2Nyb2xsCiAgICB9Cn0KCnByb2MgZHJhd2NtaXRyb3cge3Jvd30gewogICAgZ2xvYmFsIGRpc3BsYXlvcmRlciByb3dpZGxpc3QKICAgIGdsb2JhbCBpZHJhbmdlZHJhd24gaWRkcmF3bgogICAgZ2xvYmFsIGNvbW1pdGluZm8gcGFyZW50bGlzdCBudW1jb21taXRzCiAgICBnbG9iYWwgZmlsZWhpZ2hsaWdodCBmaGlnaGxpZ2h0cyBmaW5kc3RyaW5nIG5oaWdobGlnaHRzCiAgICBnbG9iYWwgaGx2aWV3IHZoaWdobGlnaHRzCiAgICBnbG9iYWwgaGlnaGxpZ2h0X3JlbGF0ZWQgcmhpZ2hsaWdodHMKCiAgICBpZiB7JHJvdyA+PSAkbnVtY29tbWl0c30gcmV0dXJuCiAgICBmb3JlYWNoIGlkIFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XSB7CglpZiB7JGlkIGVxIHt9fSBjb250aW51ZQoJc2V0IGkgLTEKCWZvcmVhY2gge3MgZX0gW3Jvd3JhbmdlcyAkaWRdIHsKCSAgICBpbmNyIGkKCSAgICBpZiB7JHJvdyA8ICRzfSBjb250aW51ZQoJICAgIGlmIHskZSBlcSB7fX0gYnJlYWsKCSAgICBpZiB7JHJvdyA8PSAkZX0gewoJCWlmIHskZSA8ICRudW1jb21taXRzICYmICFbaW5mbyBleGlzdHMgaWRyYW5nZWRyYXduKCRpZCwkaSldfSB7CgkJICAgIGRyYXdsaW5lc2VnICRpZCAkaQoJCSAgICBzZXQgaWRyYW5nZWRyYXduKCRpZCwkaSkgMQoJCX0KCQlicmVhawoJICAgIH0KCX0KICAgIH0KCiAgICBzZXQgaWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyb3ddCiAgICBpZiB7W2luZm8gZXhpc3RzIGhsdmlld10gJiYgIVtpbmZvIGV4aXN0cyB2aGlnaGxpZ2h0cygkcm93KV19IHsKCWFza3ZoaWdobGlnaHQgJHJvdyAkaWQKICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgZmlsZWhpZ2hsaWdodF0gJiYgIVtpbmZvIGV4aXN0cyBmaGlnaGxpZ2h0cygkcm93KV19IHsKCWFza2ZpbGVoaWdobGlnaHQgJHJvdyAkaWQKICAgIH0KICAgIGlmIHskZmluZHN0cmluZyBuZSB7fSAmJiAhW2luZm8gZXhpc3RzIG5oaWdobGlnaHRzKCRyb3cpXX0gewoJYXNrZmluZGhpZ2hsaWdodCAkcm93ICRpZAogICAgfQogICAgaWYgeyRoaWdobGlnaHRfcmVsYXRlZCBuZSAiTm9uZSIgJiYgIVtpbmZvIGV4aXN0cyByaGlnaGxpZ2h0cygkcm93KV19IHsKCWFza3JlbGhpZ2hsaWdodCAkcm93ICRpZAogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGRyYXduKCRpZCldfSByZXR1cm4KICAgIHNldCBjb2wgW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XSAkaWRdCiAgICBpZiB7JGNvbCA8IDB9IHsKCXB1dHMgIm9vcHMsIHJvdyAkcm93IGlkICRpZCBub3QgaW4gbGlzdCIKCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkaWQpXX0gewoJZ2V0Y29tbWl0ICRpZAogICAgfQogICAgYXNzaWduY29sb3IgJGlkCiAgICBzZXQgb2xkcyBbbGluZGV4ICRwYXJlbnRsaXN0ICRyb3ddCiAgICBpZiB7JG9sZHMgbmUge319IHsKCXNldCBybXggW2RyYXdwYXJlbnRsaW5rcyAkaWQgJHJvdyAkY29sICRvbGRzXQogICAgfSBlbHNlIHsKCXNldCBybXggMAogICAgfQogICAgZHJhd2NtaXR0ZXh0ICRpZCAkcm93ICRjb2wgJHJteAogICAgc2V0IGlkZHJhd24oJGlkKSAxCn0KCnByb2MgZHJhd2ZyYWMge2YwIGYxfSB7CiAgICBnbG9iYWwgbnVtY29tbWl0cyBjYW52CiAgICBnbG9iYWwgbGluZXNwYwoKICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIGlmIHskeW1heCBlcSB7fSB8fCAkeW1heCA9PSAwfSByZXR1cm4KICAgIHNldCB5MCBbZXhwciB7aW50KCRmMCAqICR5bWF4KX1dCiAgICBzZXQgcm93IFtleHByIHtpbnQoKCR5MCAtIDMpIC8gJGxpbmVzcGMpIC0gMX1dCiAgICBpZiB7JHJvdyA8IDB9IHsKCXNldCByb3cgMAogICAgfQogICAgc2V0IHkxIFtleHByIHtpbnQoJGYxICogJHltYXgpfV0KICAgIHNldCBlbmRyb3cgW2V4cHIge2ludCgoJHkxIC0gMykgLyAkbGluZXNwYykgKyAxfV0KICAgIGlmIHskZW5kcm93ID49ICRudW1jb21taXRzfSB7CglzZXQgZW5kcm93IFtleHByIHskbnVtY29tbWl0cyAtIDF9XQogICAgfQogICAgZm9yIHt9IHskcm93IDw9ICRlbmRyb3d9IHtpbmNyIHJvd30gewoJZHJhd2NtaXRyb3cgJHJvdwogICAgfQp9Cgpwcm9jIGRyYXd2aXNpYmxlIHt9IHsKICAgIGdsb2JhbCBjYW52CiAgICBldmFsIGRyYXdmcmFjIFskY2FudiB5dmlld10KfQoKcHJvYyBjbGVhcl9kaXNwbGF5IHt9IHsKICAgIGdsb2JhbCBpZGRyYXduIGlkcmFuZ2VkcmF3bgogICAgZ2xvYmFsIHZoaWdobGlnaHRzIGZoaWdobGlnaHRzIG5oaWdobGlnaHRzIHJoaWdobGlnaHRzCgogICAgYWxsY2FudnMgZGVsZXRlIGFsbAogICAgY2F0Y2gge3Vuc2V0IGlkZHJhd259CiAgICBjYXRjaCB7dW5zZXQgaWRyYW5nZWRyYXdufQogICAgY2F0Y2gge3Vuc2V0IHZoaWdobGlnaHRzfQogICAgY2F0Y2gge3Vuc2V0IGZoaWdobGlnaHRzfQogICAgY2F0Y2gge3Vuc2V0IG5oaWdobGlnaHRzfQogICAgY2F0Y2gge3Vuc2V0IHJoaWdobGlnaHRzfQp9Cgpwcm9jIGZpbmRjcm9zc2luZ3Mge2lkfSB7CiAgICBnbG9iYWwgcm93aWRsaXN0IHBhcmVudGxpc3QgbnVtY29tbWl0cyByb3dvZmZzZXRzIGRpc3BsYXlvcmRlcgoKICAgIHNldCBjcm9zcyB7fQogICAgc2V0IGNjcm9zcyB7fQogICAgZm9yZWFjaCB7cyBlfSBbcm93cmFuZ2VzICRpZF0gewoJaWYgeyRlID49ICRudW1jb21taXRzfSB7CgkgICAgc2V0IGUgW2V4cHIgeyRudW1jb21taXRzIC0gMX1dCgl9CglpZiB7JGUgPD0gJHN9IGNvbnRpbnVlCglzZXQgeCBbbHNlYXJjaCAtZXhhY3QgW2xpbmRleCAkcm93aWRsaXN0ICRlXSAkaWRdCglpZiB7JHggPCAwfSB7CgkgICAgcHV0cyAiZmluZGNyb3NzaW5nczogb29wcywgbm8gW3Nob3J0aWRzICRpZF0gaW4gcm93ICRlIgoJICAgIGNvbnRpbnVlCgl9Cglmb3Ige3NldCByb3cgJGV9IHtbaW5jciByb3cgLTFdID49ICRzfSB7fSB7CgkgICAgc2V0IG9sZHMgW2xpbmRleCAkcGFyZW50bGlzdCAkcm93XQoJICAgIHNldCBraWQgW2xpbmRleCAkZGlzcGxheW9yZGVyICRyb3ddCgkgICAgc2V0IGtpZHggW2xzZWFyY2ggLWV4YWN0IFtsaW5kZXggJHJvd2lkbGlzdCAkcm93XSAka2lkXQoJICAgIGlmIHska2lkeCA8IDB9IGNvbnRpbnVlCgkgICAgc2V0IG5leHRyb3cgW2xpbmRleCAkcm93aWRsaXN0IFtleHByIHskcm93ICsgMX1dXQoJICAgIGZvcmVhY2ggcCAkb2xkcyB7CgkJc2V0IHB4IFtsc2VhcmNoIC1leGFjdCAkbmV4dHJvdyAkcF0KCQlpZiB7JHB4IDwgMH0gY29udGludWUKCQlpZiB7KCRraWR4IDwgJHggJiYgJHggPCAkcHgpIHx8ICgkcHggPCAkeCAmJiAkeCA8ICRraWR4KX0gewoJCSAgICBpZiB7W2xzZWFyY2ggLWV4YWN0ICRjY3Jvc3MgJHBdID49IDB9IGNvbnRpbnVlCgkJICAgIGlmIHskeCA9PSAkcHggKyAoJGtpZHggPCAkcHg/IC0xOiAxKX0gewoJCQlsYXBwZW5kIGNjcm9zcyAkcAoJCSAgICB9IGVsc2VpZiB7W2xzZWFyY2ggLWV4YWN0ICRjcm9zcyAkcF0gPCAwfSB7CgkJCWxhcHBlbmQgY3Jvc3MgJHAKCQkgICAgfQoJCX0KCSAgICB9CgkgICAgc2V0IGluYyBbbGluZGV4ICRyb3dvZmZzZXRzICRyb3cgJHhdCgkgICAgaWYgeyRpbmMgZXEge319IGJyZWFrCgkgICAgaW5jciB4ICRpbmMKCX0KICAgIH0KICAgIHJldHVybiBbY29uY2F0ICRjY3Jvc3Mge3t9fSAkY3Jvc3NdCn0KCnByb2MgYXNzaWduY29sb3Ige2lkfSB7CiAgICBnbG9iYWwgY29sb3JtYXAgY29sb3JzIG5leHRjb2xvcgogICAgZ2xvYmFsIGNvbW1pdHJvdyBwYXJlbnRsaXN0IGNoaWxkcmVuIGNoaWxkcmVuIGN1cnZpZXcKCiAgICBpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCRpZCldfSByZXR1cm4KICAgIHNldCBuY29sb3JzIFtsbGVuZ3RoICRjb2xvcnNdCiAgICBpZiB7W2luZm8gZXhpc3RzIGNoaWxkcmVuKCRjdXJ2aWV3LCRpZCldfSB7CglzZXQga2lkcyAkY2hpbGRyZW4oJGN1cnZpZXcsJGlkKQogICAgfSBlbHNlIHsKCXNldCBraWRzIHt9CiAgICB9CiAgICBpZiB7W2xsZW5ndGggJGtpZHNdID09IDF9IHsKCXNldCBjaGlsZCBbbGluZGV4ICRraWRzIDBdCglpZiB7W2luZm8gZXhpc3RzIGNvbG9ybWFwKCRjaGlsZCldCgkgICAgJiYgW2xsZW5ndGggW2xpbmRleCAkcGFyZW50bGlzdCAkY29tbWl0cm93KCRjdXJ2aWV3LCRjaGlsZCldXSA9PSAxfSB7CgkgICAgc2V0IGNvbG9ybWFwKCRpZCkgJGNvbG9ybWFwKCRjaGlsZCkKCSAgICByZXR1cm4KCX0KICAgIH0KICAgIHNldCBiYWRjb2xvcnMge30KICAgIHNldCBvcmlnYmFkIHt9CiAgICBmb3JlYWNoIHggW2ZpbmRjcm9zc2luZ3MgJGlkXSB7CglpZiB7JHggZXEge319IHsKCSAgICAjIGRlbGltaXRlciBiZXR3ZWVuIGNvcm5lciBjcm9zc2luZ3MgYW5kIG90aGVyIGNyb3NzaW5ncwoJICAgIGlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA+PSAkbmNvbG9ycyAtIDF9IGJyZWFrCgkgICAgc2V0IG9yaWdiYWQgJGJhZGNvbG9ycwoJfQoJaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkeCldCgkgICAgJiYgW2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNvbG9ybWFwKCR4KV0gPCAwfSB7CgkgICAgbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCR4KQoJfQogICAgfQogICAgaWYge1tsbGVuZ3RoICRiYWRjb2xvcnNdID49ICRuY29sb3JzfSB7CglzZXQgYmFkY29sb3JzICRvcmlnYmFkCiAgICB9CiAgICBzZXQgb3JpZ2JhZCAkYmFkY29sb3JzCiAgICBpZiB7W2xsZW5ndGggJGJhZGNvbG9yc10gPCAkbmNvbG9ycyAtIDF9IHsKCWZvcmVhY2ggY2hpbGQgJGtpZHMgewoJICAgIGlmIHtbaW5mbyBleGlzdHMgY29sb3JtYXAoJGNoaWxkKV0KCQkmJiBbbHNlYXJjaCAtZXhhY3QgJGJhZGNvbG9ycyAkY29sb3JtYXAoJGNoaWxkKV0gPCAwfSB7CgkJbGFwcGVuZCBiYWRjb2xvcnMgJGNvbG9ybWFwKCRjaGlsZCkKCSAgICB9CgkgICAgZm9yZWFjaCBwIFtsaW5kZXggJHBhcmVudGxpc3QgJGNvbW1pdHJvdygkY3VydmlldywkY2hpbGQpXSB7CgkJaWYge1tpbmZvIGV4aXN0cyBjb2xvcm1hcCgkcCldCgkJICAgICYmIFtsc2VhcmNoIC1leGFjdCAkYmFkY29sb3JzICRjb2xvcm1hcCgkcCldIDwgMH0gewoJCSAgICBsYXBwZW5kIGJhZGNvbG9ycyAkY29sb3JtYXAoJHApCgkJfQoJICAgIH0KCX0KCWlmIHtbbGxlbmd0aCAkYmFkY29sb3JzXSA+PSAkbmNvbG9yc30gewoJICAgIHNldCBiYWRjb2xvcnMgJG9yaWdiYWQKCX0KICAgIH0KICAgIGZvciB7c2V0IGkgMH0geyRpIDw9ICRuY29sb3JzfSB7aW5jciBpfSB7CglzZXQgYyBbbGluZGV4ICRjb2xvcnMgJG5leHRjb2xvcl0KCWlmIHtbaW5jciBuZXh0Y29sb3JdID49ICRuY29sb3JzfSB7CgkgICAgc2V0IG5leHRjb2xvciAwCgl9CglpZiB7W2xzZWFyY2ggLWV4YWN0ICRiYWRjb2xvcnMgJGNdfSBicmVhawogICAgfQogICAgc2V0IGNvbG9ybWFwKCRpZCkgJGMKfQoKcHJvYyBiaW5kbGluZSB7dCBpZH0gewogICAgZ2xvYmFsIGNhbnYKCiAgICAkY2FudiBiaW5kICR0IDxFbnRlcj4gImxpbmVlbnRlciAleCAleSAkaWQiCiAgICAkY2FudiBiaW5kICR0IDxNb3Rpb24+ICJsaW5lbW90aW9uICV4ICV5ICRpZCIKICAgICRjYW52IGJpbmQgJHQgPExlYXZlPiAibGluZWxlYXZlICRpZCIKICAgICRjYW52IGJpbmQgJHQgPEJ1dHRvbi0xPiAibGluZWNsaWNrICV4ICV5ICRpZCAxIgp9Cgpwcm9jIGRyYXd0YWdzIHtpZCB4IHh0IHkxfSB7CiAgICBnbG9iYWwgaWR0YWdzIGlkaGVhZHMgaWRvdGhlcnJlZnMgbWFpbmhlYWQKICAgIGdsb2JhbCBsaW5lc3BjIGx0aGlja25lc3MKICAgIGdsb2JhbCBjYW52IG1haW5mb250IGNvbW1pdHJvdyByb3d0ZXh0eCBjdXJ2aWV3IGZnY29sb3IgYmdjb2xvcgoKICAgIHNldCBtYXJrcyB7fQogICAgc2V0IG50YWdzIDAKICAgIHNldCBuaGVhZHMgMAogICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJGlkKV19IHsKCXNldCBtYXJrcyAkaWR0YWdzKCRpZCkKCXNldCBudGFncyBbbGxlbmd0aCAkbWFya3NdCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkaGVhZHMoJGlkKV19IHsKCXNldCBtYXJrcyBbY29uY2F0ICRtYXJrcyAkaWRoZWFkcygkaWQpXQoJc2V0IG5oZWFkcyBbbGxlbmd0aCAkaWRoZWFkcygkaWQpXQogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyBpZG90aGVycmVmcygkaWQpXX0gewoJc2V0IG1hcmtzIFtjb25jYXQgJG1hcmtzICRpZG90aGVycmVmcygkaWQpXQogICAgfQogICAgaWYgeyRtYXJrcyBlcSB7fX0gewoJcmV0dXJuICR4dAogICAgfQoKICAgIHNldCBkZWx0YSBbZXhwciB7aW50KDAuNSAqICgkbGluZXNwYyAtICRsdGhpY2tuZXNzKSl9XQogICAgc2V0IHl0IFtleHByIHskeTEgLSAwLjUgKiAkbGluZXNwY31dCiAgICBzZXQgeWIgW2V4cHIgeyR5dCArICRsaW5lc3BjIC0gMX1dCiAgICBzZXQgeHZhbHMge30KICAgIHNldCB3dmFscyB7fQogICAgc2V0IGkgLTEKICAgIGZvcmVhY2ggdGFnICRtYXJrcyB7CglpbmNyIGkKCWlmIHskaSA+PSAkbnRhZ3MgJiYgJGkgPCAkbnRhZ3MgKyAkbmhlYWRzICYmICR0YWcgZXEgJG1haW5oZWFkfSB7CgkgICAgc2V0IHdpZCBbZm9udCBtZWFzdXJlIFtjb25jYXQgJG1haW5mb250IGJvbGRdICR0YWddCgl9IGVsc2UgewoJICAgIHNldCB3aWQgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgJHRhZ10KCX0KCWxhcHBlbmQgeHZhbHMgJHh0CglsYXBwZW5kIHd2YWxzICR3aWQKCXNldCB4dCBbZXhwciB7JHh0ICsgJGRlbHRhICsgJHdpZCArICRsdGhpY2tuZXNzICsgJGxpbmVzcGN9XQogICAgfQogICAgc2V0IHQgWyRjYW52IGNyZWF0ZSBsaW5lICR4ICR5MSBbbGluZGV4ICR4dmFscyBlbmRdICR5MSBcCgkgICAgICAgLXdpZHRoICRsdGhpY2tuZXNzIC1maWxsIGJsYWNrIC10YWdzIHRhZy4kaWRdCiAgICAkY2FudiBsb3dlciAkdAogICAgZm9yZWFjaCB0YWcgJG1hcmtzIHggJHh2YWxzIHdpZCAkd3ZhbHMgewoJc2V0IHhsIFtleHByIHskeCArICRkZWx0YX1dCglzZXQgeHIgW2V4cHIgeyR4ICsgJGRlbHRhICsgJHdpZCArICRsdGhpY2tuZXNzfV0KCXNldCBmb250ICRtYWluZm9udAoJaWYge1tpbmNyIG50YWdzIC0xXSA+PSAwfSB7CgkgICAgIyBkcmF3IGEgdGFnCgkgICAgc2V0IHQgWyRjYW52IGNyZWF0ZSBwb2x5Z29uICR4IFtleHByIHskeXQgKyAkZGVsdGF9XSAkeGwgJHl0IFwKCQkgICAgICAgJHhyICR5dCAkeHIgJHliICR4bCAkeWIgJHggW2V4cHIgeyR5YiAtICRkZWx0YX1dIFwKCQkgICAgICAgLXdpZHRoIDEgLW91dGxpbmUgYmxhY2sgLWZpbGwgeWVsbG93IC10YWdzIHRhZy4kaWRdCgkgICAgJGNhbnYgYmluZCAkdCA8MT4gW2xpc3Qgc2hvd3RhZyAkdGFnIDFdCgkgICAgc2V0IHJvd3RleHR4KCRjb21taXRyb3coJGN1cnZpZXcsJGlkKSkgW2V4cHIgeyR4ciArICRsaW5lc3BjfV0KCX0gZWxzZSB7CgkgICAgIyBkcmF3IGEgaGVhZCBvciBvdGhlciByZWYKCSAgICBpZiB7W2luY3IgbmhlYWRzIC0xXSA+PSAwfSB7CgkJc2V0IGNvbCBncmVlbgoJCWlmIHskdGFnIGVxICRtYWluaGVhZH0gewoJCSAgICBsYXBwZW5kIGZvbnQgYm9sZAoJCX0KCSAgICB9IGVsc2UgewoJCXNldCBjb2wgIiNkZGRkZmYiCgkgICAgfQoJICAgIHNldCB4bCBbZXhwciB7JHhsIC0gJGRlbHRhLzJ9XQoJICAgICRjYW52IGNyZWF0ZSBwb2x5Z29uICR4ICR5dCAkeHIgJHl0ICR4ciAkeWIgJHggJHliIFwKCQktd2lkdGggMSAtb3V0bGluZSBibGFjayAtZmlsbCAkY29sIC10YWdzIHRhZy4kaWQKCSAgICBpZiB7W3JlZ2V4cCB7XihyZW1vdGVzLy4qL3xyZW1vdGVzLyl9ICR0YWcgbWF0Y2ggcmVtb3RlcHJlZml4XX0gewoJICAgICAgICBzZXQgcndpZCBbZm9udCBtZWFzdXJlICRtYWluZm9udCAkcmVtb3RlcHJlZml4XQoJCXNldCB4aSBbZXhwciB7JHggKyAxfV0KCQlzZXQgeXRpIFtleHByIHskeXQgKyAxfV0KCQlzZXQgeHJpIFtleHByIHskeCArICRyd2lkfV0KCQkkY2FudiBjcmVhdGUgcG9seWdvbiAkeGkgJHl0aSAkeHJpICR5dGkgJHhyaSAkeWIgJHhpICR5YiBcCgkJCS13aWR0aCAwIC1maWxsICIjZmZkZGFhIiAtdGFncyB0YWcuJGlkCgkgICAgfQoJfQoJc2V0IHQgWyRjYW52IGNyZWF0ZSB0ZXh0ICR4bCAkeTEgLWFuY2hvciB3IC10ZXh0ICR0YWcgLWZpbGwgJGZnY29sb3IgXAoJCSAgIC1mb250ICRmb250IC10YWdzIFtsaXN0IHRhZy4kaWQgdGV4dF1dCglpZiB7JG50YWdzID49IDB9IHsKCSAgICAkY2FudiBiaW5kICR0IDwxPiBbbGlzdCBzaG93dGFnICR0YWcgMV0KCX0KICAgIH0KICAgIHJldHVybiAkeHQKfQoKcHJvYyB4Y29vcmQge2kgbGV2ZWwgbG59IHsKICAgIGdsb2JhbCBjYW52eDAgeHNwYzEgeHNwYzIKCiAgICBzZXQgeCBbZXhwciB7JGNhbnZ4MCArICRpICogJHhzcGMxKCRsbil9XQogICAgaWYgeyRpID4gMCAmJiAkaSA9PSAkbGV2ZWx9IHsKCXNldCB4IFtleHByIHskeCArIDAuNSAqICgkeHNwYzIgLSAkeHNwYzEoJGxuKSl9XQogICAgfSBlbHNlaWYgeyRpID4gJGxldmVsfSB7CglzZXQgeCBbZXhwciB7JHggKyAkeHNwYzIgLSAkeHNwYzEoJGxuKX1dCiAgICB9CiAgICByZXR1cm4gJHgKfQoKcHJvYyBzaG93X3N0YXR1cyB7bXNnfSB7CiAgICBnbG9iYWwgY2FudiBtYWluZm9udCBmZ2NvbG9yCgogICAgY2xlYXJfZGlzcGxheQogICAgJGNhbnYgY3JlYXRlIHRleHQgMyAzIC1hbmNob3IgbncgLXRleHQgJG1zZyAtZm9udCAkbWFpbmZvbnQgXAoJLXRhZ3MgdGV4dCAtZmlsbCAkZmdjb2xvcgp9Cgpwcm9jIGZpbmlzaGNvbW1pdHMge30gewogICAgZ2xvYmFsIGNvbW1pdGlkeCBwaGFzZSBjdXJ2aWV3CiAgICBnbG9iYWwgY2FudiBtYWluZm9udCBjdGV4dCBtYWluY3Vyc29yIHRleHRjdXJzb3IKICAgIGdsb2JhbCBmaW5kaW5wcm9ncmVzcyBwZW5kaW5nX3NlbGVjdAoKICAgIGlmIHskY29tbWl0aWR4KCRjdXJ2aWV3KSA+IDB9IHsKCWRyYXdyZXN0CiAgICB9IGVsc2UgewoJc2hvd19zdGF0dXMgIk5vIGNvbW1pdHMgc2VsZWN0ZWQiCiAgICB9CiAgICBzZXQgcGhhc2Uge30KICAgIGNhdGNoIHt1bnNldCBwZW5kaW5nX3NlbGVjdH0KfQoKIyBEb24ndCBjaGFuZ2UgdGhlIHRleHQgcGFuZSBjdXJzb3IgaWYgaXQgaXMgY3VycmVudGx5IHRoZSBoYW5kIGN1cnNvciwKIyBzaG93aW5nIHRoYXQgd2UgYXJlIG92ZXIgYSBzaGExIElEIGxpbmsuCnByb2Mgc2V0dGV4dGN1cnNvciB7Y30gewogICAgZ2xvYmFsIGN0ZXh0IGN1cnRleHRjdXJzb3IKCiAgICBpZiB7WyRjdGV4dCBjZ2V0IC1jdXJzb3JdID09ICRjdXJ0ZXh0Y3Vyc29yfSB7CgkkY3RleHQgY29uZmlnIC1jdXJzb3IgJGMKICAgIH0KICAgIHNldCBjdXJ0ZXh0Y3Vyc29yICRjCn0KCnByb2Mgbm93YnVzeSB7d2hhdH0gewogICAgZ2xvYmFsIGlzYnVzeQoKICAgIGlmIHtbYXJyYXkgbmFtZXMgaXNidXN5XSBlcSB7fX0gewoJLiBjb25maWcgLWN1cnNvciB3YXRjaAoJc2V0dGV4dGN1cnNvciB3YXRjaAogICAgfQogICAgc2V0IGlzYnVzeSgkd2hhdCkgMQp9Cgpwcm9jIG5vdGJ1c3kge3doYXR9IHsKICAgIGdsb2JhbCBpc2J1c3kgbWFpbmN1cnNvciB0ZXh0Y3Vyc29yCgogICAgY2F0Y2gge3Vuc2V0IGlzYnVzeSgkd2hhdCl9CiAgICBpZiB7W2FycmF5IG5hbWVzIGlzYnVzeV0gZXEge319IHsKCS4gY29uZmlnIC1jdXJzb3IgJG1haW5jdXJzb3IKCXNldHRleHRjdXJzb3IgJHRleHRjdXJzb3IKICAgIH0KfQoKcHJvYyBkcmF3cmVzdCB7fSB7CiAgICBnbG9iYWwgbnVtY29tbWl0cwogICAgZ2xvYmFsIHN0YXJ0bXNlY3MKICAgIGdsb2JhbCBjYW52eTAgbnVtY29tbWl0cyBsaW5lc3BjCiAgICBnbG9iYWwgcm93bGFpZG91dCBjb21taXRpZHggY3VydmlldwogICAgZ2xvYmFsIHBlbmRpbmdfc2VsZWN0CgogICAgc2V0IHJvdyAkcm93bGFpZG91dAogICAgbGF5b3V0cm93cyAkcm93bGFpZG91dCAkY29tbWl0aWR4KCRjdXJ2aWV3KSAxCiAgICBsYXlvdXR0YWlsCiAgICBvcHRpbWl6ZV9yb3dzICRyb3cgMCAkY29tbWl0aWR4KCRjdXJ2aWV3KQogICAgc2hvd3N0dWZmICRjb21taXRpZHgoJGN1cnZpZXcpCiAgICBpZiB7W2luZm8gZXhpc3RzIHBlbmRpbmdfc2VsZWN0XX0gewoJc2VsZWN0bGluZSAwIDEKICAgIH0KCiAgICBzZXQgZHJhd21zZWNzIFtleHByIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdIC0gJHN0YXJ0bXNlY3N9XQogICAgI3B1dHMgIm92ZXJhbGwgJGRyYXdtc2VjcyBtcyBmb3IgJG51bWNvbW1pdHMgY29tbWl0cyIKfQoKcHJvYyBmaW5kbWF0Y2hlcyB7Zn0gewogICAgZ2xvYmFsIGZpbmR0eXBlIGZvdW5kc3RyaW5nIGZvdW5kc3RybGVuCiAgICBpZiB7JGZpbmR0eXBlID09ICJSZWdleHAifSB7CglzZXQgbWF0Y2hlcyBbcmVnZXhwIC1pbmRpY2VzIC1hbGwgLWlubGluZSAkZm91bmRzdHJpbmcgJGZdCiAgICB9IGVsc2UgewoJaWYgeyRmaW5kdHlwZSA9PSAiSWduQ2FzZSJ9IHsKCSAgICBzZXQgc3RyIFtzdHJpbmcgdG9sb3dlciAkZl0KCX0gZWxzZSB7CgkgICAgc2V0IHN0ciAkZgoJfQoJc2V0IG1hdGNoZXMge30KCXNldCBpIDAKCXdoaWxlIHtbc2V0IGogW3N0cmluZyBmaXJzdCAkZm91bmRzdHJpbmcgJHN0ciAkaV1dID49IDB9IHsKCSAgICBsYXBwZW5kIG1hdGNoZXMgW2xpc3QgJGogW2V4cHIgeyRqKyRmb3VuZHN0cmxlbi0xfV1dCgkgICAgc2V0IGkgW2V4cHIgeyRqICsgJGZvdW5kc3RybGVufV0KCX0KICAgIH0KICAgIHJldHVybiAkbWF0Y2hlcwp9Cgpwcm9jIGRvZmluZCB7fSB7CiAgICBnbG9iYWwgZmluZHR5cGUgZmluZGxvYyBmaW5kc3RyaW5nIG1hcmtlZG1hdGNoZXMgY29tbWl0aW5mbwogICAgZ2xvYmFsIG51bWNvbW1pdHMgZGlzcGxheW9yZGVyIGxpbmVodGFnIGxpbmVudGFnIGxpbmVkdGFnCiAgICBnbG9iYWwgbWFpbmZvbnQgY2FudiBjYW52MiBjYW52MyBzZWxlY3RlZGxpbmUKICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIGZvdW5kc3RyaW5nIGZvdW5kc3RybGVuIG1hdGNoc3RyaW5nCiAgICBnbG9iYWwgY29tbWl0ZGF0YQoKICAgIHN0b3BmaW5kcHJvYwogICAgdW5tYXJrbWF0Y2hlcwogICAgY2FuY2VsX25leHRfaGlnaGxpZ2h0CiAgICBmb2N1cyAuCiAgICBzZXQgbWF0Y2hpbmdsaW5lcyB7fQogICAgaWYgeyRmaW5kdHlwZSA9PSAiSWduQ2FzZSJ9IHsKCXNldCBmb3VuZHN0cmluZyBbc3RyaW5nIHRvbG93ZXIgJGZpbmRzdHJpbmddCiAgICB9IGVsc2UgewoJc2V0IGZvdW5kc3RyaW5nICRmaW5kc3RyaW5nCiAgICB9CiAgICBzZXQgZm91bmRzdHJsZW4gW3N0cmluZyBsZW5ndGggJGZpbmRzdHJpbmddCiAgICBpZiB7JGZvdW5kc3RybGVuID09IDB9IHJldHVybgogICAgcmVnc3ViIC1hbGwge1sqP1xbXFxdfSAkZm91bmRzdHJpbmcge1xcJn0gbWF0Y2hzdHJpbmcKICAgIHNldCBtYXRjaHN0cmluZyAiKiRtYXRjaHN0cmluZyoiCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CglzZXQgb2xkc2VsIC0xCiAgICB9IGVsc2UgewoJc2V0IG9sZHNlbCAkc2VsZWN0ZWRsaW5lCiAgICB9CiAgICBzZXQgZGlkc2VsIDAKICAgIHNldCBmbGR0eXBlcyB7SGVhZGxpbmUgQXV0aG9yIERhdGUgQ29tbWl0dGVyIENEYXRlIENvbW1lbnRzfQogICAgc2V0IGwgLTEKICAgIGZvcmVhY2ggaWQgJGRpc3BsYXlvcmRlciB7CglzZXQgZCAkY29tbWl0ZGF0YSgkaWQpCglpbmNyIGwKCWlmIHskZmluZHR5cGUgPT0gIlJlZ2V4cCJ9IHsKCSAgICBzZXQgZG9lc21hdGNoIFtyZWdleHAgJGZvdW5kc3RyaW5nICRkXQoJfSBlbHNlaWYgeyRmaW5kdHlwZSA9PSAiSWduQ2FzZSJ9IHsKCSAgICBzZXQgZG9lc21hdGNoIFtzdHJpbmcgbWF0Y2ggLW5vY2FzZSAkbWF0Y2hzdHJpbmcgJGRdCgl9IGVsc2UgewoJICAgIHNldCBkb2VzbWF0Y2ggW3N0cmluZyBtYXRjaCAkbWF0Y2hzdHJpbmcgJGRdCgl9CglpZiB7ISRkb2VzbWF0Y2h9IGNvbnRpbnVlCglpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldfSB7CgkgICAgZ2V0Y29tbWl0ICRpZAoJfQoJc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQoJc2V0IGRvZXNtYXRjaCAwCglmb3JlYWNoIGYgJGluZm8gdHkgJGZsZHR5cGVzIHsKCSAgICBpZiB7JGZpbmRsb2MgIT0gIkFsbCBmaWVsZHMiICYmICRmaW5kbG9jICE9ICR0eX0gewoJCWNvbnRpbnVlCgkgICAgfQoJICAgIHNldCBtYXRjaGVzIFtmaW5kbWF0Y2hlcyAkZl0KCSAgICBpZiB7JG1hdGNoZXMgPT0ge319IGNvbnRpbnVlCgkgICAgc2V0IGRvZXNtYXRjaCAxCgkgICAgaWYgeyR0eSA9PSAiSGVhZGxpbmUifSB7CgkJZHJhd2NtaXRyb3cgJGwKCQltYXJrbWF0Y2hlcyAkY2FudiAkbCAkZiAkbGluZWh0YWcoJGwpICRtYXRjaGVzICRtYWluZm9udAoJICAgIH0gZWxzZWlmIHskdHkgPT0gIkF1dGhvciJ9IHsKCQlkcmF3Y21pdHJvdyAkbAoJCW1hcmttYXRjaGVzICRjYW52MiAkbCAkZiAkbGluZW50YWcoJGwpICRtYXRjaGVzICRtYWluZm9udAoJICAgIH0gZWxzZWlmIHskdHkgPT0gIkRhdGUifSB7CgkJZHJhd2NtaXRyb3cgJGwKCQltYXJrbWF0Y2hlcyAkY2FudjMgJGwgJGYgJGxpbmVkdGFnKCRsKSAkbWF0Y2hlcyAkbWFpbmZvbnQKCSAgICB9Cgl9CglpZiB7JGRvZXNtYXRjaH0gewoJICAgIGxhcHBlbmQgbWF0Y2hpbmdsaW5lcyAkbAoJICAgIGlmIHshJGRpZHNlbCAmJiAkbCA+ICRvbGRzZWx9IHsKCQlmaW5kc2VsZWN0bGluZSAkbAoJCXNldCBkaWRzZWwgMQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHskbWF0Y2hpbmdsaW5lcyA9PSB7fX0gewoJYmVsbAogICAgfSBlbHNlaWYgeyEkZGlkc2VsfSB7CglmaW5kc2VsZWN0bGluZSBbbGluZGV4ICRtYXRjaGluZ2xpbmVzIDBdCiAgICB9Cn0KCnByb2MgZmluZHNlbGVjdGxpbmUge2x9IHsKICAgIGdsb2JhbCBmaW5kbG9jIGNvbW1lbnRlbmQgY3RleHQKICAgIHNlbGVjdGxpbmUgJGwgMQogICAgaWYgeyRmaW5kbG9jID09ICJBbGwgZmllbGRzIiB8fCAkZmluZGxvYyA9PSAiQ29tbWVudHMifSB7CgkjIGhpZ2hsaWdodCB0aGUgbWF0Y2hlcyBpbiB0aGUgY29tbWVudHMKCXNldCBmIFskY3RleHQgZ2V0IDEuMCAkY29tbWVudGVuZF0KCXNldCBtYXRjaGVzIFtmaW5kbWF0Y2hlcyAkZl0KCWZvcmVhY2ggbWF0Y2ggJG1hdGNoZXMgewoJICAgIHNldCBzdGFydCBbbGluZGV4ICRtYXRjaCAwXQoJICAgIHNldCBlbmQgW2V4cHIge1tsaW5kZXggJG1hdGNoIDFdICsgMX1dCgkgICAgJGN0ZXh0IHRhZyBhZGQgZm91bmQgIjEuMCArICRzdGFydCBjIiAiMS4wICsgJGVuZCBjIgoJfQogICAgfQp9Cgpwcm9jIGZpbmRuZXh0IHtyZXN0YXJ0fSB7CiAgICBnbG9iYWwgbWF0Y2hpbmdsaW5lcyBzZWxlY3RlZGxpbmUKICAgIGlmIHshW2luZm8gZXhpc3RzIG1hdGNoaW5nbGluZXNdfSB7CglpZiB7JHJlc3RhcnR9IHsKCSAgICBkb2ZpbmQKCX0KCXJldHVybgogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBmb3JlYWNoIGwgJG1hdGNoaW5nbGluZXMgewoJaWYgeyRsID4gJHNlbGVjdGVkbGluZX0gewoJICAgIGZpbmRzZWxlY3RsaW5lICRsCgkgICAgcmV0dXJuCgl9CiAgICB9CiAgICBiZWxsCn0KCnByb2MgZmluZHByZXYge30gewogICAgZ2xvYmFsIG1hdGNoaW5nbGluZXMgc2VsZWN0ZWRsaW5lCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBtYXRjaGluZ2xpbmVzXX0gewoJZG9maW5kCglyZXR1cm4KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgc2V0IHByZXYge30KICAgIGZvcmVhY2ggbCAkbWF0Y2hpbmdsaW5lcyB7CglpZiB7JGwgPj0gJHNlbGVjdGVkbGluZX0gYnJlYWsKCXNldCBwcmV2ICRsCiAgICB9CiAgICBpZiB7JHByZXYgIT0ge319IHsKCWZpbmRzZWxlY3RsaW5lICRwcmV2CiAgICB9IGVsc2UgewoJYmVsbAogICAgfQp9Cgpwcm9jIHN0b3BmaW5kcHJvYyB7e2RvbmUgMH19IHsKICAgIGdsb2JhbCBmaW5kcHJvY3BpZCBmaW5kcHJvY2ZpbGUgZmluZGlkcwogICAgZ2xvYmFsIGN0ZXh0IGZpbmRvbGRjdXJzb3IgcGhhc2UgbWFpbmN1cnNvciB0ZXh0Y3Vyc29yCiAgICBnbG9iYWwgZmluZGlucHJvZ3Jlc3MKCiAgICBjYXRjaCB7dW5zZXQgZmluZGlkc30KICAgIGlmIHtbaW5mbyBleGlzdHMgZmluZHByb2NwaWRdfSB7CglpZiB7ISRkb25lfSB7CgkgICAgY2F0Y2gge2V4ZWMga2lsbCAkZmluZHByb2NwaWR9Cgl9CgljYXRjaCB7Y2xvc2UgJGZpbmRwcm9jZmlsZX0KCXVuc2V0IGZpbmRwcm9jcGlkCiAgICB9CiAgICBjYXRjaCB7dW5zZXQgZmluZGlucHJvZ3Jlc3N9CiAgICBub3RidXN5IGZpbmQKfQoKIyBtYXJrIGEgY29tbWl0IGFzIG1hdGNoaW5nIGJ5IHB1dHRpbmcgYSB5ZWxsb3cgYmFja2dyb3VuZAojIGJlaGluZCB0aGUgaGVhZGxpbmUKcHJvYyBtYXJraGVhZGxpbmUge2wgaWR9IHsKICAgIGdsb2JhbCBjYW52IG1haW5mb250IGxpbmVodGFnCgogICAgZHJhd2NtaXRyb3cgJGwKICAgIHNldCBiYm94IFskY2FudiBiYm94ICRsaW5laHRhZygkbCldCiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIHJlY3QgJGJib3ggLW91dGxpbmUge30gLXRhZ3MgbWF0Y2hlcyAtZmlsbCB5ZWxsb3ddCiAgICAkY2FudiBsb3dlciAkdAp9CgojIG1hcmsgdGhlIGJpdHMgb2YgYSBoZWFkbGluZSwgYXV0aG9yIG9yIGRhdGUgdGhhdCBtYXRjaCBhIGZpbmQgc3RyaW5nCnByb2MgbWFya21hdGNoZXMge2NhbnYgbCBzdHIgdGFnIG1hdGNoZXMgZm9udH0gewogICAgc2V0IGJib3ggWyRjYW52IGJib3ggJHRhZ10KICAgIHNldCB4MCBbbGluZGV4ICRiYm94IDBdCiAgICBzZXQgeTAgW2xpbmRleCAkYmJveCAxXQogICAgc2V0IHkxIFtsaW5kZXggJGJib3ggM10KICAgIGZvcmVhY2ggbWF0Y2ggJG1hdGNoZXMgewoJc2V0IHN0YXJ0IFtsaW5kZXggJG1hdGNoIDBdCglzZXQgZW5kIFtsaW5kZXggJG1hdGNoIDFdCglpZiB7JHN0YXJ0ID4gJGVuZH0gY29udGludWUKCXNldCB4b2ZmIFtmb250IG1lYXN1cmUgJGZvbnQgW3N0cmluZyByYW5nZSAkc3RyIDAgW2V4cHIgeyRzdGFydC0xfV1dXQoJc2V0IHhsZW4gW2ZvbnQgbWVhc3VyZSAkZm9udCBbc3RyaW5nIHJhbmdlICRzdHIgMCBbZXhwciB7JGVuZH1dXV0KCXNldCB0IFskY2FudiBjcmVhdGUgcmVjdCBbZXhwciB7JHgwKyR4b2ZmfV0gJHkwIFwKCQkgICBbZXhwciB7JHgwKyR4bGVuKzJ9XSAkeTEgXAoJCSAgIC1vdXRsaW5lIHt9IC10YWdzIG1hdGNoZXMgLWZpbGwgeWVsbG93XQoJJGNhbnYgbG93ZXIgJHQKICAgIH0KfQoKcHJvYyB1bm1hcmttYXRjaGVzIHt9IHsKICAgIGdsb2JhbCBtYXRjaGluZ2xpbmVzIGZpbmRpZHMKICAgIGFsbGNhbnZzIGRlbGV0ZSBtYXRjaGVzCiAgICBjYXRjaCB7dW5zZXQgbWF0Y2hpbmdsaW5lc30KICAgIGNhdGNoIHt1bnNldCBmaW5kaWRzfQp9Cgpwcm9jIHNlbGNhbnZsaW5lIHt3IHggeX0gewogICAgZ2xvYmFsIGNhbnYgY2FudnkwIGN0ZXh0IGxpbmVzcGMKICAgIGdsb2JhbCByb3d0ZXh0eAogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgaWYgeyR5bWF4ID09IHt9fSByZXR1cm4KICAgIHNldCB5ZnJhYyBbbGluZGV4IFskY2FudiB5dmlld10gMF0KICAgIHNldCB5IFtleHByIHskeSArICR5ZnJhYyAqICR5bWF4fV0KICAgIHNldCBsIFtleHByIHtpbnQoKCR5IC0gJGNhbnZ5MCkgLyAkbGluZXNwYyArIDAuNSl9XQogICAgaWYgeyRsIDwgMH0gewoJc2V0IGwgMAogICAgfQogICAgaWYgeyR3IGVxICRjYW52fSB7CglpZiB7IVtpbmZvIGV4aXN0cyByb3d0ZXh0eCgkbCldIHx8ICR4IDwgJHJvd3RleHR4KCRsKX0gcmV0dXJuCiAgICB9CiAgICB1bm1hcmttYXRjaGVzCiAgICBzZWxlY3RsaW5lICRsIDEKfQoKcHJvYyBjb21taXRfZGVzY3JpcHRvciB7cH0gewogICAgZ2xvYmFsIGNvbW1pdGluZm8KICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdGluZm8oJHApXX0gewoJZ2V0Y29tbWl0ICRwCiAgICB9CiAgICBzZXQgbCAiLi4uIgogICAgaWYge1tsbGVuZ3RoICRjb21taXRpbmZvKCRwKV0gPiAxfSB7CglzZXQgbCBbbGluZGV4ICRjb21taXRpbmZvKCRwKSAwXQogICAgfQogICAgcmV0dXJuICIkcCAoJGwpXG4iCn0KCiMgYXBwZW5kIHNvbWUgdGV4dCB0byB0aGUgY3RleHQgd2lkZ2V0LCBhbmQgbWFrZSBhbnkgU0hBMSBJRAojIHRoYXQgd2Uga25vdyBhYm91dCBiZSBhIGNsaWNrYWJsZSBsaW5rLgpwcm9jIGFwcGVuZHdpdGhsaW5rcyB7dGV4dCB0YWdzfSB7CiAgICBnbG9iYWwgY3RleHQgY29tbWl0cm93IGxpbmtudW0gY3VydmlldwoKICAgIHNldCBzdGFydCBbJGN0ZXh0IGluZGV4ICJlbmQgLSAxYyJdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAkdGV4dCAkdGFncwogICAgc2V0IGxpbmtzIFtyZWdleHAgLWluZGljZXMgLWFsbCAtaW5saW5lIHtbMC05YS1mXXs0MH19ICR0ZXh0XQogICAgZm9yZWFjaCBsICRsaW5rcyB7CglzZXQgcyBbbGluZGV4ICRsIDBdCglzZXQgZSBbbGluZGV4ICRsIDFdCglzZXQgbGlua2lkIFtzdHJpbmcgcmFuZ2UgJHRleHQgJHMgJGVdCglpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGxpbmtpZCldfSBjb250aW51ZQoJaW5jciBlCgkkY3RleHQgdGFnIGFkZCBsaW5rICIkc3RhcnQgKyAkcyBjIiAiJHN0YXJ0ICsgJGUgYyIKCSRjdGV4dCB0YWcgYWRkIGxpbmskbGlua251bSAiJHN0YXJ0ICsgJHMgYyIgIiRzdGFydCArICRlIGMiCgkkY3RleHQgdGFnIGJpbmQgbGluayRsaW5rbnVtIDwxPiBcCgkgICAgW2xpc3Qgc2VsZWN0bGluZSAkY29tbWl0cm93KCRjdXJ2aWV3LCRsaW5raWQpIDFdCglpbmNyIGxpbmtudW0KICAgIH0KICAgICRjdGV4dCB0YWcgY29uZiBsaW5rIC1mb3JlZ3JvdW5kIGJsdWUgLXVuZGVybGluZSAxCiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8RW50ZXI+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgaGFuZDIgfQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPExlYXZlPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yICRjdXJ0ZXh0Y3Vyc29yIH0KfQoKcHJvYyB2aWV3bmV4dGxpbmUge2Rpcn0gewogICAgZ2xvYmFsIGNhbnYgbGluZXNwYwoKICAgICRjYW52IGRlbGV0ZSBob3ZlcgogICAgc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQogICAgc2V0IHdub3cgWyRjYW52IHl2aWV3XQogICAgc2V0IHd0b3AgW2V4cHIge1tsaW5kZXggJHdub3cgMF0gKiAkeW1heH1dCiAgICBzZXQgbmV3dG9wIFtleHByIHskd3RvcCArICRkaXIgKiAkbGluZXNwY31dCiAgICBpZiB7JG5ld3RvcCA8IDB9IHsKCXNldCBuZXd0b3AgMAogICAgfSBlbHNlaWYgeyRuZXd0b3AgPiAkeW1heH0gewoJc2V0IG5ld3RvcCAkeW1heAogICAgfQogICAgYWxsY2FudnMgeXZpZXcgbW92ZXRvIFtleHByIHskbmV3dG9wICogMS4wIC8gJHltYXh9XQp9CgojIGFkZCBhIGxpc3Qgb2YgdGFnIG9yIGJyYW5jaCBuYW1lcyBhdCBwb3NpdGlvbiBwb3MKIyByZXR1cm5zIHRoZSBudW1iZXIgb2YgbmFtZXMgaW5zZXJ0ZWQKcHJvYyBhcHBlbmRyZWZzIHtwb3MgbCB2YXJ9IHsKICAgIGdsb2JhbCBjdGV4dCBjb21taXRyb3cgbGlua251bSBjdXJ2aWV3IGlkdGFncyAkdmFyCgogICAgaWYge1tjYXRjaCB7JGN0ZXh0IGluZGV4ICRwb3N9XX0gewoJcmV0dXJuIDAKICAgIH0KICAgIHNldCB0YWdzIHt9CiAgICBmb3JlYWNoIGlkICRsIHsKCWZvcmVhY2ggdGFnIFtzZXQgJHZhclwoJGlkXCldIHsKCSAgICBsYXBwZW5kIHRhZ3MgW2NvbmNhdCAkdGFnICRpZF0KCX0KICAgIH0KICAgIHNldCB0YWdzIFtsc29ydCAtaW5kZXggMSAkdGFnc10KICAgIHNldCBzZXAge30KICAgIGZvcmVhY2ggdGFnICR0YWdzIHsKCXNldCBuYW1lIFtsaW5kZXggJHRhZyAwXQoJc2V0IGlkIFtsaW5kZXggJHRhZyAxXQoJc2V0IGxrIGxpbmskbGlua251bQoJaW5jciBsaW5rbnVtCgkkY3RleHQgaW5zZXJ0ICRwb3MgJHNlcAoJJGN0ZXh0IGluc2VydCAkcG9zICRuYW1lICRsawoJJGN0ZXh0IHRhZyBjb25mICRsayAtZm9yZWdyb3VuZCBibHVlCglpZiB7W2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXX0gewoJICAgICRjdGV4dCB0YWcgYmluZCAkbGsgPDE+IFwKCQlbbGlzdCBzZWxlY3RsaW5lICRjb21taXRyb3coJGN1cnZpZXcsJGlkKSAxXQoJICAgICRjdGV4dCB0YWcgY29uZiAkbGsgLXVuZGVybGluZSAxCgkgICAgJGN0ZXh0IHRhZyBiaW5kICRsayA8RW50ZXI+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgaGFuZDIgfQoJICAgICRjdGV4dCB0YWcgYmluZCAkbGsgPExlYXZlPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yICRjdXJ0ZXh0Y3Vyc29yIH0KCX0KCXNldCBzZXAgIiwgIgogICAgfQogICAgcmV0dXJuIFtsbGVuZ3RoICR0YWdzXQp9CgojIGNhbGxlZCB3aGVuIHdlIGhhdmUgZmluaXNoZWQgY29tcHV0aW5nIHRoZSBuZWFyYnkgdGFncwpwcm9jIGRpc3BuZWFydGFncyB7fSB7CiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lIGN1cnJlbnRpZCBjdGV4dCBhbmNfdGFncyBkZXNjX3RhZ3Mgc2hvd25lYXJ0YWdzCiAgICBnbG9iYWwgZGVzY19oZWFkcwoKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV0gfHwgISRzaG93bmVhcnRhZ3N9IHJldHVybgogICAgc2V0IGlkICRjdXJyZW50aWQKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIGlmIHtbaW5mbyBleGlzdHMgZGVzY19oZWFkcygkaWQpXX0gewoJaWYge1thcHBlbmRyZWZzIGJyYW5jaCAkZGVzY19oZWFkcygkaWQpIGlkaGVhZHNdID4gMX0gewoJICAgICRjdGV4dCBpbnNlcnQgImJyYW5jaCAtMmMiICJlcyIKCX0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgYW5jX3RhZ3MoJGlkKV19IHsKCWFwcGVuZHJlZnMgZm9sbG93cyAkYW5jX3RhZ3MoJGlkKSBpZHRhZ3MKICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgZGVzY190YWdzKCRpZCldfSB7CglhcHBlbmRyZWZzIHByZWNlZGVzICRkZXNjX3RhZ3MoJGlkKSBpZHRhZ3MKICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAp9Cgpwcm9jIHNlbGVjdGxpbmUge2wgaXNuZXd9IHsKICAgIGdsb2JhbCBjYW52IGNhbnYyIGNhbnYzIGN0ZXh0IGNvbW1pdGluZm8gc2VsZWN0ZWRsaW5lCiAgICBnbG9iYWwgZGlzcGxheW9yZGVyIGxpbmVodGFnIGxpbmVudGFnIGxpbmVkdGFnCiAgICBnbG9iYWwgY2FudnkwIGxpbmVzcGMgcGFyZW50bGlzdCBjaGlsZGxpc3QKICAgIGdsb2JhbCBjdXJyZW50aWQgc2hhMWVudHJ5CiAgICBnbG9iYWwgY29tbWVudGVuZCBpZHRhZ3MgbGlua251bQogICAgZ2xvYmFsIG1lcmdlbWF4IG51bWNvbW1pdHMgcGVuZGluZ19zZWxlY3QKICAgIGdsb2JhbCBjbWl0bW9kZSBkZXNjX3RhZ3MgYW5jX3RhZ3Mgc2hvd25lYXJ0YWdzIGFsbGNvbW1pdHMgZGVzY19oZWFkcwoKICAgIGNhdGNoIHt1bnNldCBwZW5kaW5nX3NlbGVjdH0KICAgICRjYW52IGRlbGV0ZSBob3ZlcgogICAgbm9ybWFsbGluZQogICAgY2FuY2VsX25leHRfaGlnaGxpZ2h0CiAgICBpZiB7JGwgPCAwIHx8ICRsID49ICRudW1jb21taXRzfSByZXR1cm4KICAgIHNldCB5IFtleHByIHskY2FudnkwICsgJGwgKiAkbGluZXNwY31dCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBzZXQgeXRvcCBbZXhwciB7JHkgLSAkbGluZXNwYyAtIDF9XQogICAgc2V0IHlib3QgW2V4cHIgeyR5ICsgJGxpbmVzcGMgKyAxfV0KICAgIHNldCB3bm93IFskY2FudiB5dmlld10KICAgIHNldCB3dG9wIFtleHByIHtbbGluZGV4ICR3bm93IDBdICogJHltYXh9XQogICAgc2V0IHdib3QgW2V4cHIge1tsaW5kZXggJHdub3cgMV0gKiAkeW1heH1dCiAgICBzZXQgd2ggW2V4cHIgeyR3Ym90IC0gJHd0b3B9XQogICAgc2V0IG5ld3RvcCAkd3RvcAogICAgaWYgeyR5dG9wIDwgJHd0b3B9IHsKCWlmIHskeWJvdCA8ICR3dG9wfSB7CgkgICAgc2V0IG5ld3RvcCBbZXhwciB7JHkgLSAkd2ggLyAyLjB9XQoJfSBlbHNlIHsKCSAgICBzZXQgbmV3dG9wICR5dG9wCgkgICAgaWYgeyRuZXd0b3AgPiAkd3RvcCAtICRsaW5lc3BjfSB7CgkJc2V0IG5ld3RvcCBbZXhwciB7JHd0b3AgLSAkbGluZXNwY31dCgkgICAgfQoJfQogICAgfSBlbHNlaWYgeyR5Ym90ID4gJHdib3R9IHsKCWlmIHskeXRvcCA+ICR3Ym90fSB7CgkgICAgc2V0IG5ld3RvcCBbZXhwciB7JHkgLSAkd2ggLyAyLjB9XQoJfSBlbHNlIHsKCSAgICBzZXQgbmV3dG9wIFtleHByIHskeWJvdCAtICR3aH1dCgkgICAgaWYgeyRuZXd0b3AgPCAkd3RvcCArICRsaW5lc3BjfSB7CgkJc2V0IG5ld3RvcCBbZXhwciB7JHd0b3AgKyAkbGluZXNwY31dCgkgICAgfQoJfQogICAgfQogICAgaWYgeyRuZXd0b3AgIT0gJHd0b3B9IHsKCWlmIHskbmV3dG9wIDwgMH0gewoJICAgIHNldCBuZXd0b3AgMAoJfQoJYWxsY2FudnMgeXZpZXcgbW92ZXRvIFtleHByIHskbmV3dG9wICogMS4wIC8gJHltYXh9XQoJZHJhd3Zpc2libGUKICAgIH0KCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBsaW5laHRhZygkbCldfSByZXR1cm4KICAgICRjYW52IGRlbGV0ZSBzZWNzZWwKICAgIHNldCB0IFtldmFsICRjYW52IGNyZWF0ZSByZWN0IFskY2FudiBiYm94ICRsaW5laHRhZygkbCldIC1vdXRsaW5lIHt7fX0gXAoJICAgICAgIC10YWdzIHNlY3NlbCAtZmlsbCBbJGNhbnYgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCiAgICAkY2FudiBsb3dlciAkdAogICAgJGNhbnYyIGRlbGV0ZSBzZWNzZWwKICAgIHNldCB0IFtldmFsICRjYW52MiBjcmVhdGUgcmVjdCBbJGNhbnYyIGJib3ggJGxpbmVudGFnKCRsKV0gLW91dGxpbmUge3t9fSBcCgkgICAgICAgLXRhZ3Mgc2Vjc2VsIC1maWxsIFskY2FudjIgY2dldCAtc2VsZWN0YmFja2dyb3VuZF1dCiAgICAkY2FudjIgbG93ZXIgJHQKICAgICRjYW52MyBkZWxldGUgc2Vjc2VsCiAgICBzZXQgdCBbZXZhbCAkY2FudjMgY3JlYXRlIHJlY3QgWyRjYW52MyBiYm94ICRsaW5lZHRhZygkbCldIC1vdXRsaW5lIHt7fX0gXAoJICAgICAgIC10YWdzIHNlY3NlbCAtZmlsbCBbJGNhbnYzIGNnZXQgLXNlbGVjdGJhY2tncm91bmRdXQogICAgJGNhbnYzIGxvd2VyICR0CgogICAgaWYgeyRpc25ld30gewoJYWRkdG9oaXN0b3J5IFtsaXN0IHNlbGVjdGxpbmUgJGwgMF0KICAgIH0KCiAgICBzZXQgc2VsZWN0ZWRsaW5lICRsCgogICAgc2V0IGlkIFtsaW5kZXggJGRpc3BsYXlvcmRlciAkbF0KICAgIHNldCBjdXJyZW50aWQgJGlkCiAgICAkc2hhMWVudHJ5IGRlbGV0ZSAwIGVuZAogICAgJHNoYTFlbnRyeSBpbnNlcnQgMCAkaWQKICAgICRzaGExZW50cnkgc2VsZWN0aW9uIGZyb20gMAogICAgJHNoYTFlbnRyeSBzZWxlY3Rpb24gdG8gZW5kCiAgICByaGlnaGxpZ2h0X3NlbCAkaWQKCiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBjbGVhcl9jdGV4dAogICAgc2V0IGxpbmtudW0gMAogICAgc2V0IGluZm8gJGNvbW1pdGluZm8oJGlkKQogICAgc2V0IGRhdGUgW2Zvcm1hdGRhdGUgW2xpbmRleCAkaW5mbyAyXV0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJBdXRob3I6IFtsaW5kZXggJGluZm8gMV0gICRkYXRlXG4iCiAgICBzZXQgZGF0ZSBbZm9ybWF0ZGF0ZSBbbGluZGV4ICRpbmZvIDRdXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIkNvbW1pdHRlcjogW2xpbmRleCAkaW5mbyAzXSAgJGRhdGVcbiIKICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRpZCldfSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiVGFnczoiCglmb3JlYWNoIHRhZyAkaWR0YWdzKCRpZCkgewoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIgJHRhZyIKCX0KCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgIH0KIAogICAgc2V0IGhlYWRlcnMge30KICAgIHNldCBvbGRzIFtsaW5kZXggJHBhcmVudGxpc3QgJGxdCiAgICBpZiB7W2xsZW5ndGggJG9sZHNdID4gMX0gewoJc2V0IG5wIDAKCWZvcmVhY2ggcCAkb2xkcyB7CgkgICAgaWYgeyRucCA+PSAkbWVyZ2VtYXh9IHsKCQlzZXQgdGFnIG1tYXgKCSAgICB9IGVsc2UgewoJCXNldCB0YWcgbSRucAoJICAgIH0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiUGFyZW50OiAiICR0YWcKCSAgICBhcHBlbmR3aXRobGlua3MgW2NvbW1pdF9kZXNjcmlwdG9yICRwXSB7fQoJICAgIGluY3IgbnAKCX0KICAgIH0gZWxzZSB7Cglmb3JlYWNoIHAgJG9sZHMgewoJICAgIGFwcGVuZCBoZWFkZXJzICJQYXJlbnQ6IFtjb21taXRfZGVzY3JpcHRvciAkcF0iCgl9CiAgICB9CgogICAgZm9yZWFjaCBjIFtsaW5kZXggJGNoaWxkbGlzdCAkbF0gewoJYXBwZW5kIGhlYWRlcnMgIkNoaWxkOiAgW2NvbW1pdF9kZXNjcmlwdG9yICRjXSIKICAgIH0KCiAgICAjIG1ha2UgYW55dGhpbmcgdGhhdCBsb29rcyBsaWtlIGEgU0hBMSBJRCBiZSBhIGNsaWNrYWJsZSBsaW5rCiAgICBhcHBlbmR3aXRobGlua3MgJGhlYWRlcnMge30KICAgIGlmIHskc2hvd25lYXJ0YWdzfSB7CglpZiB7IVtpbmZvIGV4aXN0cyBhbGxjb21taXRzXX0gewoJICAgIGdldGFsbGNvbW1pdHMKCX0KCSRjdGV4dCBpbnNlcnQgZW5kICJCcmFuY2g6ICIKCSRjdGV4dCBtYXJrIHNldCBicmFuY2ggImVuZCAtMWMiCgkkY3RleHQgbWFyayBncmF2aXR5IGJyYW5jaCBsZWZ0CglpZiB7W2luZm8gZXhpc3RzIGRlc2NfaGVhZHMoJGlkKV19IHsKCSAgICBpZiB7W2FwcGVuZHJlZnMgYnJhbmNoICRkZXNjX2hlYWRzKCRpZCkgaWRoZWFkc10gPiAxfSB7CgkJIyB0dXJuICJCcmFuY2giIGludG8gIkJyYW5jaGVzIgoJCSRjdGV4dCBpbnNlcnQgImJyYW5jaCAtMmMiICJlcyIKCSAgICB9Cgl9CgkkY3RleHQgaW5zZXJ0IGVuZCAiXG5Gb2xsb3dzOiAiCgkkY3RleHQgbWFyayBzZXQgZm9sbG93cyAiZW5kIC0xYyIKCSRjdGV4dCBtYXJrIGdyYXZpdHkgZm9sbG93cyBsZWZ0CglpZiB7W2luZm8gZXhpc3RzIGFuY190YWdzKCRpZCldfSB7CgkgICAgYXBwZW5kcmVmcyBmb2xsb3dzICRhbmNfdGFncygkaWQpIGlkdGFncwoJfQoJJGN0ZXh0IGluc2VydCBlbmQgIlxuUHJlY2VkZXM6ICIKCSRjdGV4dCBtYXJrIHNldCBwcmVjZWRlcyAiZW5kIC0xYyIKCSRjdGV4dCBtYXJrIGdyYXZpdHkgcHJlY2VkZXMgbGVmdAoJaWYge1tpbmZvIGV4aXN0cyBkZXNjX3RhZ3MoJGlkKV19IHsKCSAgICBhcHBlbmRyZWZzIHByZWNlZGVzICRkZXNjX3RhZ3MoJGlkKSBpZHRhZ3MKCX0KCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgIH0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgIGFwcGVuZHdpdGhsaW5rcyBbbGluZGV4ICRpbmZvIDVdIHtjb21tZW50fQoKICAgICRjdGV4dCB0YWcgZGVsZXRlIENvbW1lbnRzCiAgICAkY3RleHQgdGFnIHJlbW92ZSBmb3VuZCAxLjAgZW5kCiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIHNldCBjb21tZW50ZW5kIFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KCiAgICBpbml0X2ZsaXN0ICJDb21tZW50cyIKICAgIGlmIHskY21pdG1vZGUgZXEgInRyZWUifSB7CglnZXR0cmVlICRpZAogICAgfSBlbHNlaWYge1tsbGVuZ3RoICRvbGRzXSA8PSAxfSB7CglzdGFydGRpZmYgJGlkCiAgICB9IGVsc2UgewoJbWVyZ2VkaWZmICRpZCAkbAogICAgfQp9Cgpwcm9jIHNlbGZpcnN0bGluZSB7fSB7CiAgICB1bm1hcmttYXRjaGVzCiAgICBzZWxlY3RsaW5lIDAgMQp9Cgpwcm9jIHNlbGxhc3RsaW5lIHt9IHsKICAgIGdsb2JhbCBudW1jb21taXRzCiAgICB1bm1hcmttYXRjaGVzCiAgICBzZXQgbCBbZXhwciB7JG51bWNvbW1pdHMgLSAxfV0KICAgIHNlbGVjdGxpbmUgJGwgMQp9Cgpwcm9jIHNlbG5leHRsaW5lIHtkaXJ9IHsKICAgIGdsb2JhbCBzZWxlY3RlZGxpbmUKICAgIGlmIHshW2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV19IHJldHVybgogICAgc2V0IGwgW2V4cHIgeyRzZWxlY3RlZGxpbmUgKyAkZGlyfV0KICAgIHVubWFya21hdGNoZXMKICAgIHNlbGVjdGxpbmUgJGwgMQp9Cgpwcm9jIHNlbG5leHRwYWdlIHtkaXJ9IHsKICAgIGdsb2JhbCBjYW52IGxpbmVzcGMgc2VsZWN0ZWRsaW5lIG51bWNvbW1pdHMKCiAgICBzZXQgbHBwIFtleHByIHsoW3dpbmZvIGhlaWdodCAkY2Fudl0gLSAyKSAvICRsaW5lc3BjfV0KICAgIGlmIHskbHBwIDwgMX0gewoJc2V0IGxwcCAxCiAgICB9CiAgICBhbGxjYW52cyB5dmlldyBzY3JvbGwgW2V4cHIgeyRkaXIgKiAkbHBwfV0gdW5pdHMKICAgIGRyYXd2aXNpYmxlCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSByZXR1cm4KICAgIHNldCBsIFtleHByIHskc2VsZWN0ZWRsaW5lICsgJGRpciAqICRscHB9XQogICAgaWYgeyRsIDwgMH0gewoJc2V0IGwgMAogICAgfSBlbHNlaWYgeyRsID49ICRudW1jb21taXRzfSB7CiAgICAgICAgc2V0IGwgW2V4cHIgJG51bWNvbW1pdHMgLSAxXQogICAgfQogICAgdW5tYXJrbWF0Y2hlcwogICAgc2VsZWN0bGluZSAkbCAxICAgIAp9Cgpwcm9jIHVuc2VsZWN0bGluZSB7fSB7CiAgICBnbG9iYWwgc2VsZWN0ZWRsaW5lIGN1cnJlbnRpZAoKICAgIGNhdGNoIHt1bnNldCBzZWxlY3RlZGxpbmV9CiAgICBjYXRjaCB7dW5zZXQgY3VycmVudGlkfQogICAgYWxsY2FudnMgZGVsZXRlIHNlY3NlbAogICAgcmhpZ2hsaWdodF9ub25lCiAgICBjYW5jZWxfbmV4dF9oaWdobGlnaHQKfQoKcHJvYyByZXNlbGVjdGxpbmUge30gewogICAgZ2xvYmFsIHNlbGVjdGVkbGluZQoKICAgIGlmIHtbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gewoJc2VsZWN0bGluZSAkc2VsZWN0ZWRsaW5lIDAKICAgIH0KfQoKcHJvYyBhZGR0b2hpc3Rvcnkge2NtZH0gewogICAgZ2xvYmFsIGhpc3RvcnkgaGlzdG9yeWluZGV4IGN1cnZpZXcKCiAgICBzZXQgZWx0IFtsaXN0ICRjdXJ2aWV3ICRjbWRdCiAgICBpZiB7JGhpc3RvcnlpbmRleCA+IDAKCSYmIFtsaW5kZXggJGhpc3RvcnkgW2V4cHIgeyRoaXN0b3J5aW5kZXggLSAxfV1dID09ICRlbHR9IHsKCXJldHVybgogICAgfQoKICAgIGlmIHskaGlzdG9yeWluZGV4IDwgW2xsZW5ndGggJGhpc3RvcnldfSB7CglzZXQgaGlzdG9yeSBbbHJlcGxhY2UgJGhpc3RvcnkgJGhpc3RvcnlpbmRleCBlbmQgJGVsdF0KICAgIH0gZWxzZSB7CglsYXBwZW5kIGhpc3RvcnkgJGVsdAogICAgfQogICAgaW5jciBoaXN0b3J5aW5kZXgKICAgIGlmIHskaGlzdG9yeWluZGV4ID4gMX0gewoJLmN0b3AudG9wLmJhci5sZWZ0YnV0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgfSBlbHNlIHsKCS5jdG9wLnRvcC5iYXIubGVmdGJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgfQogICAgLmN0b3AudG9wLmJhci5yaWdodGJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAp9Cgpwcm9jIGdvZG8ge2VsdH0gewogICAgZ2xvYmFsIGN1cnZpZXcKCiAgICBzZXQgdmlldyBbbGluZGV4ICRlbHQgMF0KICAgIHNldCBjbWQgW2xpbmRleCAkZWx0IDFdCiAgICBpZiB7JGN1cnZpZXcgIT0gJHZpZXd9IHsKCXNob3d2aWV3ICR2aWV3CiAgICB9CiAgICBldmFsICRjbWQKfQoKcHJvYyBnb2JhY2sge30gewogICAgZ2xvYmFsIGhpc3RvcnkgaGlzdG9yeWluZGV4CgogICAgaWYgeyRoaXN0b3J5aW5kZXggPiAxfSB7CglpbmNyIGhpc3RvcnlpbmRleCAtMQoJZ29kbyBbbGluZGV4ICRoaXN0b3J5IFtleHByIHskaGlzdG9yeWluZGV4IC0gMX1dXQoJLmN0b3AudG9wLmJhci5yaWdodGJ1dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIH0KICAgIGlmIHskaGlzdG9yeWluZGV4IDw9IDF9IHsKCS5jdG9wLnRvcC5iYXIubGVmdGJ1dCBjb25mIC1zdGF0ZSBkaXNhYmxlZAogICAgfQp9Cgpwcm9jIGdvZm9ydyB7fSB7CiAgICBnbG9iYWwgaGlzdG9yeSBoaXN0b3J5aW5kZXgKCiAgICBpZiB7JGhpc3RvcnlpbmRleCA8IFtsbGVuZ3RoICRoaXN0b3J5XX0gewoJc2V0IGNtZCBbbGluZGV4ICRoaXN0b3J5ICRoaXN0b3J5aW5kZXhdCglpbmNyIGhpc3RvcnlpbmRleAoJZ29kbyAkY21kCgkuY3RvcC50b3AuYmFyLmxlZnRidXQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICB9CiAgICBpZiB7JGhpc3RvcnlpbmRleCA+PSBbbGxlbmd0aCAkaGlzdG9yeV19IHsKCS5jdG9wLnRvcC5iYXIucmlnaHRidXQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIH0KfQoKcHJvYyBnZXR0cmVlIHtpZH0gewogICAgZ2xvYmFsIHRyZWVmaWxlbGlzdCB0cmVlaWRsaXN0IGRpZmZpZHMgZGlmZm1lcmdlaWQgdHJlZXBlbmRpbmcKCiAgICBzZXQgZGlmZmlkcyAkaWQKICAgIGNhdGNoIHt1bnNldCBkaWZmbWVyZ2VpZH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHRyZWVmaWxlbGlzdCgkaWQpXX0gewoJaWYgeyFbaW5mbyBleGlzdHMgdHJlZXBlbmRpbmddfSB7CgkgICAgaWYge1tjYXRjaCB7c2V0IGd0ZiBbb3BlbiBbY29uY2F0IHwgZ2l0IGxzLXRyZWUgLXIgJGlkXSByXX1dfSB7CgkJcmV0dXJuCgkgICAgfQoJICAgIHNldCB0cmVlcGVuZGluZyAkaWQKCSAgICBzZXQgdHJlZWZpbGVsaXN0KCRpZCkge30KCSAgICBzZXQgdHJlZWlkbGlzdCgkaWQpIHt9CgkgICAgZmNvbmZpZ3VyZSAkZ3RmIC1ibG9ja2luZyAwCgkgICAgZmlsZWV2ZW50ICRndGYgcmVhZGFibGUgW2xpc3QgZ2V0dHJlZWxpbmUgJGd0ZiAkaWRdCgl9CiAgICB9IGVsc2UgewoJc2V0ZmlsZWxpc3QgJGlkCiAgICB9Cn0KCnByb2MgZ2V0dHJlZWxpbmUge2d0ZiBpZH0gewogICAgZ2xvYmFsIHRyZWVmaWxlbGlzdCB0cmVlaWRsaXN0IHRyZWVwZW5kaW5nIGNtaXRtb2RlIGRpZmZpZHMKCiAgICB3aGlsZSB7W2dldHMgJGd0ZiBsaW5lXSA+PSAwfSB7CglpZiB7W2xpbmRleCAkbGluZSAxXSBuZSAiYmxvYiJ9IGNvbnRpbnVlCglzZXQgc2hhMSBbbGluZGV4ICRsaW5lIDJdCglzZXQgZm5hbWUgW2xpbmRleCAkbGluZSAzXQoJbGFwcGVuZCB0cmVlZmlsZWxpc3QoJGlkKSAkZm5hbWUKCWxhcHBlbmQgdHJlZWlkbGlzdCgkaWQpICRzaGExCiAgICB9CiAgICBpZiB7IVtlb2YgJGd0Zl19IHJldHVybgogICAgY2xvc2UgJGd0ZgogICAgdW5zZXQgdHJlZXBlbmRpbmcKICAgIGlmIHskY21pdG1vZGUgbmUgInRyZWUifSB7CglpZiB7IVtpbmZvIGV4aXN0cyBkaWZmbWVyZ2VpZF19IHsKCSAgICBnZXR0cmVlZGlmZnMgJGRpZmZpZHMKCX0KICAgIH0gZWxzZWlmIHskaWQgbmUgJGRpZmZpZHN9IHsKCWdldHRyZWUgJGRpZmZpZHMKICAgIH0gZWxzZSB7CglzZXRmaWxlbGlzdCAkaWQKICAgIH0KfQoKcHJvYyBzaG93ZmlsZSB7Zn0gewogICAgZ2xvYmFsIHRyZWVmaWxlbGlzdCB0cmVlaWRsaXN0IGRpZmZpZHMKICAgIGdsb2JhbCBjdGV4dCBjb21tZW50ZW5kCgogICAgc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICR0cmVlZmlsZWxpc3QoJGRpZmZpZHMpICRmXQogICAgaWYgeyRpIDwgMH0gewoJcHV0cyAib29wcywgJGYgbm90IGluIGxpc3QgZm9yIGlkICRkaWZmaWRzIgoJcmV0dXJuCiAgICB9CiAgICBzZXQgYmxvYiBbbGluZGV4ICR0cmVlaWRsaXN0KCRkaWZmaWRzKSAkaV0KICAgIGlmIHtbY2F0Y2gge3NldCBiZiBbb3BlbiBbY29uY2F0IHwgZ2l0IGNhdC1maWxlIGJsb2IgJGJsb2JdIHJdfSBlcnJdfSB7CglwdXRzICJvb3BzLCBlcnJvciByZWFkaW5nIGJsb2IgJGJsb2I6ICRlcnIiCglyZXR1cm4KICAgIH0KICAgIGZjb25maWd1cmUgJGJmIC1ibG9ja2luZyAwCiAgICBmaWxlZXZlbnQgJGJmIHJlYWRhYmxlIFtsaXN0IGdldGJsb2JsaW5lICRiZiAkZGlmZmlkc10KICAgICRjdGV4dCBjb25maWcgLXN0YXRlIG5vcm1hbAogICAgY2xlYXJfY3RleHQgJGNvbW1lbnRlbmQKICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiIKICAgICRjdGV4dCBpbnNlcnQgZW5kICIkZlxuIiBmaWxlc2VwCiAgICAkY3RleHQgY29uZmlnIC1zdGF0ZSBkaXNhYmxlZAogICAgJGN0ZXh0IHl2aWV3ICRjb21tZW50ZW5kCn0KCnByb2MgZ2V0YmxvYmxpbmUge2JmIGlkfSB7CiAgICBnbG9iYWwgZGlmZmlkcyBjbWl0bW9kZSBjdGV4dAoKICAgIGlmIHskaWQgbmUgJGRpZmZpZHMgfHwgJGNtaXRtb2RlIG5lICJ0cmVlIn0gewoJY2F0Y2gge2Nsb3NlICRiZn0KCXJldHVybgogICAgfQogICAgJGN0ZXh0IGNvbmZpZyAtc3RhdGUgbm9ybWFsCiAgICB3aGlsZSB7W2dldHMgJGJmIGxpbmVdID49IDB9IHsKCSRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIgogICAgfQogICAgaWYge1tlb2YgJGJmXX0gewoJIyBkZWxldGUgbGFzdCBuZXdsaW5lCgkkY3RleHQgZGVsZXRlICJlbmQgLSAyYyIgImVuZCAtIDFjIgoJY2xvc2UgJGJmCiAgICB9CiAgICAkY3RleHQgY29uZmlnIC1zdGF0ZSBkaXNhYmxlZAp9Cgpwcm9jIG1lcmdlZGlmZiB7aWQgbH0gewogICAgZ2xvYmFsIGRpZmZtZXJnZWlkIGRpZmZvcHRzIG1kaWZmZmQKICAgIGdsb2JhbCBkaWZmaWRzCiAgICBnbG9iYWwgcGFyZW50bGlzdAoKICAgIHNldCBkaWZmbWVyZ2VpZCAkaWQKICAgIHNldCBkaWZmaWRzICRpZAogICAgIyB0aGlzIGRvZXNuJ3Qgc2VlbSB0byBhY3R1YWxseSBhZmZlY3QgYW55dGhpbmcuLi4KICAgIHNldCBlbnYoR0lUX0RJRkZfT1BUUykgJGRpZmZvcHRzCiAgICBzZXQgY21kIFtjb25jYXQgfCBnaXQgZGlmZi10cmVlIC0tbm8tY29tbWl0LWlkIC0tY2MgJGlkXQogICAgaWYge1tjYXRjaCB7c2V0IG1kZiBbb3BlbiAkY21kIHJdfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3IgZ2V0dGluZyBtZXJnZSBkaWZmczogJGVyciIKCXJldHVybgogICAgfQogICAgZmNvbmZpZ3VyZSAkbWRmIC1ibG9ja2luZyAwCiAgICBzZXQgbWRpZmZmZCgkaWQpICRtZGYKICAgIHNldCBucCBbbGxlbmd0aCBbbGluZGV4ICRwYXJlbnRsaXN0ICRsXV0KICAgIGZpbGVldmVudCAkbWRmIHJlYWRhYmxlIFtsaXN0IGdldG1lcmdlZGlmZmxpbmUgJG1kZiAkaWQgJG5wXQogICAgc2V0IG5leHR1cGRhdGUgW2V4cHIge1tjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10gKyAxMDB9XQp9Cgpwcm9jIGdldG1lcmdlZGlmZmxpbmUge21kZiBpZCBucH0gewogICAgZ2xvYmFsIGRpZmZtZXJnZWlkIGN0ZXh0IGNmbGlzdCBuZXh0dXBkYXRlIG1lcmdlbWF4CiAgICBnbG9iYWwgZGlmZmZpbGVzdGFydCBtZGlmZmZkCgogICAgc2V0IG4gW2dldHMgJG1kZiBsaW5lXQogICAgaWYgeyRuIDwgMH0gewoJaWYge1tlb2YgJG1kZl19IHsKCSAgICBjbG9zZSAkbWRmCgl9CglyZXR1cm4KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIGRpZmZtZXJnZWlkXSB8fCAkaWQgIT0gJGRpZmZtZXJnZWlkCgl8fCAkbWRmICE9ICRtZGlmZmZkKCRpZCl9IHsKCXJldHVybgogICAgfQogICAgJGN0ZXh0IGNvbmYgLXN0YXRlIG5vcm1hbAogICAgaWYge1tyZWdleHAge15kaWZmIC0tY2MgKC4qKX0gJGxpbmUgbWF0Y2ggZm5hbWVdfSB7CgkjIHN0YXJ0IG9mIGEgbmV3IGZpbGUKCSRjdGV4dCBpbnNlcnQgZW5kICJcbiIKCXNldCBoZXJlIFskY3RleHQgaW5kZXggImVuZCAtIDFjIl0KCWxhcHBlbmQgZGlmZmZpbGVzdGFydCAkaGVyZQoJYWRkX2ZsaXN0IFtsaXN0ICRmbmFtZV0KCXNldCBsIFtleHByIHsoNzggLSBbc3RyaW5nIGxlbmd0aCAkZm5hbWVdKSAvIDJ9XQoJc2V0IHBhZCBbc3RyaW5nIHJhbmdlICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiAxICRsXQoJJGN0ZXh0IGluc2VydCBlbmQgIiRwYWQgJGZuYW1lICRwYWRcbiIgZmlsZXNlcAogICAgfSBlbHNlaWYge1tyZWdleHAge15AQH0gJGxpbmVdfSB7CgkkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgaHVua3NlcAogICAgfSBlbHNlaWYge1tyZWdleHAge15bMC05YS1mXXs0MH0kfSAkbGluZV0gfHwgW3JlZ2V4cCB7XmluZGV4fSAkbGluZV19IHsKCSMgZG8gbm90aGluZwogICAgfSBlbHNlIHsKCSMgcGFyc2UgdGhlIHByZWZpeCAtIG9uZSAnICcsICctJyBvciAnKycgZm9yIGVhY2ggcGFyZW50CglzZXQgc3BhY2VzIHt9CglzZXQgbWludXNlcyB7fQoJc2V0IHBsdXNlcyB7fQoJc2V0IGlzYmFkIDAKCWZvciB7c2V0IGogMH0geyRqIDwgJG5wfSB7aW5jciBqfSB7CgkgICAgc2V0IGMgW3N0cmluZyByYW5nZSAkbGluZSAkaiAkal0KCSAgICBpZiB7JGMgPT0gIiAifSB7CgkJbGFwcGVuZCBzcGFjZXMgJGoKCSAgICB9IGVsc2VpZiB7JGMgPT0gIi0ifSB7CgkJbGFwcGVuZCBtaW51c2VzICRqCgkgICAgfSBlbHNlaWYgeyRjID09ICIrIn0gewoJCWxhcHBlbmQgcGx1c2VzICRqCgkgICAgfSBlbHNlIHsKCQlzZXQgaXNiYWQgMQoJCWJyZWFrCgkgICAgfQoJfQoJc2V0IHRhZ3Mge30KCXNldCBudW0ge30KCWlmIHshJGlzYmFkICYmICRtaW51c2VzIG5lIHt9ICYmICRwbHVzZXMgZXEge319IHsKCSAgICAjIGxpbmUgZG9lc24ndCBhcHBlYXIgaW4gcmVzdWx0LCBwYXJlbnRzIGluICRtaW51c2VzIGhhdmUgdGhlIGxpbmUKCSAgICBzZXQgbnVtIFtsaW5kZXggJG1pbnVzZXMgMF0KCX0gZWxzZWlmIHshJGlzYmFkICYmICRwbHVzZXMgbmUge30gJiYgJG1pbnVzZXMgZXEge319IHsKCSAgICAjIGxpbmUgYXBwZWFycyBpbiByZXN1bHQsIHBhcmVudHMgaW4gJHBsdXNlcyBkb24ndCBoYXZlIHRoZSBsaW5lCgkgICAgbGFwcGVuZCB0YWdzIG1yZXN1bHQKCSAgICBzZXQgbnVtIFtsaW5kZXggJHNwYWNlcyAwXQoJfQoJaWYgeyRudW0gbmUge319IHsKCSAgICBpZiB7JG51bSA+PSAkbWVyZ2VtYXh9IHsKCQlzZXQgbnVtICJtYXgiCgkgICAgfQoJICAgIGxhcHBlbmQgdGFncyBtJG51bQoJfQoJJGN0ZXh0IGluc2VydCBlbmQgIiRsaW5lXG4iICR0YWdzCiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIGlmIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdID49ICRuZXh0dXBkYXRlfSB7CglpbmNyIG5leHR1cGRhdGUgMTAwCglmaWxlZXZlbnQgJG1kZiByZWFkYWJsZSB7fQoJdXBkYXRlCglmaWxlZXZlbnQgJG1kZiByZWFkYWJsZSBbbGlzdCBnZXRtZXJnZWRpZmZsaW5lICRtZGYgJGlkICRucF0KICAgIH0KfQoKcHJvYyBzdGFydGRpZmYge2lkc30gewogICAgZ2xvYmFsIHRyZWVkaWZmcyBkaWZmaWRzIHRyZWVwZW5kaW5nIGRpZmZtZXJnZWlkCgogICAgc2V0IGRpZmZpZHMgJGlkcwogICAgY2F0Y2gge3Vuc2V0IGRpZmZtZXJnZWlkfQogICAgaWYgeyFbaW5mbyBleGlzdHMgdHJlZWRpZmZzKCRpZHMpXX0gewoJaWYgeyFbaW5mbyBleGlzdHMgdHJlZXBlbmRpbmddfSB7CgkgICAgZ2V0dHJlZWRpZmZzICRpZHMKCX0KICAgIH0gZWxzZSB7CglhZGR0b2NmbGlzdCAkaWRzCiAgICB9Cn0KCnByb2MgYWRkdG9jZmxpc3Qge2lkc30gewogICAgZ2xvYmFsIHRyZWVkaWZmcyBjZmxpc3QKICAgIGFkZF9mbGlzdCAkdHJlZWRpZmZzKCRpZHMpCiAgICBnZXRibG9iZGlmZnMgJGlkcwp9Cgpwcm9jIGdldHRyZWVkaWZmcyB7aWRzfSB7CiAgICBnbG9iYWwgdHJlZWRpZmYgdHJlZXBlbmRpbmcKICAgIHNldCB0cmVlcGVuZGluZyAkaWRzCiAgICBzZXQgdHJlZWRpZmYge30KICAgIGlmIHtbY2F0Y2ggXAoJIHtzZXQgZ2R0ZiBbb3BlbiBbY29uY2F0IHwgZ2l0IGRpZmYtdHJlZSAtLW5vLWNvbW1pdC1pZCAtciAkaWRzXSByXX0gXAoJXX0gcmV0dXJuCiAgICBmY29uZmlndXJlICRnZHRmIC1ibG9ja2luZyAwCiAgICBmaWxlZXZlbnQgJGdkdGYgcmVhZGFibGUgW2xpc3QgZ2V0dHJlZWRpZmZsaW5lICRnZHRmICRpZHNdCn0KCnByb2MgZ2V0dHJlZWRpZmZsaW5lIHtnZHRmIGlkc30gewogICAgZ2xvYmFsIHRyZWVkaWZmIHRyZWVkaWZmcyB0cmVlcGVuZGluZyBkaWZmaWRzIGRpZmZtZXJnZWlkCiAgICBnbG9iYWwgY21pdG1vZGUKCiAgICBzZXQgbiBbZ2V0cyAkZ2R0ZiBsaW5lXQogICAgaWYgeyRuIDwgMH0gewoJaWYgeyFbZW9mICRnZHRmXX0gcmV0dXJuCgljbG9zZSAkZ2R0ZgoJc2V0IHRyZWVkaWZmcygkaWRzKSAkdHJlZWRpZmYKCXVuc2V0IHRyZWVwZW5kaW5nCglpZiB7JGNtaXRtb2RlIGVxICJ0cmVlIn0gewoJICAgIGdldHRyZWUgJGRpZmZpZHMKCX0gZWxzZWlmIHskaWRzICE9ICRkaWZmaWRzfSB7CgkgICAgaWYgeyFbaW5mbyBleGlzdHMgZGlmZm1lcmdlaWRdfSB7CgkJZ2V0dHJlZWRpZmZzICRkaWZmaWRzCgkgICAgfQoJfSBlbHNlIHsKCSAgICBhZGR0b2NmbGlzdCAkaWRzCgl9CglyZXR1cm4KICAgIH0KICAgIHNldCBmaWxlIFtsaW5kZXggJGxpbmUgNV0KICAgIGxhcHBlbmQgdHJlZWRpZmYgJGZpbGUKfQoKcHJvYyBnZXRibG9iZGlmZnMge2lkc30gewogICAgZ2xvYmFsIGRpZmZvcHRzIGJsb2JkaWZmZmQgZGlmZmlkcyBlbnYgY3VyZGlmZnRhZyBjdXJ0YWdzdGFydAogICAgZ2xvYmFsIG5leHR1cGRhdGUgZGlmZmluaGRyIHRyZWVkaWZmcwoKICAgIHNldCBlbnYoR0lUX0RJRkZfT1BUUykgJGRpZmZvcHRzCiAgICBzZXQgY21kIFtjb25jYXQgfCBnaXQgZGlmZi10cmVlIC0tbm8tY29tbWl0LWlkIC1yIC1wIC1DICRpZHNdCiAgICBpZiB7W2NhdGNoIHtzZXQgYmRmIFtvcGVuICRjbWQgcl19IGVycl19IHsKCXB1dHMgImVycm9yIGdldHRpbmcgZGlmZnM6ICRlcnIiCglyZXR1cm4KICAgIH0KICAgIHNldCBkaWZmaW5oZHIgMAogICAgZmNvbmZpZ3VyZSAkYmRmIC1ibG9ja2luZyAwCiAgICBzZXQgYmxvYmRpZmZmZCgkaWRzKSAkYmRmCiAgICBzZXQgY3VyZGlmZnRhZyBDb21tZW50cwogICAgc2V0IGN1cnRhZ3N0YXJ0IDAuMAogICAgZmlsZWV2ZW50ICRiZGYgcmVhZGFibGUgW2xpc3QgZ2V0YmxvYmRpZmZsaW5lICRiZGYgJGRpZmZpZHNdCiAgICBzZXQgbmV4dHVwZGF0ZSBbZXhwciB7W2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXSArIDEwMH1dCn0KCnByb2Mgc2V0aW5saXN0IHt2YXIgaSB2YWx9IHsKICAgIGdsb2JhbCAkdmFyCgogICAgd2hpbGUge1tsbGVuZ3RoIFtzZXQgJHZhcl1dIDwgJGl9IHsKCWxhcHBlbmQgJHZhciB7fQogICAgfQogICAgaWYge1tsbGVuZ3RoIFtzZXQgJHZhcl1dID09ICRpfSB7CglsYXBwZW5kICR2YXIgJHZhbAogICAgfSBlbHNlIHsKCWxzZXQgJHZhciAkaSAkdmFsCiAgICB9Cn0KCnByb2MgZ2V0YmxvYmRpZmZsaW5lIHtiZGYgaWRzfSB7CiAgICBnbG9iYWwgZGlmZmlkcyBibG9iZGlmZmZkIGN0ZXh0IGN1cmRpZmZ0YWcgY3VydGFnc3RhcnQKICAgIGdsb2JhbCBkaWZmbmV4dGhlYWQgZGlmZm5leHRub3RlIGRpZmZmaWxlc3RhcnQKICAgIGdsb2JhbCBuZXh0dXBkYXRlIGRpZmZpbmhkciB0cmVlZGlmZnMKCiAgICBzZXQgbiBbZ2V0cyAkYmRmIGxpbmVdCiAgICBpZiB7JG4gPCAwfSB7CglpZiB7W2VvZiAkYmRmXX0gewoJICAgIGNsb3NlICRiZGYKCSAgICBpZiB7JGlkcyA9PSAkZGlmZmlkcyAmJiAkYmRmID09ICRibG9iZGlmZmZkKCRpZHMpfSB7CgkJJGN0ZXh0IHRhZyBhZGQgJGN1cmRpZmZ0YWcgJGN1cnRhZ3N0YXJ0IGVuZAoJICAgIH0KCX0KCXJldHVybgogICAgfQogICAgaWYgeyRpZHMgIT0gJGRpZmZpZHMgfHwgJGJkZiAhPSAkYmxvYmRpZmZmZCgkaWRzKX0gewoJcmV0dXJuCiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBpZiB7W3JlZ2V4cCB7XmRpZmYgLS1naXQgYS8oLiopIGIvKC4qKX0gJGxpbmUgbWF0Y2ggZm5hbWUgbmV3bmFtZV19IHsKCSMgc3RhcnQgb2YgYSBuZXcgZmlsZQoJJGN0ZXh0IGluc2VydCBlbmQgIlxuIgoJJGN0ZXh0IHRhZyBhZGQgJGN1cmRpZmZ0YWcgJGN1cnRhZ3N0YXJ0IGVuZAoJc2V0IGhlcmUgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJc2V0IGN1cnRhZ3N0YXJ0ICRoZXJlCglzZXQgaGVhZGVyICRuZXduYW1lCglzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJHRyZWVkaWZmcygkaWRzKSAkZm5hbWVdCglpZiB7JGkgPj0gMH0gewoJICAgIHNldGlubGlzdCBkaWZmZmlsZXN0YXJ0ICRpICRoZXJlCgl9CglpZiB7JG5ld25hbWUgbmUgJGZuYW1lfSB7CgkgICAgc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICR0cmVlZGlmZnMoJGlkcykgJG5ld25hbWVdCgkgICAgaWYgeyRpID49IDB9IHsKCQlzZXRpbmxpc3QgZGlmZmZpbGVzdGFydCAkaSAkaGVyZQoJICAgIH0KCX0KCXNldCBjdXJkaWZmdGFnICJmOiRmbmFtZSIKCSRjdGV4dCB0YWcgZGVsZXRlICRjdXJkaWZmdGFnCglzZXQgbCBbZXhwciB7KDc4IC0gW3N0cmluZyBsZW5ndGggJGhlYWRlcl0pIC8gMn1dCglzZXQgcGFkIFtzdHJpbmcgcmFuZ2UgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIDEgJGxdCgkkY3RleHQgaW5zZXJ0IGVuZCAiJHBhZCAkaGVhZGVyICRwYWRcbiIgZmlsZXNlcAoJc2V0IGRpZmZpbmhkciAxCiAgICB9IGVsc2VpZiB7JGRpZmZpbmhkciAmJiBbc3RyaW5nIGNvbXBhcmUgLWxlbmd0aCAzICRsaW5lICItLS0iXSA9PSAwfSB7CgkjIGRvIG5vdGhpbmcKICAgIH0gZWxzZWlmIHskZGlmZmluaGRyICYmIFtzdHJpbmcgY29tcGFyZSAtbGVuZ3RoIDMgJGxpbmUgIisrKyJdID09IDB9IHsKCXNldCBkaWZmaW5oZHIgMAogICAgfSBlbHNlaWYge1tyZWdleHAge15AQCAtKFswLTldKyksKFswLTldKykgXCsoWzAtOV0rKSwoWzAtOV0rKSBAQCguKil9IFwKCQkgICAkbGluZSBtYXRjaCBmMWwgZjFjIGYybCBmMmMgcmVzdF19IHsKCSRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBodW5rc2VwCglzZXQgZGlmZmluaGRyIDAKICAgIH0gZWxzZSB7CglzZXQgeCBbc3RyaW5nIHJhbmdlICRsaW5lIDAgMF0KCWlmIHskeCA9PSAiLSIgfHwgJHggPT0gIisifSB7CgkgICAgc2V0IHRhZyBbZXhwciB7JHggPT0gIisifV0KCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgZCR0YWcKCX0gZWxzZWlmIHskeCA9PSAiICJ9IHsKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIKCX0gZWxzZWlmIHskZGlmZmluaGRyIHx8ICR4ID09ICJcXCJ9IHsKCSAgICAjIGUuZy4gIlwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZSIKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiJGxpbmVcbiIgZmlsZXNlcAoJfSBlbHNlIHsKCSAgICAjIFNvbWV0aGluZyBlbHNlIHdlIGRvbid0IHJlY29nbml6ZQoJICAgIGlmIHskY3VyZGlmZnRhZyAhPSAiQ29tbWVudHMifSB7CgkJJGN0ZXh0IGluc2VydCBlbmQgIlxuIgoJCSRjdGV4dCB0YWcgYWRkICRjdXJkaWZmdGFnICRjdXJ0YWdzdGFydCBlbmQKCQlzZXQgY3VydGFnc3RhcnQgWyRjdGV4dCBpbmRleCAiZW5kIC0gMWMiXQoJCXNldCBjdXJkaWZmdGFnIENvbW1lbnRzCgkgICAgfQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICIkbGluZVxuIiBmaWxlc2VwCgl9CiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIGlmIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdID49ICRuZXh0dXBkYXRlfSB7CglpbmNyIG5leHR1cGRhdGUgMTAwCglmaWxlZXZlbnQgJGJkZiByZWFkYWJsZSB7fQoJdXBkYXRlCglmaWxlZXZlbnQgJGJkZiByZWFkYWJsZSAiZ2V0YmxvYmRpZmZsaW5lICRiZGYgeyRpZHN9IgogICAgfQp9Cgpwcm9jIG5leHRmaWxlIHt9IHsKICAgIGdsb2JhbCBkaWZmZmlsZXN0YXJ0IGN0ZXh0CiAgICBzZXQgaGVyZSBbJGN0ZXh0IGluZGV4IEAwLDBdCiAgICBmb3JlYWNoIGxvYyAkZGlmZmZpbGVzdGFydCB7CglpZiB7WyRjdGV4dCBjb21wYXJlICRsb2MgPiAkaGVyZV19IHsKCSAgICAkY3RleHQgeXZpZXcgJGxvYwoJfQogICAgfQp9Cgpwcm9jIGNsZWFyX2N0ZXh0IHt7Zmlyc3QgMS4wfX0gewogICAgZ2xvYmFsIGN0ZXh0IHNtYXJrdG9wIHNtYXJrYm90CgogICAgc2V0IGwgW2xpbmRleCBbc3BsaXQgJGZpcnN0IC5dIDBdCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzbWFya3RvcF0gfHwgWyRjdGV4dCBjb21wYXJlICRmaXJzdCA8ICRzbWFya3RvcC4wXX0gewoJc2V0IHNtYXJrdG9wICRsCiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzbWFya2JvdF0gfHwgWyRjdGV4dCBjb21wYXJlICRmaXJzdCA8ICRzbWFya2JvdC4wXX0gewoJc2V0IHNtYXJrYm90ICRsCiAgICB9CiAgICAkY3RleHQgZGVsZXRlICRmaXJzdCBlbmQKfQoKcHJvYyBpbmNyc2VhcmNoIHtuYW1lIGl4IG9wfSB7CiAgICBnbG9iYWwgY3RleHQgc2VhcmNoc3RyaW5nIHNlYXJjaGRpcm4KCiAgICAkY3RleHQgdGFnIHJlbW92ZSBmb3VuZCAxLjAgZW5kCiAgICBpZiB7W2NhdGNoIHskY3RleHQgaW5kZXggYW5jaG9yfV19IHsKCSMgbm8gYW5jaG9yIHNldCwgdXNlIHN0YXJ0IG9mIHNlbGVjdGlvbiwgb3Igb2YgdmlzaWJsZSBhcmVhCglzZXQgc2VsIFskY3RleHQgdGFnIHJhbmdlcyBzZWxdCglpZiB7JHNlbCBuZSB7fX0gewoJICAgICRjdGV4dCBtYXJrIHNldCBhbmNob3IgW2xpbmRleCAkc2VsIDBdCgl9IGVsc2VpZiB7JHNlYXJjaGRpcm4gZXEgIi1mb3J3YXJkcyJ9IHsKCSAgICAkY3RleHQgbWFyayBzZXQgYW5jaG9yIEAwLDAKCX0gZWxzZSB7CgkgICAgJGN0ZXh0IG1hcmsgc2V0IGFuY2hvciBAMCxbd2luZm8gaGVpZ2h0ICRjdGV4dF0KCX0KICAgIH0KICAgIGlmIHskc2VhcmNoc3RyaW5nIG5lIHt9fSB7CglzZXQgaGVyZSBbJGN0ZXh0IHNlYXJjaCAkc2VhcmNoZGlybiAtLSAkc2VhcmNoc3RyaW5nIGFuY2hvcl0KCWlmIHskaGVyZSBuZSB7fX0gewoJICAgICRjdGV4dCBzZWUgJGhlcmUKCX0KCXNlYXJjaG1hcmt2aXNpYmxlIDEKICAgIH0KfQoKcHJvYyBkb3NlYXJjaCB7fSB7CiAgICBnbG9iYWwgc3N0cmluZyBjdGV4dCBzZWFyY2hzdHJpbmcgc2VhcmNoZGlybgoKICAgIGZvY3VzICRzc3RyaW5nCiAgICAkc3N0cmluZyBpY3Vyc29yIGVuZAogICAgc2V0IHNlYXJjaGRpcm4gLWZvcndhcmRzCiAgICBpZiB7JHNlYXJjaHN0cmluZyBuZSB7fX0gewoJc2V0IHNlbCBbJGN0ZXh0IHRhZyByYW5nZXMgc2VsXQoJaWYgeyRzZWwgbmUge319IHsKCSAgICBzZXQgc3RhcnQgIltsaW5kZXggJHNlbCAwXSArIDFjIgoJfSBlbHNlaWYge1tjYXRjaCB7c2V0IHN0YXJ0IFskY3RleHQgaW5kZXggYW5jaG9yXX1dfSB7CgkgICAgc2V0IHN0YXJ0ICJAMCwwIgoJfQoJc2V0IG1hdGNoIFskY3RleHQgc2VhcmNoIC1jb3VudCBtbGVuIC0tICRzZWFyY2hzdHJpbmcgJHN0YXJ0XQoJJGN0ZXh0IHRhZyByZW1vdmUgc2VsIDEuMCBlbmQKCWlmIHskbWF0Y2ggZXEge319IHsKCSAgICBiZWxsCgkgICAgcmV0dXJuCgl9CgkkY3RleHQgc2VlICRtYXRjaAoJc2V0IG1lbmQgIiRtYXRjaCArICRtbGVuIGMiCgkkY3RleHQgdGFnIGFkZCBzZWwgJG1hdGNoICRtZW5kCgkkY3RleHQgbWFyayB1bnNldCBhbmNob3IKICAgIH0KfQoKcHJvYyBkb3NlYXJjaGJhY2sge30gewogICAgZ2xvYmFsIHNzdHJpbmcgY3RleHQgc2VhcmNoc3RyaW5nIHNlYXJjaGRpcm4KCiAgICBmb2N1cyAkc3N0cmluZwogICAgJHNzdHJpbmcgaWN1cnNvciBlbmQKICAgIHNldCBzZWFyY2hkaXJuIC1iYWNrd2FyZHMKICAgIGlmIHskc2VhcmNoc3RyaW5nIG5lIHt9fSB7CglzZXQgc2VsIFskY3RleHQgdGFnIHJhbmdlcyBzZWxdCglpZiB7JHNlbCBuZSB7fX0gewoJICAgIHNldCBzdGFydCBbbGluZGV4ICRzZWwgMF0KCX0gZWxzZWlmIHtbY2F0Y2gge3NldCBzdGFydCBbJGN0ZXh0IGluZGV4IGFuY2hvcl19XX0gewoJICAgIHNldCBzdGFydCBAMCxbd2luZm8gaGVpZ2h0ICRjdGV4dF0KCX0KCXNldCBtYXRjaCBbJGN0ZXh0IHNlYXJjaCAtYmFja3dhcmRzIC1jb3VudCBtbCAtLSAkc2VhcmNoc3RyaW5nICRzdGFydF0KCSRjdGV4dCB0YWcgcmVtb3ZlIHNlbCAxLjAgZW5kCglpZiB7JG1hdGNoIGVxIHt9fSB7CgkgICAgYmVsbAoJICAgIHJldHVybgoJfQoJJGN0ZXh0IHNlZSAkbWF0Y2gKCXNldCBtZW5kICIkbWF0Y2ggKyAkbWwgYyIKCSRjdGV4dCB0YWcgYWRkIHNlbCAkbWF0Y2ggJG1lbmQKCSRjdGV4dCBtYXJrIHVuc2V0IGFuY2hvcgogICAgfQp9Cgpwcm9jIHNlYXJjaG1hcmsge2ZpcnN0IGxhc3R9IHsKICAgIGdsb2JhbCBjdGV4dCBzZWFyY2hzdHJpbmcKCiAgICBzZXQgbWVuZCAkZmlyc3QuMAogICAgd2hpbGUgezF9IHsKCXNldCBtYXRjaCBbJGN0ZXh0IHNlYXJjaCAtY291bnQgbWxlbiAtLSAkc2VhcmNoc3RyaW5nICRtZW5kICRsYXN0LmVuZF0KCWlmIHskbWF0Y2ggZXEge319IGJyZWFrCglzZXQgbWVuZCAiJG1hdGNoICsgJG1sZW4gYyIKCSRjdGV4dCB0YWcgYWRkIGZvdW5kICRtYXRjaCAkbWVuZAogICAgfQp9Cgpwcm9jIHNlYXJjaG1hcmt2aXNpYmxlIHtkb2FsbH0gewogICAgZ2xvYmFsIGN0ZXh0IHNtYXJrdG9wIHNtYXJrYm90CgogICAgc2V0IHRvcGxpbmUgW2xpbmRleCBbc3BsaXQgWyRjdGV4dCBpbmRleCBAMCwwXSAuXSAwXQogICAgc2V0IGJvdGxpbmUgW2xpbmRleCBbc3BsaXQgWyRjdGV4dCBpbmRleCBAMCxbd2luZm8gaGVpZ2h0ICRjdGV4dF1dIC5dIDBdCiAgICBpZiB7JGRvYWxsIHx8ICRib3RsaW5lIDwgJHNtYXJrdG9wIHx8ICR0b3BsaW5lID4gJHNtYXJrYm90fSB7CgkjIG5vIG92ZXJsYXAgd2l0aCBwcmV2aW91cwoJc2VhcmNobWFyayAkdG9wbGluZSAkYm90bGluZQoJc2V0IHNtYXJrdG9wICR0b3BsaW5lCglzZXQgc21hcmtib3QgJGJvdGxpbmUKICAgIH0gZWxzZSB7CglpZiB7JHRvcGxpbmUgPCAkc21hcmt0b3B9IHsKCSAgICBzZWFyY2htYXJrICR0b3BsaW5lIFtleHByIHskc21hcmt0b3AtMX1dCgkgICAgc2V0IHNtYXJrdG9wICR0b3BsaW5lCgl9CglpZiB7JGJvdGxpbmUgPiAkc21hcmtib3R9IHsKCSAgICBzZWFyY2htYXJrIFtleHByIHskc21hcmtib3QrMX1dICRib3RsaW5lCgkgICAgc2V0IHNtYXJrYm90ICRib3RsaW5lCgl9CiAgICB9Cn0KCnByb2Mgc2Nyb2xsdGV4dCB7ZjAgZjF9IHsKICAgIGdsb2JhbCBzZWFyY2hzdHJpbmcKCiAgICAuY3RvcC5jZGV0LmxlZnQuc2Igc2V0ICRmMCAkZjEKICAgIGlmIHskc2VhcmNoc3RyaW5nIG5lIHt9fSB7CglzZWFyY2htYXJrdmlzaWJsZSAwCiAgICB9Cn0KCnByb2Mgc2V0Y29vcmRzIHt9IHsKICAgIGdsb2JhbCBsaW5lc3BjIGNoYXJzcGMgY2FudngwIGNhbnZ5MCBtYWluZm9udAogICAgZ2xvYmFsIHhzcGMxIHhzcGMyIGx0aGlja25lc3MKCiAgICBzZXQgbGluZXNwYyBbZm9udCBtZXRyaWNzICRtYWluZm9udCAtbGluZXNwYWNlXQogICAgc2V0IGNoYXJzcGMgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgIm0iXQogICAgc2V0IGNhbnZ5MCBbZXhwciB7aW50KDMgKyAwLjUgKiAkbGluZXNwYyl9XQogICAgc2V0IGNhbnZ4MCBbZXhwciB7aW50KDMgKyAwLjUgKiAkbGluZXNwYyl9XQogICAgc2V0IGx0aGlja25lc3MgW2V4cHIge2ludCgkbGluZXNwYyAvIDkpICsgMX1dCiAgICBzZXQgeHNwYzEoMCkgJGxpbmVzcGMKICAgIHNldCB4c3BjMiAkbGluZXNwYwp9Cgpwcm9jIHJlZGlzcGxheSB7fSB7CiAgICBnbG9iYWwgY2FudgogICAgZ2xvYmFsIHNlbGVjdGVkbGluZQoKICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIGlmIHskeW1heCBlcSB7fSB8fCAkeW1heCA9PSAwfSByZXR1cm4KICAgIHNldCBzcGFuIFskY2FudiB5dmlld10KICAgIGNsZWFyX2Rpc3BsYXkKICAgIHNldGNhbnZzY3JvbGwKICAgIGFsbGNhbnZzIHl2aWV3IG1vdmV0byBbbGluZGV4ICRzcGFuIDBdCiAgICBkcmF3dmlzaWJsZQogICAgaWYge1tpbmZvIGV4aXN0cyBzZWxlY3RlZGxpbmVdfSB7CglzZWxlY3RsaW5lICRzZWxlY3RlZGxpbmUgMAogICAgfQp9Cgpwcm9jIGluY3Jmb250IHtpbmN9IHsKICAgIGdsb2JhbCBtYWluZm9udCB0ZXh0Zm9udCBjdGV4dCBjYW52IHBoYXNlCiAgICBnbG9iYWwgc3RvcHBlZCBlbnRyaWVzCiAgICB1bm1hcmttYXRjaGVzCiAgICBzZXQgbWFpbmZvbnQgW2xyZXBsYWNlICRtYWluZm9udCAxIDEgW2V4cHIge1tsaW5kZXggJG1haW5mb250IDFdICsgJGluY31dXQogICAgc2V0IHRleHRmb250IFtscmVwbGFjZSAkdGV4dGZvbnQgMSAxIFtleHByIHtbbGluZGV4ICR0ZXh0Zm9udCAxXSArICRpbmN9XV0KICAgIHNldGNvb3JkcwogICAgJGN0ZXh0IGNvbmYgLWZvbnQgJHRleHRmb250CiAgICAkY3RleHQgdGFnIGNvbmYgZmlsZXNlcCAtZm9udCBbY29uY2F0ICR0ZXh0Zm9udCBib2xkXQogICAgZm9yZWFjaCBlICRlbnRyaWVzIHsKCSRlIGNvbmYgLWZvbnQgJG1haW5mb250CiAgICB9CiAgICBpZiB7JHBoYXNlIGVxICJnZXRjb21taXRzIn0gewoJJGNhbnYgaXRlbWNvbmYgdGV4dGl0ZW1zIC1mb250ICRtYWluZm9udAogICAgfQogICAgcmVkaXNwbGF5Cn0KCnByb2MgY2xlYXJzaGExIHt9IHsKICAgIGdsb2JhbCBzaGExZW50cnkgc2hhMXN0cmluZwogICAgaWYge1tzdHJpbmcgbGVuZ3RoICRzaGExc3RyaW5nXSA9PSA0MH0gewoJJHNoYTFlbnRyeSBkZWxldGUgMCBlbmQKICAgIH0KfQoKcHJvYyBzaGExY2hhbmdlIHtuMSBuMiBvcH0gewogICAgZ2xvYmFsIHNoYTFzdHJpbmcgY3VycmVudGlkIHNoYTFidXQKICAgIGlmIHskc2hhMXN0cmluZyA9PSB7fQoJfHwgKFtpbmZvIGV4aXN0cyBjdXJyZW50aWRdICYmICRzaGExc3RyaW5nID09ICRjdXJyZW50aWQpfSB7CglzZXQgc3RhdGUgZGlzYWJsZWQKICAgIH0gZWxzZSB7CglzZXQgc3RhdGUgbm9ybWFsCiAgICB9CiAgICBpZiB7WyRzaGExYnV0IGNnZXQgLXN0YXRlXSA9PSAkc3RhdGV9IHJldHVybgogICAgaWYgeyRzdGF0ZSA9PSAibm9ybWFsIn0gewoJJHNoYTFidXQgY29uZiAtc3RhdGUgbm9ybWFsIC1yZWxpZWYgcmFpc2VkIC10ZXh0ICJHb3RvOiAiCiAgICB9IGVsc2UgewoJJHNoYTFidXQgY29uZiAtc3RhdGUgZGlzYWJsZWQgLXJlbGllZiBmbGF0IC10ZXh0ICJTSEExIElEOiAiCiAgICB9Cn0KCnByb2MgZ290b2NvbW1pdCB7fSB7CiAgICBnbG9iYWwgc2hhMXN0cmluZyBjdXJyZW50aWQgY29tbWl0cm93IHRhZ2lkcyBoZWFkaWRzCiAgICBnbG9iYWwgZGlzcGxheW9yZGVyIG51bWNvbW1pdHMgY3VydmlldwoKICAgIGlmIHskc2hhMXN0cmluZyA9PSB7fQoJfHwgKFtpbmZvIGV4aXN0cyBjdXJyZW50aWRdICYmICRzaGExc3RyaW5nID09ICRjdXJyZW50aWQpfSByZXR1cm4KICAgIGlmIHtbaW5mbyBleGlzdHMgdGFnaWRzKCRzaGExc3RyaW5nKV19IHsKCXNldCBpZCAkdGFnaWRzKCRzaGExc3RyaW5nKQogICAgfSBlbHNlaWYge1tpbmZvIGV4aXN0cyBoZWFkaWRzKCRzaGExc3RyaW5nKV19IHsKCXNldCBpZCAkaGVhZGlkcygkc2hhMXN0cmluZykKICAgIH0gZWxzZSB7CglzZXQgaWQgW3N0cmluZyB0b2xvd2VyICRzaGExc3RyaW5nXQoJaWYge1tyZWdleHAge15bMC05YS1mXXs0LDM5fSR9ICRpZF19IHsKCSAgICBzZXQgbWF0Y2hlcyB7fQoJICAgIGZvcmVhY2ggaSAkZGlzcGxheW9yZGVyIHsKCQlpZiB7W3N0cmluZyBtYXRjaCAkaWQqICRpXX0gewoJCSAgICBsYXBwZW5kIG1hdGNoZXMgJGkKCQl9CgkgICAgfQoJICAgIGlmIHskbWF0Y2hlcyBuZSB7fX0gewoJCWlmIHtbbGxlbmd0aCAkbWF0Y2hlc10gPiAxfSB7CgkJICAgIGVycm9yX3BvcHVwICJTaG9ydCBTSEExIGlkICRpZCBpcyBhbWJpZ3VvdXMiCgkJICAgIHJldHVybgoJCX0KCQlzZXQgaWQgW2xpbmRleCAkbWF0Y2hlcyAwXQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgY29tbWl0cm93KCRjdXJ2aWV3LCRpZCldfSB7CglzZWxlY3RsaW5lICRjb21taXRyb3coJGN1cnZpZXcsJGlkKSAxCglyZXR1cm4KICAgIH0KICAgIGlmIHtbcmVnZXhwIHteWzAtOWEtZkEtRl17NCx9JH0gJHNoYTFzdHJpbmddfSB7CglzZXQgdHlwZSAiU0hBMSBpZCIKICAgIH0gZWxzZSB7CglzZXQgdHlwZSAiVGFnL0hlYWQiCiAgICB9CiAgICBlcnJvcl9wb3B1cCAiJHR5cGUgJHNoYTFzdHJpbmcgaXMgbm90IGtub3duIgp9Cgpwcm9jIGxpbmVlbnRlciB7eCB5IGlkfSB7CiAgICBnbG9iYWwgaG92ZXJ4IGhvdmVyeSBob3ZlcmlkIGhvdmVydGltZXIKICAgIGdsb2JhbCBjb21taXRpbmZvIGNhbnYKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldICYmICFbZ2V0Y29tbWl0ICRpZF19IHJldHVybgogICAgc2V0IGhvdmVyeCAkeAogICAgc2V0IGhvdmVyeSAkeQogICAgc2V0IGhvdmVyaWQgJGlkCiAgICBpZiB7W2luZm8gZXhpc3RzIGhvdmVydGltZXJdfSB7CglhZnRlciBjYW5jZWwgJGhvdmVydGltZXIKICAgIH0KICAgIHNldCBob3ZlcnRpbWVyIFthZnRlciA1MDAgbGluZWhvdmVyXQogICAgJGNhbnYgZGVsZXRlIGhvdmVyCn0KCnByb2MgbGluZW1vdGlvbiB7eCB5IGlkfSB7CiAgICBnbG9iYWwgaG92ZXJ4IGhvdmVyeSBob3ZlcmlkIGhvdmVydGltZXIKCiAgICBpZiB7W2luZm8gZXhpc3RzIGhvdmVyaWRdICYmICRpZCA9PSAkaG92ZXJpZH0gewoJc2V0IGhvdmVyeCAkeAoJc2V0IGhvdmVyeSAkeQoJaWYge1tpbmZvIGV4aXN0cyBob3ZlcnRpbWVyXX0gewoJICAgIGFmdGVyIGNhbmNlbCAkaG92ZXJ0aW1lcgoJfQoJc2V0IGhvdmVydGltZXIgW2FmdGVyIDUwMCBsaW5laG92ZXJdCiAgICB9Cn0KCnByb2MgbGluZWxlYXZlIHtpZH0gewogICAgZ2xvYmFsIGhvdmVyaWQgaG92ZXJ0aW1lciBjYW52CgogICAgaWYge1tpbmZvIGV4aXN0cyBob3ZlcmlkXSAmJiAkaWQgPT0gJGhvdmVyaWR9IHsKCSRjYW52IGRlbGV0ZSBob3ZlcgoJaWYge1tpbmZvIGV4aXN0cyBob3ZlcnRpbWVyXX0gewoJICAgIGFmdGVyIGNhbmNlbCAkaG92ZXJ0aW1lcgoJICAgIHVuc2V0IGhvdmVydGltZXIKCX0KCXVuc2V0IGhvdmVyaWQKICAgIH0KfQoKcHJvYyBsaW5laG92ZXIge30gewogICAgZ2xvYmFsIGhvdmVyeCBob3ZlcnkgaG92ZXJpZCBob3ZlcnRpbWVyCiAgICBnbG9iYWwgY2FudiBsaW5lc3BjIGx0aGlja25lc3MKICAgIGdsb2JhbCBjb21taXRpbmZvIG1haW5mb250CgogICAgc2V0IHRleHQgW2xpbmRleCAkY29tbWl0aW5mbygkaG92ZXJpZCkgMF0KICAgIHNldCB5bWF4IFtsaW5kZXggWyRjYW52IGNnZXQgLXNjcm9sbHJlZ2lvbl0gM10KICAgIGlmIHskeW1heCA9PSB7fX0gcmV0dXJuCiAgICBzZXQgeWZyYWMgW2xpbmRleCBbJGNhbnYgeXZpZXddIDBdCiAgICBzZXQgeCBbZXhwciB7JGhvdmVyeCArIDIgKiAkbGluZXNwY31dCiAgICBzZXQgeSBbZXhwciB7JGhvdmVyeSArICR5ZnJhYyAqICR5bWF4IC0gJGxpbmVzcGMgLyAyfV0KICAgIHNldCB4MCBbZXhwciB7JHggLSAyICogJGx0aGlja25lc3N9XQogICAgc2V0IHkwIFtleHByIHskeSAtIDIgKiAkbHRoaWNrbmVzc31dCiAgICBzZXQgeDEgW2V4cHIgeyR4ICsgW2ZvbnQgbWVhc3VyZSAkbWFpbmZvbnQgJHRleHRdICsgMiAqICRsdGhpY2tuZXNzfV0KICAgIHNldCB5MSBbZXhwciB7JHkgKyAkbGluZXNwYyArIDIgKiAkbHRoaWNrbmVzc31dCiAgICBzZXQgdCBbJGNhbnYgY3JlYXRlIHJlY3RhbmdsZSAkeDAgJHkwICR4MSAkeTEgXAoJICAgICAgIC1maWxsIFwjZmZmZjgwIC1vdXRsaW5lIGJsYWNrIC13aWR0aCAxIC10YWdzIGhvdmVyXQogICAgJGNhbnYgcmFpc2UgJHQKICAgIHNldCB0IFskY2FudiBjcmVhdGUgdGV4dCAkeCAkeSAtYW5jaG9yIG53IC10ZXh0ICR0ZXh0IC10YWdzIGhvdmVyIFwKCSAgICAgICAtZm9udCAkbWFpbmZvbnRdCiAgICAkY2FudiByYWlzZSAkdAp9Cgpwcm9jIGNsaWNraXNvbmFycm93IHtpZCB5fSB7CiAgICBnbG9iYWwgbHRoaWNrbmVzcwoKICAgIHNldCByYW5nZXMgW3Jvd3JhbmdlcyAkaWRdCiAgICBzZXQgdGhyZXNoIFtleHByIHsyICogJGx0aGlja25lc3MgKyA2fV0KICAgIHNldCBuIFtleHByIHtbbGxlbmd0aCAkcmFuZ2VzXSAtIDF9XQogICAgZm9yIHtzZXQgaSAxfSB7JGkgPCAkbn0ge2luY3IgaX0gewoJc2V0IHJvdyBbbGluZGV4ICRyYW5nZXMgJGldCglpZiB7YWJzKFt5YyAkcm93XSAtICR5KSA8ICR0aHJlc2h9IHsKCSAgICByZXR1cm4gJGkKCX0KICAgIH0KICAgIHJldHVybiB7fQp9Cgpwcm9jIGFycm93anVtcCB7aWQgbiB5fSB7CiAgICBnbG9iYWwgY2FudgoKICAgICMgMSA8LT4gMiwgMyA8LT4gNCwgZXRjLi4uCiAgICBzZXQgbiBbZXhwciB7KCgkbiAtIDEpIF4gMSkgKyAxfV0KICAgIHNldCByb3cgW2xpbmRleCBbcm93cmFuZ2VzICRpZF0gJG5dCiAgICBzZXQgeXQgW3ljICRyb3ddCiAgICBzZXQgeW1heCBbbGluZGV4IFskY2FudiBjZ2V0IC1zY3JvbGxyZWdpb25dIDNdCiAgICBpZiB7JHltYXggZXEge30gfHwgJHltYXggPD0gMH0gcmV0dXJuCiAgICBzZXQgdmlldyBbJGNhbnYgeXZpZXddCiAgICBzZXQgeXNwYW4gW2V4cHIge1tsaW5kZXggJHZpZXcgMV0gLSBbbGluZGV4ICR2aWV3IDBdfV0KICAgIHNldCB5ZnJhYyBbZXhwciB7JHl0IC8gJHltYXggLSAkeXNwYW4gLyAyfV0KICAgIGlmIHskeWZyYWMgPCAwfSB7CglzZXQgeWZyYWMgMAogICAgfQogICAgYWxsY2FudnMgeXZpZXcgbW92ZXRvICR5ZnJhYwp9Cgpwcm9jIGxpbmVjbGljayB7eCB5IGlkIGlzbmV3fSB7CiAgICBnbG9iYWwgY3RleHQgY29tbWl0aW5mbyBjaGlsZHJlbiBjYW52IHRoaWNrZXJsaW5lIGN1cnZpZXcKCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjb21taXRpbmZvKCRpZCldICYmICFbZ2V0Y29tbWl0ICRpZF19IHJldHVybgogICAgdW5tYXJrbWF0Y2hlcwogICAgdW5zZWxlY3RsaW5lCiAgICBub3JtYWxsaW5lCiAgICAkY2FudiBkZWxldGUgaG92ZXIKICAgICMgZHJhdyB0aGlzIGxpbmUgdGhpY2tlciB0aGFuIG5vcm1hbAogICAgc2V0IHRoaWNrZXJsaW5lICRpZAogICAgZHJhd2xpbmVzICRpZAogICAgaWYgeyRpc25ld30gewoJc2V0IHltYXggW2xpbmRleCBbJGNhbnYgY2dldCAtc2Nyb2xscmVnaW9uXSAzXQoJaWYgeyR5bWF4IGVxIHt9fSByZXR1cm4KCXNldCB5ZnJhYyBbbGluZGV4IFskY2FudiB5dmlld10gMF0KCXNldCB5IFtleHByIHskeSArICR5ZnJhYyAqICR5bWF4fV0KICAgIH0KICAgIHNldCBkaXJuIFtjbGlja2lzb25hcnJvdyAkaWQgJHldCiAgICBpZiB7JGRpcm4gbmUge319IHsKCWFycm93anVtcCAkaWQgJGRpcm4gJHkKCXJldHVybgogICAgfQoKICAgIGlmIHskaXNuZXd9IHsKCWFkZHRvaGlzdG9yeSBbbGlzdCBsaW5lY2xpY2sgJHggJHkgJGlkIDBdCiAgICB9CiAgICAjIGZpbGwgdGhlIGRldGFpbHMgcGFuZSB3aXRoIGluZm8gYWJvdXQgdGhpcyBsaW5lCiAgICAkY3RleHQgY29uZiAtc3RhdGUgbm9ybWFsCiAgICBjbGVhcl9jdGV4dAogICAgJGN0ZXh0IHRhZyBjb25mIGxpbmsgLWZvcmVncm91bmQgYmx1ZSAtdW5kZXJsaW5lIDEKICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxFbnRlcj4geyAlVyBjb25maWd1cmUgLWN1cnNvciBoYW5kMiB9CiAgICAkY3RleHQgdGFnIGJpbmQgbGluayA8TGVhdmU+IHsgJVcgY29uZmlndXJlIC1jdXJzb3IgJGN1cnRleHRjdXJzb3IgfQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlBhcmVudDpcdCIKICAgICRjdGV4dCBpbnNlcnQgZW5kICRpZCBbbGlzdCBsaW5rIGxpbmswXQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmswIDwxPiBbbGlzdCBzZWxieWlkICRpZF0KICAgIHNldCBpbmZvICRjb21taXRpbmZvKCRpZCkKICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblx0W2xpbmRleCAkaW5mbyAwXVxuIgogICAgJGN0ZXh0IGluc2VydCBlbmQgIlx0QXV0aG9yOlx0W2xpbmRleCAkaW5mbyAxXVxuIgogICAgc2V0IGRhdGUgW2Zvcm1hdGRhdGUgW2xpbmRleCAkaW5mbyAyXV0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcdERhdGU6XHQkZGF0ZVxuIgogICAgc2V0IGtpZHMgJGNoaWxkcmVuKCRjdXJ2aWV3LCRpZCkKICAgIGlmIHska2lkcyBuZSB7fX0gewoJJGN0ZXh0IGluc2VydCBlbmQgIlxuQ2hpbGRyZW46IgoJc2V0IGkgMAoJZm9yZWFjaCBjaGlsZCAka2lkcyB7CgkgICAgaW5jciBpCgkgICAgaWYgeyFbaW5mbyBleGlzdHMgY29tbWl0aW5mbygkY2hpbGQpXSAmJiAhW2dldGNvbW1pdCAkY2hpbGRdfSBjb250aW51ZQoJICAgIHNldCBpbmZvICRjb21taXRpbmZvKCRjaGlsZCkKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG5cdCIKCSAgICAkY3RleHQgaW5zZXJ0IGVuZCAkY2hpbGQgW2xpc3QgbGluayBsaW5rJGldCgkgICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmskaSA8MT4gW2xpc3Qgc2VsYnlpZCAkY2hpbGRdCgkgICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXHRbbGluZGV4ICRpbmZvIDBdIgoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblx0QXV0aG9yOlx0W2xpbmRleCAkaW5mbyAxXSIKCSAgICBzZXQgZGF0ZSBbZm9ybWF0ZGF0ZSBbbGluZGV4ICRpbmZvIDJdXQoJICAgICRjdGV4dCBpbnNlcnQgZW5kICJcblx0RGF0ZTpcdCRkYXRlXG4iCgl9CiAgICB9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIGluaXRfZmxpc3Qge30KfQoKcHJvYyBub3JtYWxsaW5lIHt9IHsKICAgIGdsb2JhbCB0aGlja2VybGluZQogICAgaWYge1tpbmZvIGV4aXN0cyB0aGlja2VybGluZV19IHsKCXNldCBpZCAkdGhpY2tlcmxpbmUKCXVuc2V0IHRoaWNrZXJsaW5lCglkcmF3bGluZXMgJGlkCiAgICB9Cn0KCnByb2Mgc2VsYnlpZCB7aWR9IHsKICAgIGdsb2JhbCBjb21taXRyb3cgY3VydmlldwogICAgaWYge1tpbmZvIGV4aXN0cyBjb21taXRyb3coJGN1cnZpZXcsJGlkKV19IHsKCXNlbGVjdGxpbmUgJGNvbW1pdHJvdygkY3VydmlldywkaWQpIDEKICAgIH0KfQoKcHJvYyBtc3RpbWUge30gewogICAgZ2xvYmFsIHN0YXJ0bXN0aW1lCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBzdGFydG1zdGltZV19IHsKCXNldCBzdGFydG1zdGltZSBbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdCiAgICB9CiAgICByZXR1cm4gW2Zvcm1hdCAiJS4zZiIgW2V4cHIgeyhbY2xvY2sgY2xpY2sgLW1pbGxpc2Vjb25kc10gLSAkc3RhcnRtc3RpbWUpIC8gMTAwMC4wfV1dCn0KCnByb2Mgcm93bWVudSB7eCB5IGlkfSB7CiAgICBnbG9iYWwgcm93Y3R4bWVudSBjb21taXRyb3cgc2VsZWN0ZWRsaW5lIHJvd21lbnVpZCBjdXJ2aWV3CgogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXQoJfHwgJGNvbW1pdHJvdygkY3VydmlldywkaWQpIGVxICRzZWxlY3RlZGxpbmV9IHsKCXNldCBzdGF0ZSBkaXNhYmxlZAogICAgfSBlbHNlIHsKCXNldCBzdGF0ZSBub3JtYWwKICAgIH0KICAgICRyb3djdHhtZW51IGVudHJ5Y29uZmlndXJlIDAgLXN0YXRlICRzdGF0ZQogICAgJHJvd2N0eG1lbnUgZW50cnljb25maWd1cmUgMSAtc3RhdGUgJHN0YXRlCiAgICAkcm93Y3R4bWVudSBlbnRyeWNvbmZpZ3VyZSAyIC1zdGF0ZSAkc3RhdGUKICAgIHNldCByb3dtZW51aWQgJGlkCiAgICB0a19wb3B1cCAkcm93Y3R4bWVudSAkeCAkeQp9Cgpwcm9jIGRpZmZ2c3NlbCB7ZGlybn0gewogICAgZ2xvYmFsIHJvd21lbnVpZCBzZWxlY3RlZGxpbmUgZGlzcGxheW9yZGVyCgogICAgaWYgeyFbaW5mbyBleGlzdHMgc2VsZWN0ZWRsaW5lXX0gcmV0dXJuCiAgICBpZiB7JGRpcm59IHsKCXNldCBvbGRpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHNlbGVjdGVkbGluZV0KCXNldCBuZXdpZCAkcm93bWVudWlkCiAgICB9IGVsc2UgewoJc2V0IG9sZGlkICRyb3dtZW51aWQKCXNldCBuZXdpZCBbbGluZGV4ICRkaXNwbGF5b3JkZXIgJHNlbGVjdGVkbGluZV0KICAgIH0KICAgIGFkZHRvaGlzdG9yeSBbbGlzdCBkb3NlbGRpZmYgJG9sZGlkICRuZXdpZF0KICAgIGRvc2VsZGlmZiAkb2xkaWQgJG5ld2lkCn0KCnByb2MgZG9zZWxkaWZmIHtvbGRpZCBuZXdpZH0gewogICAgZ2xvYmFsIGN0ZXh0CiAgICBnbG9iYWwgY29tbWl0aW5mbwoKICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIGNsZWFyX2N0ZXh0CiAgICBpbml0X2ZsaXN0ICJUb3AiCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiRnJvbSAiCiAgICAkY3RleHQgdGFnIGNvbmYgbGluayAtZm9yZWdyb3VuZCBibHVlIC11bmRlcmxpbmUgMQogICAgJGN0ZXh0IHRhZyBiaW5kIGxpbmsgPEVudGVyPiB7ICVXIGNvbmZpZ3VyZSAtY3Vyc29yIGhhbmQyIH0KICAgICRjdGV4dCB0YWcgYmluZCBsaW5rIDxMZWF2ZT4geyAlVyBjb25maWd1cmUgLWN1cnNvciAkY3VydGV4dGN1cnNvciB9CiAgICAkY3RleHQgdGFnIGJpbmQgbGluazAgPDE+IFtsaXN0IHNlbGJ5aWQgJG9sZGlkXQogICAgJGN0ZXh0IGluc2VydCBlbmQgJG9sZGlkIFtsaXN0IGxpbmsgbGluazBdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4gICAgICIKICAgICRjdGV4dCBpbnNlcnQgZW5kIFtsaW5kZXggJGNvbW1pdGluZm8oJG9sZGlkKSAwXQogICAgJGN0ZXh0IGluc2VydCBlbmQgIlxuXG5UbyAgICIKICAgICRjdGV4dCB0YWcgYmluZCBsaW5rMSA8MT4gW2xpc3Qgc2VsYnlpZCAkbmV3aWRdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAkbmV3aWQgW2xpc3QgbGluayBsaW5rMV0KICAgICRjdGV4dCBpbnNlcnQgZW5kICJcbiAgICAgIgogICAgJGN0ZXh0IGluc2VydCBlbmQgW2xpbmRleCAkY29tbWl0aW5mbygkbmV3aWQpIDBdCiAgICAkY3RleHQgaW5zZXJ0IGVuZCAiXG4iCiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgICRjdGV4dCB0YWcgZGVsZXRlIENvbW1lbnRzCiAgICAkY3RleHQgdGFnIHJlbW92ZSBmb3VuZCAxLjAgZW5kCiAgICBzdGFydGRpZmYgW2xpc3QgJG9sZGlkICRuZXdpZF0KfQoKcHJvYyBta3BhdGNoIHt9IHsKICAgIGdsb2JhbCByb3dtZW51aWQgY3VycmVudGlkIGNvbW1pdGluZm8gcGF0Y2h0b3AgcGF0Y2hudW0KCiAgICBpZiB7IVtpbmZvIGV4aXN0cyBjdXJyZW50aWRdfSByZXR1cm4KICAgIHNldCBvbGRpZCAkY3VycmVudGlkCiAgICBzZXQgb2xkaGVhZCBbbGluZGV4ICRjb21taXRpbmZvKCRvbGRpZCkgMF0KICAgIHNldCBuZXdpZCAkcm93bWVudWlkCiAgICBzZXQgbmV3aGVhZCBbbGluZGV4ICRjb21taXRpbmZvKCRuZXdpZCkgMF0KICAgIHNldCB0b3AgLnBhdGNoCiAgICBzZXQgcGF0Y2h0b3AgJHRvcAogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KICAgIHRvcGxldmVsICR0b3AKICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIkdlbmVyYXRlIHBhdGNoIgogICAgZ3JpZCAkdG9wLnRpdGxlIC0gLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuZnJvbSAtdGV4dCAiRnJvbToiCiAgICBlbnRyeSAkdG9wLmZyb21zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3AuZnJvbXNoYTEgaW5zZXJ0IDAgJG9sZGlkCiAgICAkdG9wLmZyb21zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AuZnJvbSAkdG9wLmZyb21zaGExIC1zdGlja3kgdwogICAgZW50cnkgJHRvcC5mcm9taGVhZCAtd2lkdGggNjAgLXJlbGllZiBmbGF0CiAgICAkdG9wLmZyb21oZWFkIGluc2VydCAwICRvbGRoZWFkCiAgICAkdG9wLmZyb21oZWFkIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkIHggJHRvcC5mcm9taGVhZCAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AudG8gLXRleHQgIlRvOiIKICAgIGVudHJ5ICR0b3AudG9zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3AudG9zaGExIGluc2VydCAwICRuZXdpZAogICAgJHRvcC50b3NoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgJHRvcC50byAkdG9wLnRvc2hhMSAtc3RpY2t5IHcKICAgIGVudHJ5ICR0b3AudG9oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKICAgICR0b3AudG9oZWFkIGluc2VydCAwICRuZXdoZWFkCiAgICAkdG9wLnRvaGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCB4ICR0b3AudG9oZWFkIC1zdGlja3kgdwogICAgYnV0dG9uICR0b3AucmV2IC10ZXh0ICJSZXZlcnNlIiAtY29tbWFuZCBta3BhdGNocmV2IC1wYWR4IDUKICAgIGdyaWQgJHRvcC5yZXYgeCAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5mbGFiIC10ZXh0ICJPdXRwdXQgZmlsZToiCiAgICBlbnRyeSAkdG9wLmZuYW1lIC13aWR0aCA2MAogICAgJHRvcC5mbmFtZSBpbnNlcnQgMCBbZmlsZSBub3JtYWxpemUgInBhdGNoJHBhdGNobnVtLnBhdGNoIl0KICAgIGluY3IgcGF0Y2hudW0KICAgIGdyaWQgJHRvcC5mbGFiICR0b3AuZm5hbWUgLXN0aWNreSB3CiAgICBmcmFtZSAkdG9wLmJ1dHMKICAgIGJ1dHRvbiAkdG9wLmJ1dHMuZ2VuIC10ZXh0ICJHZW5lcmF0ZSIgLWNvbW1hbmQgbWtwYXRjaGdvCiAgICBidXR0b24gJHRvcC5idXRzLmNhbiAtdGV4dCAiQ2FuY2VsIiAtY29tbWFuZCBta3BhdGNoY2FuCiAgICBncmlkICR0b3AuYnV0cy5nZW4gJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKICAgIGZvY3VzICR0b3AuZm5hbWUKfQoKcHJvYyBta3BhdGNocmV2IHt9IHsKICAgIGdsb2JhbCBwYXRjaHRvcAoKICAgIHNldCBvbGRpZCBbJHBhdGNodG9wLmZyb21zaGExIGdldF0KICAgIHNldCBvbGRoZWFkIFskcGF0Y2h0b3AuZnJvbWhlYWQgZ2V0XQogICAgc2V0IG5ld2lkIFskcGF0Y2h0b3AudG9zaGExIGdldF0KICAgIHNldCBuZXdoZWFkIFskcGF0Y2h0b3AudG9oZWFkIGdldF0KICAgIGZvcmVhY2ggZSBbbGlzdCBmcm9tc2hhMSBmcm9taGVhZCB0b3NoYTEgdG9oZWFkXSBcCgkgICAgdiBbbGlzdCAkbmV3aWQgJG5ld2hlYWQgJG9sZGlkICRvbGRoZWFkXSB7CgkkcGF0Y2h0b3AuJGUgY29uZiAtc3RhdGUgbm9ybWFsCgkkcGF0Y2h0b3AuJGUgZGVsZXRlIDAgZW5kCgkkcGF0Y2h0b3AuJGUgaW5zZXJ0IDAgJHYKCSRwYXRjaHRvcC4kZSBjb25mIC1zdGF0ZSByZWFkb25seQogICAgfQp9Cgpwcm9jIG1rcGF0Y2hnbyB7fSB7CiAgICBnbG9iYWwgcGF0Y2h0b3AKCiAgICBzZXQgb2xkaWQgWyRwYXRjaHRvcC5mcm9tc2hhMSBnZXRdCiAgICBzZXQgbmV3aWQgWyRwYXRjaHRvcC50b3NoYTEgZ2V0XQogICAgc2V0IGZuYW1lIFskcGF0Y2h0b3AuZm5hbWUgZ2V0XQogICAgaWYge1tjYXRjaCB7ZXhlYyBnaXQgZGlmZi10cmVlIC1wICRvbGRpZCAkbmV3aWQgPiRmbmFtZSAmfSBlcnJdfSB7CgllcnJvcl9wb3B1cCAiRXJyb3IgY3JlYXRpbmcgcGF0Y2g6ICRlcnIiCiAgICB9CiAgICBjYXRjaCB7ZGVzdHJveSAkcGF0Y2h0b3B9CiAgICB1bnNldCBwYXRjaHRvcAp9Cgpwcm9jIG1rcGF0Y2hjYW4ge30gewogICAgZ2xvYmFsIHBhdGNodG9wCgogICAgY2F0Y2gge2Rlc3Ryb3kgJHBhdGNodG9wfQogICAgdW5zZXQgcGF0Y2h0b3AKfQoKcHJvYyBta3RhZyB7fSB7CiAgICBnbG9iYWwgcm93bWVudWlkIG1rdGFndG9wIGNvbW1pdGluZm8KCiAgICBzZXQgdG9wIC5tYWtldGFnCiAgICBzZXQgbWt0YWd0b3AgJHRvcAogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KICAgIHRvcGxldmVsICR0b3AKICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIkNyZWF0ZSB0YWciCiAgICBncmlkICR0b3AudGl0bGUgLSAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5pZCAtdGV4dCAiSUQ6IgogICAgZW50cnkgJHRvcC5zaGExIC13aWR0aCA0MCAtcmVsaWVmIGZsYXQKICAgICR0b3Auc2hhMSBpbnNlcnQgMCAkcm93bWVudWlkCiAgICAkdG9wLnNoYTEgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgJHRvcC5pZCAkdG9wLnNoYTEgLXN0aWNreSB3CiAgICBlbnRyeSAkdG9wLmhlYWQgLXdpZHRoIDYwIC1yZWxpZWYgZmxhdAogICAgJHRvcC5oZWFkIGluc2VydCAwIFtsaW5kZXggJGNvbW1pdGluZm8oJHJvd21lbnVpZCkgMF0KICAgICR0b3AuaGVhZCBjb25mIC1zdGF0ZSByZWFkb25seQogICAgZ3JpZCB4ICR0b3AuaGVhZCAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AudGxhYiAtdGV4dCAiVGFnIG5hbWU6IgogICAgZW50cnkgJHRvcC50YWcgLXdpZHRoIDYwCiAgICBncmlkICR0b3AudGxhYiAkdG9wLnRhZyAtc3RpY2t5IHcKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5nZW4gLXRleHQgIkNyZWF0ZSIgLWNvbW1hbmQgbWt0YWdnbwogICAgYnV0dG9uICR0b3AuYnV0cy5jYW4gLXRleHQgIkNhbmNlbCIgLWNvbW1hbmQgbWt0YWdjYW4KICAgIGdyaWQgJHRvcC5idXRzLmdlbiAkdG9wLmJ1dHMuY2FuCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgJHRvcC5idXRzIC0gLXBhZHkgMTAgLXN0aWNreSBldwogICAgZm9jdXMgJHRvcC50YWcKfQoKcHJvYyBkb21rdGFnIHt9IHsKICAgIGdsb2JhbCBta3RhZ3RvcCBlbnYgdGFnaWRzIGlkdGFncwoKICAgIHNldCBpZCBbJG1rdGFndG9wLnNoYTEgZ2V0XQogICAgc2V0IHRhZyBbJG1rdGFndG9wLnRhZyBnZXRdCiAgICBpZiB7JHRhZyA9PSB7fX0gewoJZXJyb3JfcG9wdXAgIk5vIHRhZyBuYW1lIHNwZWNpZmllZCIKCXJldHVybgogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyB0YWdpZHMoJHRhZyldfSB7CgllcnJvcl9wb3B1cCAiVGFnIFwiJHRhZ1wiIGFscmVhZHkgZXhpc3RzIgoJcmV0dXJuCiAgICB9CiAgICBpZiB7W2NhdGNoIHsKCXNldCBkaXIgW2dpdGRpcl0KCXNldCBmbmFtZSBbZmlsZSBqb2luICRkaXIgInJlZnMvdGFncyIgJHRhZ10KCXNldCBmIFtvcGVuICRmbmFtZSB3XQoJcHV0cyAkZiAkaWQKCWNsb3NlICRmCiAgICB9IGVycl19IHsKCWVycm9yX3BvcHVwICJFcnJvciBjcmVhdGluZyB0YWc6ICRlcnIiCglyZXR1cm4KICAgIH0KCiAgICBzZXQgdGFnaWRzKCR0YWcpICRpZAogICAgbGFwcGVuZCBpZHRhZ3MoJGlkKSAkdGFnCiAgICByZWRyYXd0YWdzICRpZAp9Cgpwcm9jIHJlZHJhd3RhZ3Mge2lkfSB7CiAgICBnbG9iYWwgY2FudiBsaW5laHRhZyBjb21taXRyb3cgaWRwb3Mgc2VsZWN0ZWRsaW5lIGN1cnZpZXcKICAgIGdsb2JhbCBtYWluZm9udCBjYW52eG1heAoKICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXX0gcmV0dXJuCiAgICBkcmF3Y21pdHJvdyAkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkKICAgICRjYW52IGRlbGV0ZSB0YWcuJGlkCiAgICBzZXQgeHQgW2V2YWwgZHJhd3RhZ3MgJGlkICRpZHBvcygkaWQpXQogICAgJGNhbnYgY29vcmRzICRsaW5laHRhZygkY29tbWl0cm93KCRjdXJ2aWV3LCRpZCkpICR4dCBbbGluZGV4ICRpZHBvcygkaWQpIDJdCiAgICBzZXQgdGV4dCBbJGNhbnYgaXRlbWNnZXQgJGxpbmVodGFnKCRjb21taXRyb3coJGN1cnZpZXcsJGlkKSkgLXRleHRdCiAgICBzZXQgeHIgW2V4cHIgeyR4dCArIFtmb250IG1lYXN1cmUgJG1haW5mb250ICR0ZXh0XX1dCiAgICBpZiB7JHhyID4gJGNhbnZ4bWF4fSB7CglzZXQgY2FudnhtYXggJHhyCglzZXRjYW52c2Nyb2xsCiAgICB9CiAgICBpZiB7W2luZm8gZXhpc3RzIHNlbGVjdGVkbGluZV0KCSYmICRzZWxlY3RlZGxpbmUgPT0gJGNvbW1pdHJvdygkY3VydmlldywkaWQpfSB7CglzZWxlY3RsaW5lICRzZWxlY3RlZGxpbmUgMAogICAgfQp9Cgpwcm9jIG1rdGFnY2FuIHt9IHsKICAgIGdsb2JhbCBta3RhZ3RvcAoKICAgIGNhdGNoIHtkZXN0cm95ICRta3RhZ3RvcH0KICAgIHVuc2V0IG1rdGFndG9wCn0KCnByb2MgbWt0YWdnbyB7fSB7CiAgICBkb21rdGFnCiAgICBta3RhZ2Nhbgp9Cgpwcm9jIHdyaXRlY29tbWl0IHt9IHsKICAgIGdsb2JhbCByb3dtZW51aWQgd3Jjb210b3AgY29tbWl0aW5mbyB3cmNvbWNtZAoKICAgIHNldCB0b3AgLndyaXRlY29tbWl0CiAgICBzZXQgd3Jjb210b3AgJHRvcAogICAgY2F0Y2gge2Rlc3Ryb3kgJHRvcH0KICAgIHRvcGxldmVsICR0b3AKICAgIGxhYmVsICR0b3AudGl0bGUgLXRleHQgIldyaXRlIGNvbW1pdCB0byBmaWxlIgogICAgZ3JpZCAkdG9wLnRpdGxlIC0gLXBhZHkgMTAKICAgIGxhYmVsICR0b3AuaWQgLXRleHQgIklEOiIKICAgIGVudHJ5ICR0b3Auc2hhMSAtd2lkdGggNDAgLXJlbGllZiBmbGF0CiAgICAkdG9wLnNoYTEgaW5zZXJ0IDAgJHJvd21lbnVpZAogICAgJHRvcC5zaGExIGNvbmYgLXN0YXRlIHJlYWRvbmx5CiAgICBncmlkICR0b3AuaWQgJHRvcC5zaGExIC1zdGlja3kgdwogICAgZW50cnkgJHRvcC5oZWFkIC13aWR0aCA2MCAtcmVsaWVmIGZsYXQKICAgICR0b3AuaGVhZCBpbnNlcnQgMCBbbGluZGV4ICRjb21taXRpbmZvKCRyb3dtZW51aWQpIDBdCiAgICAkdG9wLmhlYWQgY29uZiAtc3RhdGUgcmVhZG9ubHkKICAgIGdyaWQgeCAkdG9wLmhlYWQgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLmNsYWIgLXRleHQgIkNvbW1hbmQ6IgogICAgZW50cnkgJHRvcC5jbWQgLXdpZHRoIDYwIC10ZXh0dmFyaWFibGUgd3Jjb21jbWQKICAgIGdyaWQgJHRvcC5jbGFiICR0b3AuY21kIC1zdGlja3kgdyAtcGFkeSAxMAogICAgbGFiZWwgJHRvcC5mbGFiIC10ZXh0ICJPdXRwdXQgZmlsZToiCiAgICBlbnRyeSAkdG9wLmZuYW1lIC13aWR0aCA2MAogICAgJHRvcC5mbmFtZSBpbnNlcnQgMCBbZmlsZSBub3JtYWxpemUgImNvbW1pdC1bc3RyaW5nIHJhbmdlICRyb3dtZW51aWQgMCA2XSJdCiAgICBncmlkICR0b3AuZmxhYiAkdG9wLmZuYW1lIC1zdGlja3kgdwogICAgZnJhbWUgJHRvcC5idXRzCiAgICBidXR0b24gJHRvcC5idXRzLmdlbiAtdGV4dCAiV3JpdGUiIC1jb21tYW5kIHdyY29tZ28KICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIHdyY29tY2FuCiAgICBncmlkICR0b3AuYnV0cy5nZW4gJHRvcC5idXRzLmNhbgogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDAgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgY29sdW1uY29uZmlndXJlICR0b3AuYnV0cyAxIC13ZWlnaHQgMSAtdW5pZm9ybSBhCiAgICBncmlkICR0b3AuYnV0cyAtIC1wYWR5IDEwIC1zdGlja3kgZXcKICAgIGZvY3VzICR0b3AuZm5hbWUKfQoKcHJvYyB3cmNvbWdvIHt9IHsKICAgIGdsb2JhbCB3cmNvbXRvcAoKICAgIHNldCBpZCBbJHdyY29tdG9wLnNoYTEgZ2V0XQogICAgc2V0IGNtZCAiZWNobyAkaWQgfCBbJHdyY29tdG9wLmNtZCBnZXRdIgogICAgc2V0IGZuYW1lIFskd3Jjb210b3AuZm5hbWUgZ2V0XQogICAgaWYge1tjYXRjaCB7ZXhlYyBzaCAtYyAkY21kID4kZm5hbWUgJn0gZXJyXX0gewoJZXJyb3JfcG9wdXAgIkVycm9yIHdyaXRpbmcgY29tbWl0OiAkZXJyIgogICAgfQogICAgY2F0Y2gge2Rlc3Ryb3kgJHdyY29tdG9wfQogICAgdW5zZXQgd3Jjb210b3AKfQoKcHJvYyB3cmNvbWNhbiB7fSB7CiAgICBnbG9iYWwgd3Jjb210b3AKCiAgICBjYXRjaCB7ZGVzdHJveSAkd3Jjb210b3B9CiAgICB1bnNldCB3cmNvbXRvcAp9CgojIFN0dWZmIGZvciBmaW5kaW5nIG5lYXJieSB0YWdzCnByb2MgZ2V0YWxsY29tbWl0cyB7fSB7CiAgICBnbG9iYWwgYWxsY3N0YXJ0IGFsbGNvbW1pdHMgYWxsY2ZkCgogICAgc2V0IGZkIFtvcGVuIFtjb25jYXQgfCBnaXQgcmV2LWxpc3QgLS1hbGwgLS10b3BvLW9yZGVyIC0tcGFyZW50c10gcl0KICAgIHNldCBhbGxjZmQgJGZkCiAgICBmY29uZmlndXJlICRmZCAtYmxvY2tpbmcgMAogICAgc2V0IGFsbGNvbW1pdHMgInJlYWRpbmciCiAgICBub3didXN5IGFsbGNvbW1pdHMKICAgIHJlc3RhcnRnZXRhbGwgJGZkCn0KCnByb2MgZGlzY2FyZGFsbGNvbW1pdHMge30gewogICAgZ2xvYmFsIGFsbHBhcmVudHMgYWxsY2hpbGRyZW4gYWxsY29tbWl0cyBhbGxjZmQKICAgIGdsb2JhbCBkZXNjX3RhZ3MgYW5jX3RhZ3MgYWxsZHRhZ3MgdGFnaXNkZXNjIGFsbGlkcyBkZXNjX2hlYWRzCgogICAgaWYgeyFbaW5mbyBleGlzdHMgYWxsY29tbWl0c119IHJldHVybgogICAgaWYgeyRhbGxjb21taXRzIGVxICJyZWFkaW5nIn0gewoJY2F0Y2gge2Nsb3NlICRhbGxjZmR9CiAgICB9CiAgICBmb3JlYWNoIHYge2FsbGNvbW1pdHMgYWxsY2hpbGRyZW4gYWxscGFyZW50cyBhbGxpZHMgZGVzY190YWdzIGFuY190YWdzCgkJYWxsZHRhZ3MgdGFnaXNkZXNjIGRlc2NfaGVhZHN9IHsKCWNhdGNoIHt1bnNldCAkdn0KICAgIH0KfQoKcHJvYyByZXN0YXJ0Z2V0YWxsIHtmZH0gewogICAgZ2xvYmFsIGFsbGNzdGFydAoKICAgIGZpbGVldmVudCAkZmQgcmVhZGFibGUgW2xpc3QgZ2V0YWxsY2xpbmVzICRmZF0KICAgIHNldCBhbGxjc3RhcnQgW2Nsb2NrIGNsaWNrcyAtbWlsbGlzZWNvbmRzXQp9Cgpwcm9jIGNvbWJpbmVfZHRhZ3Mge2wxIGwyfSB7CiAgICBnbG9iYWwgdGFnaXNkZXNjIG5vdGZpcnN0ZAoKICAgIHNldCByZXMgW2xzb3J0IC11bmlxdWUgW2NvbmNhdCAkbDEgJGwyXV0KICAgIGZvciB7c2V0IGkgMH0geyRpIDwgW2xsZW5ndGggJHJlc119IHtpbmNyIGl9IHsKCXNldCB4IFtsaW5kZXggJHJlcyAkaV0KCWZvciB7c2V0IGogW2V4cHIgeyRpKzF9XX0geyRqIDwgW2xsZW5ndGggJHJlc119IHt9IHsKCSAgICBzZXQgeSBbbGluZGV4ICRyZXMgJGpdCgkgICAgaWYge1tpbmZvIGV4aXN0cyB0YWdpc2Rlc2MoJHgsJHkpXX0gewoJCWlmIHskdGFnaXNkZXNjKCR4LCR5KSA+IDB9IHsKCQkgICAgIyB4IGlzIGEgZGVzY2VuZGVudCBvZiB5LCBleGNsdWRlIHgKCQkgICAgc2V0IHJlcyBbbHJlcGxhY2UgJHJlcyAkaSAkaV0KCQkgICAgaW5jciBpIC0xCgkJICAgIGJyZWFrCgkJfSBlbHNlIHsKCQkgICAgIyB5IGlzIGEgZGVzY2VuZGVudCBvZiB4LCBleGNsdWRlIHkKCQkgICAgc2V0IHJlcyBbbHJlcGxhY2UgJHJlcyAkaiAkal0KCQl9CgkgICAgfSBlbHNlIHsKCQkjIG5vIHJlbGF0aW9uLCBrZWVwIGdvaW5nCgkJaW5jciBqCgkgICAgfQoJfQogICAgfQogICAgcmV0dXJuICRyZXMKfQoKcHJvYyBjb21iaW5lX2F0YWdzIHtsMSBsMn0gewogICAgZ2xvYmFsIHRhZ2lzZGVzYwoKICAgIHNldCByZXMgW2xzb3J0IC11bmlxdWUgW2NvbmNhdCAkbDEgJGwyXV0KICAgIGZvciB7c2V0IGkgMH0geyRpIDwgW2xsZW5ndGggJHJlc119IHtpbmNyIGl9IHsKCXNldCB4IFtsaW5kZXggJHJlcyAkaV0KCWZvciB7c2V0IGogW2V4cHIgeyRpKzF9XX0geyRqIDwgW2xsZW5ndGggJHJlc119IHt9IHsKCSAgICBzZXQgeSBbbGluZGV4ICRyZXMgJGpdCgkgICAgaWYge1tpbmZvIGV4aXN0cyB0YWdpc2Rlc2MoJHgsJHkpXX0gewoJCWlmIHskdGFnaXNkZXNjKCR4LCR5KSA8IDB9IHsKCQkgICAgIyB4IGlzIGFuIGFuY2VzdG9yIG9mIHksIGV4Y2x1ZGUgeAoJCSAgICBzZXQgcmVzIFtscmVwbGFjZSAkcmVzICRpICRpXQoJCSAgICBpbmNyIGkgLTEKCQkgICAgYnJlYWsKCQl9IGVsc2UgewoJCSAgICAjIHkgaXMgYW4gYW5jZXN0b3Igb2YgeCwgZXhjbHVkZSB5CgkJICAgIHNldCByZXMgW2xyZXBsYWNlICRyZXMgJGogJGpdCgkJfQoJICAgIH0gZWxzZSB7CgkJIyBubyByZWxhdGlvbiwga2VlcCBnb2luZwoJCWluY3IgagoJICAgIH0KCX0KICAgIH0KICAgIHJldHVybiAkcmVzCn0KCnByb2MgZ2V0YWxsY2xpbmVzIHtmZH0gewogICAgZ2xvYmFsIGFsbHBhcmVudHMgYWxsY2hpbGRyZW4gYWxsY29tbWl0cyBhbGxjc3RhcnQKICAgIGdsb2JhbCBkZXNjX3RhZ3MgYW5jX3RhZ3MgaWR0YWdzIGFsbGR0YWdzIHRhZ2lzZGVzYyBhbGxpZHMKICAgIGdsb2JhbCBkZXNjX2hlYWRzIGlkaGVhZHMKCiAgICB3aGlsZSB7W2dldHMgJGZkIGxpbmVdID49IDB9IHsKCXNldCBpZCBbbGluZGV4ICRsaW5lIDBdCglsYXBwZW5kIGFsbGlkcyAkaWQKCXNldCBvbGRzIFtscmFuZ2UgJGxpbmUgMSBlbmRdCglzZXQgYWxscGFyZW50cygkaWQpICRvbGRzCglpZiB7IVtpbmZvIGV4aXN0cyBhbGxjaGlsZHJlbigkaWQpXX0gewoJICAgIHNldCBhbGxjaGlsZHJlbigkaWQpIHt9Cgl9Cglmb3JlYWNoIHAgJG9sZHMgewoJICAgIGxhcHBlbmQgYWxsY2hpbGRyZW4oJHApICRpZAoJfQoJIyBjb21wdXRlIG5lYXJlc3QgdGFnZ2VkIGRlc2NlbmRlbnRzIGFzIHdlIGdvCgkjIGFsc28gY29tcHV0ZSBkZXNjZW5kZW50IGhlYWRzCglzZXQgZHRhZ3Mge30KCXNldCBkaGVhZHMge30KCWZvcmVhY2ggY2hpbGQgJGFsbGNoaWxkcmVuKCRpZCkgewoJICAgIGlmIHtbaW5mbyBleGlzdHMgaWR0YWdzKCRjaGlsZCldfSB7CgkJc2V0IGN0YWdzIFtsaXN0ICRjaGlsZF0KCSAgICB9IGVsc2UgewoJCXNldCBjdGFncyAkZGVzY190YWdzKCRjaGlsZCkKCSAgICB9CgkgICAgaWYgeyRkdGFncyBlcSB7fX0gewoJCXNldCBkdGFncyAkY3RhZ3MKCSAgICB9IGVsc2VpZiB7JGN0YWdzIG5lICRkdGFnc30gewoJCXNldCBkdGFncyBbY29tYmluZV9kdGFncyAkZHRhZ3MgJGN0YWdzXQoJICAgIH0KCSAgICBzZXQgY2hlYWRzICRkZXNjX2hlYWRzKCRjaGlsZCkKCSAgICBpZiB7JGRoZWFkcyBlcSB7fX0gewoJCXNldCBkaGVhZHMgJGNoZWFkcwoJICAgIH0gZWxzZWlmIHskY2hlYWRzIG5lICRkaGVhZHN9IHsKCQlzZXQgZGhlYWRzIFtsc29ydCAtdW5pcXVlIFtjb25jYXQgJGRoZWFkcyAkY2hlYWRzXV0KCSAgICB9Cgl9CglzZXQgZGVzY190YWdzKCRpZCkgJGR0YWdzCglpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXX0gewoJICAgIHNldCBhZHQgJGR0YWdzCgkgICAgZm9yZWFjaCB0YWcgJGR0YWdzIHsKCQlzZXQgYWR0IFtjb25jYXQgJGFkdCAkYWxsZHRhZ3MoJHRhZyldCgkgICAgfQoJICAgIHNldCBhZHQgW2xzb3J0IC11bmlxdWUgJGFkdF0KCSAgICBzZXQgYWxsZHRhZ3MoJGlkKSAkYWR0CgkgICAgZm9yZWFjaCB0YWcgJGFkdCB7CgkJc2V0IHRhZ2lzZGVzYygkaWQsJHRhZykgLTEKCQlzZXQgdGFnaXNkZXNjKCR0YWcsJGlkKSAxCgkgICAgfQoJfQoJaWYge1tpbmZvIGV4aXN0cyBpZGhlYWRzKCRpZCldfSB7CgkgICAgbGFwcGVuZCBkaGVhZHMgJGlkCgl9CglzZXQgZGVzY19oZWFkcygkaWQpICRkaGVhZHMKCWlmIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdIC0gJGFsbGNzdGFydCA+PSA1MH0gewoJICAgIGZpbGVldmVudCAkZmQgcmVhZGFibGUge30KCSAgICBhZnRlciBpZGxlIHJlc3RhcnRnZXRhbGwgJGZkCgkgICAgcmV0dXJuCgl9CiAgICB9CiAgICBpZiB7W2VvZiAkZmRdfSB7CglhZnRlciBpZGxlIHJlc3RhcnRhdGFncyBbbGxlbmd0aCAkYWxsaWRzXQoJaWYge1tjYXRjaCB7Y2xvc2UgJGZkfSBlcnJdfSB7CgkgICAgZXJyb3JfcG9wdXAgIkVycm9yIHJlYWRpbmcgZnVsbCBjb21taXQgZ3JhcGg6ICRlcnIuXG5cCgkJCSBSZXN1bHRzIG1heSBiZSBpbmNvbXBsZXRlLiIKCX0KICAgIH0KfQoKIyB3YWxrIGJhY2t3YXJkIHRocm91Z2ggdGhlIHRyZWUgYW5kIGNvbXB1dGUgbmVhcmVzdCB0YWdnZWQgYW5jZXN0b3JzCnByb2MgcmVzdGFydGF0YWdzIHtpfSB7CiAgICBnbG9iYWwgYWxsaWRzIGFsbHBhcmVudHMgaWR0YWdzIGFuY190YWdzIHQwCgogICAgc2V0IHQwIFtjbG9jayBjbGlja3MgLW1pbGxpc2Vjb25kc10KICAgIHdoaWxlIHtbaW5jciBpIC0xXSA+PSAwfSB7CglzZXQgaWQgW2xpbmRleCAkYWxsaWRzICRpXQoJc2V0IGF0YWdzIHt9Cglmb3JlYWNoIHAgJGFsbHBhcmVudHMoJGlkKSB7CgkgICAgaWYge1tpbmZvIGV4aXN0cyBpZHRhZ3MoJHApXX0gewoJCXNldCBwdGFncyBbbGlzdCAkcF0KCSAgICB9IGVsc2UgewoJCXNldCBwdGFncyAkYW5jX3RhZ3MoJHApCgkgICAgfQoJICAgIGlmIHskYXRhZ3MgZXEge319IHsKCQlzZXQgYXRhZ3MgJHB0YWdzCgkgICAgfSBlbHNlaWYgeyRwdGFncyBuZSAkYXRhZ3N9IHsKCQlzZXQgYXRhZ3MgW2NvbWJpbmVfYXRhZ3MgJGF0YWdzICRwdGFnc10KCSAgICB9Cgl9CglzZXQgYW5jX3RhZ3MoJGlkKSAkYXRhZ3MKCWlmIHtbY2xvY2sgY2xpY2tzIC1taWxsaXNlY29uZHNdIC0gJHQwID49IDUwfSB7CgkgICAgYWZ0ZXIgaWRsZSByZXN0YXJ0YXRhZ3MgJGkKCSAgICByZXR1cm4KCX0KICAgIH0KICAgIHNldCBhbGxjb21taXRzICJkb25lIgogICAgbm90YnVzeSBhbGxjb21taXRzCiAgICBkaXNwbmVhcnRhZ3MKfQoKcHJvYyByZXJlYWRyZWZzIHt9IHsKICAgIGdsb2JhbCBpZHRhZ3MgaWRoZWFkcyBpZG90aGVycmVmcwoKICAgIHNldCByZWZpZHMgW2NvbmNhdCBbYXJyYXkgbmFtZXMgaWR0YWdzXSBcCgkJICAgIFthcnJheSBuYW1lcyBpZGhlYWRzXSBbYXJyYXkgbmFtZXMgaWRvdGhlcnJlZnNdXQogICAgZm9yZWFjaCBpZCAkcmVmaWRzIHsKCWlmIHshW2luZm8gZXhpc3RzIHJlZigkaWQpXX0gewoJICAgIHNldCByZWYoJGlkKSBbbGlzdHJlZnMgJGlkXQoJfQogICAgfQogICAgcmVhZHJlZnMKICAgIHNldCByZWZpZHMgW2xzb3J0IC11bmlxdWUgW2NvbmNhdCAkcmVmaWRzIFthcnJheSBuYW1lcyBpZHRhZ3NdIFwKCQkJW2FycmF5IG5hbWVzIGlkaGVhZHNdIFthcnJheSBuYW1lcyBpZG90aGVycmVmc11dXQogICAgZm9yZWFjaCBpZCAkcmVmaWRzIHsKCXNldCB2IFtsaXN0cmVmcyAkaWRdCglpZiB7IVtpbmZvIGV4aXN0cyByZWYoJGlkKV0gfHwgJHJlZigkaWQpICE9ICR2fSB7CgkgICAgcmVkcmF3dGFncyAkaWQKCX0KICAgIH0KfQoKcHJvYyBsaXN0cmVmcyB7aWR9IHsKICAgIGdsb2JhbCBpZHRhZ3MgaWRoZWFkcyBpZG90aGVycmVmcwoKICAgIHNldCB4IHt9CiAgICBpZiB7W2luZm8gZXhpc3RzIGlkdGFncygkaWQpXX0gewoJc2V0IHggJGlkdGFncygkaWQpCiAgICB9CiAgICBzZXQgeSB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBpZGhlYWRzKCRpZCldfSB7CglzZXQgeSAkaWRoZWFkcygkaWQpCiAgICB9CiAgICBzZXQgeiB7fQogICAgaWYge1tpbmZvIGV4aXN0cyBpZG90aGVycmVmcygkaWQpXX0gewoJc2V0IHogJGlkb3RoZXJyZWZzKCRpZCkKICAgIH0KICAgIHJldHVybiBbbGlzdCAkeCAkeSAkel0KfQoKcHJvYyBzaG93dGFnIHt0YWcgaXNuZXd9IHsKICAgIGdsb2JhbCBjdGV4dCB0YWdjb250ZW50cyB0YWdpZHMgbGlua251bQoKICAgIGlmIHskaXNuZXd9IHsKCWFkZHRvaGlzdG9yeSBbbGlzdCBzaG93dGFnICR0YWcgMF0KICAgIH0KICAgICRjdGV4dCBjb25mIC1zdGF0ZSBub3JtYWwKICAgIGNsZWFyX2N0ZXh0CiAgICBzZXQgbGlua251bSAwCiAgICBpZiB7W2luZm8gZXhpc3RzIHRhZ2NvbnRlbnRzKCR0YWcpXX0gewoJc2V0IHRleHQgJHRhZ2NvbnRlbnRzKCR0YWcpCiAgICB9IGVsc2UgewoJc2V0IHRleHQgIlRhZzogJHRhZ1xuSWQ6ICAkdGFnaWRzKCR0YWcpIgogICAgfQogICAgYXBwZW5kd2l0aGxpbmtzICR0ZXh0IHt9CiAgICAkY3RleHQgY29uZiAtc3RhdGUgZGlzYWJsZWQKICAgIGluaXRfZmxpc3Qge30KfQoKcHJvYyBkb3F1aXQge30gewogICAgZ2xvYmFsIHN0b3BwZWQKICAgIHNldCBzdG9wcGVkIDEwMAogICAgZGVzdHJveSAuCn0KCnByb2MgZG9wcmVmcyB7fSB7CiAgICBnbG9iYWwgbWF4d2lkdGggbWF4Z3JhcGhwY3QgZGlmZm9wdHMKICAgIGdsb2JhbCBvbGRwcmVmcyBwcmVmc3RvcCBzaG93bmVhcnRhZ3MKICAgIGdsb2JhbCBiZ2NvbG9yIGZnY29sb3IgY3RleHQgZGlmZmNvbG9ycwoKICAgIHNldCB0b3AgLmdpdGtwcmVmcwogICAgc2V0IHByZWZzdG9wICR0b3AKICAgIGlmIHtbd2luZm8gZXhpc3RzICR0b3BdfSB7CglyYWlzZSAkdG9wCglyZXR1cm4KICAgIH0KICAgIGZvcmVhY2ggdiB7bWF4d2lkdGggbWF4Z3JhcGhwY3QgZGlmZm9wdHMgc2hvd25lYXJ0YWdzfSB7CglzZXQgb2xkcHJlZnMoJHYpIFtzZXQgJHZdCiAgICB9CiAgICB0b3BsZXZlbCAkdG9wCiAgICB3bSB0aXRsZSAkdG9wICJHaXRrIHByZWZlcmVuY2VzIgogICAgbGFiZWwgJHRvcC5sZGlzcCAtdGV4dCAiQ29tbWl0IGxpc3QgZGlzcGxheSBvcHRpb25zIgogICAgZ3JpZCAkdG9wLmxkaXNwIC0gLXN0aWNreSB3IC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLnNwYWNlciAtdGV4dCAiICIKICAgIGxhYmVsICR0b3AubWF4d2lkdGhsIC10ZXh0ICJNYXhpbXVtIGdyYXBoIHdpZHRoIChsaW5lcykiIFwKCS1mb250IG9wdGlvbmZvbnQKICAgIHNwaW5ib3ggJHRvcC5tYXh3aWR0aCAtZnJvbSAwIC10byAxMDAgLXdpZHRoIDQgLXRleHR2YXJpYWJsZSBtYXh3aWR0aAogICAgZ3JpZCAkdG9wLnNwYWNlciAkdG9wLm1heHdpZHRobCAkdG9wLm1heHdpZHRoIC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC5tYXhwY3RsIC10ZXh0ICJNYXhpbXVtIGdyYXBoIHdpZHRoICglIG9mIHBhbmUpIiBcCgktZm9udCBvcHRpb25mb250CiAgICBzcGluYm94ICR0b3AubWF4cGN0IC1mcm9tIDEgLXRvIDEwMCAtd2lkdGggNCAtdGV4dHZhcmlhYmxlIG1heGdyYXBocGN0CiAgICBncmlkIHggJHRvcC5tYXhwY3RsICR0b3AubWF4cGN0IC1zdGlja3kgdwoKICAgIGxhYmVsICR0b3AuZGRpc3AgLXRleHQgIkRpZmYgZGlzcGxheSBvcHRpb25zIgogICAgZ3JpZCAkdG9wLmRkaXNwIC0gLXN0aWNreSB3IC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmRpZmZvcHRsIC10ZXh0ICJPcHRpb25zIGZvciBkaWZmIHByb2dyYW0iIFwKCS1mb250IG9wdGlvbmZvbnQKICAgIGVudHJ5ICR0b3AuZGlmZm9wdCAtd2lkdGggMjAgLXRleHR2YXJpYWJsZSBkaWZmb3B0cwogICAgZ3JpZCB4ICR0b3AuZGlmZm9wdGwgJHRvcC5kaWZmb3B0IC1zdGlja3kgdwogICAgZnJhbWUgJHRvcC5udGFnCiAgICBsYWJlbCAkdG9wLm50YWcubCAtdGV4dCAiRGlzcGxheSBuZWFyYnkgdGFncyIgLWZvbnQgb3B0aW9uZm9udAogICAgY2hlY2tidXR0b24gJHRvcC5udGFnLmIgLXZhcmlhYmxlIHNob3duZWFydGFncwogICAgcGFjayAkdG9wLm50YWcuYiAkdG9wLm50YWcubCAtc2lkZSBsZWZ0CiAgICBncmlkIHggJHRvcC5udGFnIC1zdGlja3kgdwoKICAgIGxhYmVsICR0b3AuY2Rpc3AgLXRleHQgIkNvbG9yczogcHJlc3MgdG8gY2hvb3NlIgogICAgZ3JpZCAkdG9wLmNkaXNwIC0gLXN0aWNreSB3IC1wYWR5IDEwCiAgICBsYWJlbCAkdG9wLmJnIC1wYWR4IDQwIC1yZWxpZWYgc3VuayAtYmFja2dyb3VuZCAkYmdjb2xvcgogICAgYnV0dG9uICR0b3AuYmdidXQgLXRleHQgIkJhY2tncm91bmQiIC1mb250IG9wdGlvbmZvbnQgXAoJLWNvbW1hbmQgW2xpc3QgY2hvb3NlY29sb3IgYmdjb2xvciAwICR0b3AuYmcgYmFja2dyb3VuZCBzZXRiZ10KICAgIGdyaWQgeCAkdG9wLmJnYnV0ICR0b3AuYmcgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLmZnIC1wYWR4IDQwIC1yZWxpZWYgc3VuayAtYmFja2dyb3VuZCAkZmdjb2xvcgogICAgYnV0dG9uICR0b3AuZmdidXQgLXRleHQgIkZvcmVncm91bmQiIC1mb250IG9wdGlvbmZvbnQgXAoJLWNvbW1hbmQgW2xpc3QgY2hvb3NlY29sb3IgZmdjb2xvciAwICR0b3AuZmcgZm9yZWdyb3VuZCBzZXRmZ10KICAgIGdyaWQgeCAkdG9wLmZnYnV0ICR0b3AuZmcgLXN0aWNreSB3CiAgICBsYWJlbCAkdG9wLmRpZmZvbGQgLXBhZHggNDAgLXJlbGllZiBzdW5rIC1iYWNrZ3JvdW5kIFtsaW5kZXggJGRpZmZjb2xvcnMgMF0KICAgIGJ1dHRvbiAkdG9wLmRpZmZvbGRidXQgLXRleHQgIkRpZmY6IG9sZCBsaW5lcyIgLWZvbnQgb3B0aW9uZm9udCBcCgktY29tbWFuZCBbbGlzdCBjaG9vc2Vjb2xvciBkaWZmY29sb3JzIDAgJHRvcC5kaWZmb2xkICJkaWZmIG9sZCBsaW5lcyIgXAoJCSAgICAgIFtsaXN0ICRjdGV4dCB0YWcgY29uZiBkMCAtZm9yZWdyb3VuZF1dCiAgICBncmlkIHggJHRvcC5kaWZmb2xkYnV0ICR0b3AuZGlmZm9sZCAtc3RpY2t5IHcKICAgIGxhYmVsICR0b3AuZGlmZm5ldyAtcGFkeCA0MCAtcmVsaWVmIHN1bmsgLWJhY2tncm91bmQgW2xpbmRleCAkZGlmZmNvbG9ycyAxXQogICAgYnV0dG9uICR0b3AuZGlmZm5ld2J1dCAtdGV4dCAiRGlmZjogbmV3IGxpbmVzIiAtZm9udCBvcHRpb25mb250IFwKCS1jb21tYW5kIFtsaXN0IGNob29zZWNvbG9yIGRpZmZjb2xvcnMgMSAkdG9wLmRpZmZuZXcgImRpZmYgbmV3IGxpbmVzIiBcCgkJICAgICAgW2xpc3QgJGN0ZXh0IHRhZyBjb25mIGQxIC1mb3JlZ3JvdW5kXV0KICAgIGdyaWQgeCAkdG9wLmRpZmZuZXdidXQgJHRvcC5kaWZmbmV3IC1zdGlja3kgdwogICAgbGFiZWwgJHRvcC5odW5rc2VwIC1wYWR4IDQwIC1yZWxpZWYgc3VuayAtYmFja2dyb3VuZCBbbGluZGV4ICRkaWZmY29sb3JzIDJdCiAgICBidXR0b24gJHRvcC5odW5rc2VwYnV0IC10ZXh0ICJEaWZmOiBodW5rIGhlYWRlciIgLWZvbnQgb3B0aW9uZm9udCBcCgktY29tbWFuZCBbbGlzdCBjaG9vc2Vjb2xvciBkaWZmY29sb3JzIDIgJHRvcC5odW5rc2VwIFwKCQkgICAgICAiZGlmZiBodW5rIGhlYWRlciIgXAoJCSAgICAgIFtsaXN0ICRjdGV4dCB0YWcgY29uZiBodW5rc2VwIC1mb3JlZ3JvdW5kXV0KICAgIGdyaWQgeCAkdG9wLmh1bmtzZXBidXQgJHRvcC5odW5rc2VwIC1zdGlja3kgdwoKICAgIGZyYW1lICR0b3AuYnV0cwogICAgYnV0dG9uICR0b3AuYnV0cy5vayAtdGV4dCAiT0siIC1jb21tYW5kIHByZWZzb2sKICAgIGJ1dHRvbiAkdG9wLmJ1dHMuY2FuIC10ZXh0ICJDYW5jZWwiIC1jb21tYW5kIHByZWZzY2FuCiAgICBncmlkICR0b3AuYnV0cy5vayAkdG9wLmJ1dHMuY2FuCiAgICBncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdG9wLmJ1dHMgMCAtd2VpZ2h0IDEgLXVuaWZvcm0gYQogICAgZ3JpZCBjb2x1bW5jb25maWd1cmUgJHRvcC5idXRzIDEgLXdlaWdodCAxIC11bmlmb3JtIGEKICAgIGdyaWQgJHRvcC5idXRzIC0gLSAtcGFkeSAxMCAtc3RpY2t5IGV3Cn0KCnByb2MgY2hvb3NlY29sb3Ige3YgdmkgdyB4IGNtZH0gewogICAgZ2xvYmFsICR2CgogICAgc2V0IGMgW3RrX2Nob29zZUNvbG9yIC1pbml0aWFsY29sb3IgW2xpbmRleCBbc2V0ICR2XSAkdmldIFwKCSAgICAgICAtdGl0bGUgIkdpdGs6IGNob29zZSBjb2xvciBmb3IgJHgiXQogICAgaWYgeyRjIGVxIHt9fSByZXR1cm4KICAgICR3IGNvbmYgLWJhY2tncm91bmQgJGMKICAgIGxzZXQgJHYgJHZpICRjCiAgICBldmFsICRjbWQgJGMKfQoKcHJvYyBzZXRiZyB7Y30gewogICAgZ2xvYmFsIGJnbGlzdAoKICAgIGZvcmVhY2ggdyAkYmdsaXN0IHsKCSR3IGNvbmYgLWJhY2tncm91bmQgJGMKICAgIH0KfQoKcHJvYyBzZXRmZyB7Y30gewogICAgZ2xvYmFsIGZnbGlzdCBjYW52CgogICAgZm9yZWFjaCB3ICRmZ2xpc3QgewoJJHcgY29uZiAtZm9yZWdyb3VuZCAkYwogICAgfQogICAgYWxsY2FudnMgaXRlbWNvbmYgdGV4dCAtZmlsbCAkYwogICAgJGNhbnYgaXRlbWNvbmYgY2lyY2xlIC1vdXRsaW5lICRjCn0KCnByb2MgcHJlZnNjYW4ge30gewogICAgZ2xvYmFsIG1heHdpZHRoIG1heGdyYXBocGN0IGRpZmZvcHRzCiAgICBnbG9iYWwgb2xkcHJlZnMgcHJlZnN0b3Agc2hvd25lYXJ0YWdzCgogICAgZm9yZWFjaCB2IHttYXh3aWR0aCBtYXhncmFwaHBjdCBkaWZmb3B0cyBzaG93bmVhcnRhZ3N9IHsKCXNldCAkdiAkb2xkcHJlZnMoJHYpCiAgICB9CiAgICBjYXRjaCB7ZGVzdHJveSAkcHJlZnN0b3B9CiAgICB1bnNldCBwcmVmc3RvcAp9Cgpwcm9jIHByZWZzb2sge30gewogICAgZ2xvYmFsIG1heHdpZHRoIG1heGdyYXBocGN0CiAgICBnbG9iYWwgb2xkcHJlZnMgcHJlZnN0b3Agc2hvd25lYXJ0YWdzCgogICAgY2F0Y2gge2Rlc3Ryb3kgJHByZWZzdG9wfQogICAgdW5zZXQgcHJlZnN0b3AKICAgIGlmIHskbWF4d2lkdGggIT0gJG9sZHByZWZzKG1heHdpZHRoKQoJfHwgJG1heGdyYXBocGN0ICE9ICRvbGRwcmVmcyhtYXhncmFwaHBjdCl9IHsKCXJlZGlzcGxheQogICAgfSBlbHNlaWYgeyRzaG93bmVhcnRhZ3MgIT0gJG9sZHByZWZzKHNob3duZWFydGFncyl9IHsKCXJlc2VsZWN0bGluZQogICAgfQp9Cgpwcm9jIGZvcm1hdGRhdGUge2R9IHsKICAgIHJldHVybiBbY2xvY2sgZm9ybWF0ICRkIC1mb3JtYXQgIiVZLSVtLSVkICVIOiVNOiVTIl0KfQoKIyBUaGlzIGxpc3Qgb2YgZW5jb2RpbmcgbmFtZXMgYW5kIGFsaWFzZXMgaXMgZGlzdGlsbGVkIGZyb20KIyBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2NoYXJhY3Rlci1zZXRzLgojIE5vdCBhbGwgb2YgdGhlbSBhcmUgc3VwcG9ydGVkIGJ5IFRjbC4Kc2V0IGVuY29kaW5nX2FsaWFzZXMgewogICAgeyBBTlNJX1gzLjQtMTk2OCBpc28taXItNiBBTlNJX1gzLjQtMTk4NiBJU09fNjQ2LmlydjoxOTkxIEFTQ0lJCiAgICAgIElTTzY0Ni1VUyBVUy1BU0NJSSB1cyBJQk0zNjcgY3AzNjcgY3NBU0NJSSB9CiAgICB7IElTTy0xMDY0Ni1VVEYtMSBjc0lTTzEwNjQ2VVRGMSB9CiAgICB7IElTT182NDYuYmFzaWM6MTk4MyByZWYgY3NJU082NDZiYXNpYzE5ODMgfQogICAgeyBJTlZBUklBTlQgY3NJTlZBUklBTlQgfQogICAgeyBJU09fNjQ2LmlydjoxOTgzIGlzby1pci0yIGlydiBjc0lTTzJJbnRsUmVmVmVyc2lvbiB9CiAgICB7IEJTXzQ3MzAgaXNvLWlyLTQgSVNPNjQ2LUdCIGdiIHVrIGNzSVNPNFVuaXRlZEtpbmdkb20gfQogICAgeyBOQVRTLVNFRkkgaXNvLWlyLTgtMSBjc05BVFNTRUZJIH0KICAgIHsgTkFUUy1TRUZJLUFERCBpc28taXItOC0yIGNzTkFUU1NFRklBREQgfQogICAgeyBOQVRTLURBTk8gaXNvLWlyLTktMSBjc05BVFNEQU5PIH0KICAgIHsgTkFUUy1EQU5PLUFERCBpc28taXItOS0yIGNzTkFUU0RBTk9BREQgfQogICAgeyBTRU5fODUwMjAwX0IgaXNvLWlyLTEwIEZJIElTTzY0Ni1GSSBJU082NDYtU0Ugc2UgY3NJU08xMFN3ZWRpc2ggfQogICAgeyBTRU5fODUwMjAwX0MgaXNvLWlyLTExIElTTzY0Ni1TRTIgc2UyIGNzSVNPMTFTd2VkaXNoRm9yTmFtZXMgfQogICAgeyBLU19DXzU2MDEtMTk4NyBpc28taXItMTQ5IEtTX0NfNTYwMS0xOTg5IEtTQ181NjAxIGtvcmVhbiBjc0tTQzU2MDExOTg3IH0KICAgIHsgSVNPLTIwMjItS1IgY3NJU08yMDIyS1IgfQogICAgeyBFVUMtS1IgY3NFVUNLUiB9CiAgICB7IElTTy0yMDIyLUpQIGNzSVNPMjAyMkpQIH0KICAgIHsgSVNPLTIwMjItSlAtMiBjc0lTTzIwMjJKUDIgfQogICAgeyBKSVNfQzYyMjAtMTk2OS1qcCBKSVNfQzYyMjAtMTk2OSBpc28taXItMTMga2F0YWthbmEgeDAyMDEtNwogICAgICBjc0lTTzEzSklTQzYyMjBqcCB9CiAgICB7IEpJU19DNjIyMC0xOTY5LXJvIGlzby1pci0xNCBqcCBJU082NDYtSlAgY3NJU08xNEpJU0M2MjIwcm8gfQogICAgeyBJVCBpc28taXItMTUgSVNPNjQ2LUlUIGNzSVNPMTVJdGFsaWFuIH0KICAgIHsgUFQgaXNvLWlyLTE2IElTTzY0Ni1QVCBjc0lTTzE2UG9ydHVndWVzZSB9CiAgICB7IEVTIGlzby1pci0xNyBJU082NDYtRVMgY3NJU08xN1NwYW5pc2ggfQogICAgeyBncmVlazctb2xkIGlzby1pci0xOCBjc0lTTzE4R3JlZWs3T2xkIH0KICAgIHsgbGF0aW4tZ3JlZWsgaXNvLWlyLTE5IGNzSVNPMTlMYXRpbkdyZWVrIH0KICAgIHsgRElOXzY2MDAzIGlzby1pci0yMSBkZSBJU082NDYtREUgY3NJU08yMUdlcm1hbiB9CiAgICB7IE5GX1pfNjItMDEwXygxOTczKSBpc28taXItMjUgSVNPNjQ2LUZSMSBjc0lTTzI1RnJlbmNoIH0KICAgIHsgTGF0aW4tZ3JlZWstMSBpc28taXItMjcgY3NJU08yN0xhdGluR3JlZWsxIH0KICAgIHsgSVNPXzU0MjcgaXNvLWlyLTM3IGNzSVNPNTQyN0N5cmlsbGljIH0KICAgIHsgSklTX0M2MjI2LTE5NzggaXNvLWlyLTQyIGNzSVNPNDJKSVNDNjIyNjE5NzggfQogICAgeyBCU192aWV3ZGF0YSBpc28taXItNDcgY3NJU080N0JTVmlld2RhdGEgfQogICAgeyBJTklTIGlzby1pci00OSBjc0lTTzQ5SU5JUyB9CiAgICB7IElOSVMtOCBpc28taXItNTAgY3NJU081MElOSVM4IH0KICAgIHsgSU5JUy1jeXJpbGxpYyBpc28taXItNTEgY3NJU081MUlOSVNDeXJpbGxpYyB9CiAgICB7IElTT181NDI3OjE5ODEgaXNvLWlyLTU0IElTTzU0MjdDeXJpbGxpYzE5ODEgfQogICAgeyBJU09fNTQyODoxOTgwIGlzby1pci01NSBjc0lTTzU0MjhHcmVlayB9CiAgICB7IEdCXzE5ODgtODAgaXNvLWlyLTU3IGNuIElTTzY0Ni1DTiBjc0lTTzU3R0IxOTg4IH0KICAgIHsgR0JfMjMxMi04MCBpc28taXItNTggY2hpbmVzZSBjc0lTTzU4R0IyMzEyODAgfQogICAgeyBOU180NTUxLTEgaXNvLWlyLTYwIElTTzY0Ni1OTyBubyBjc0lTTzYwRGFuaXNoTm9yd2VnaWFuCiAgICAgIGNzSVNPNjBOb3J3ZWdpYW4xIH0KICAgIHsgTlNfNDU1MS0yIElTTzY0Ni1OTzIgaXNvLWlyLTYxIG5vMiBjc0lTTzYxTm9yd2VnaWFuMiB9CiAgICB7IE5GX1pfNjItMDEwIGlzby1pci02OSBJU082NDYtRlIgZnIgY3NJU082OUZyZW5jaCB9CiAgICB7IHZpZGVvdGV4LXN1cHBsIGlzby1pci03MCBjc0lTTzcwVmlkZW90ZXhTdXBwMSB9CiAgICB7IFBUMiBpc28taXItODQgSVNPNjQ2LVBUMiBjc0lTTzg0UG9ydHVndWVzZTIgfQogICAgeyBFUzIgaXNvLWlyLTg1IElTTzY0Ni1FUzIgY3NJU084NVNwYW5pc2gyIH0KICAgIHsgTVNaXzc3OTUuMyBpc28taXItODYgSVNPNjQ2LUhVIGh1IGNzSVNPODZIdW5nYXJpYW4gfQogICAgeyBKSVNfQzYyMjYtMTk4MyBpc28taXItODcgeDAyMDggSklTX1gwMjA4LTE5ODMgY3NJU084N0pJU1gwMjA4IH0KICAgIHsgZ3JlZWs3IGlzby1pci04OCBjc0lTTzg4R3JlZWs3IH0KICAgIHsgQVNNT180NDkgSVNPXzkwMzYgYXJhYmljNyBpc28taXItODkgY3NJU084OUFTTU80NDkgfQogICAgeyBpc28taXItOTAgY3NJU085MCB9CiAgICB7IEpJU19DNjIyOS0xOTg0LWEgaXNvLWlyLTkxIGpwLW9jci1hIGNzSVNPOTFKSVNDNjIyOTE5ODRhIH0KICAgIHsgSklTX0M2MjI5LTE5ODQtYiBpc28taXItOTIgSVNPNjQ2LUpQLU9DUi1CIGpwLW9jci1iCiAgICAgIGNzSVNPOTJKSVNDNjI5OTE5ODRiIH0KICAgIHsgSklTX0M2MjI5LTE5ODQtYi1hZGQgaXNvLWlyLTkzIGpwLW9jci1iLWFkZCBjc0lTTzkzSklTNjIyOTE5ODRiYWRkIH0KICAgIHsgSklTX0M2MjI5LTE5ODQtaGFuZCBpc28taXItOTQganAtb2NyLWhhbmQgY3NJU085NEpJUzYyMjkxOTg0aGFuZCB9CiAgICB7IEpJU19DNjIyOS0xOTg0LWhhbmQtYWRkIGlzby1pci05NSBqcC1vY3ItaGFuZC1hZGQKICAgICAgY3NJU085NUpJUzYyMjkxOTg0aGFuZGFkZCB9CiAgICB7IEpJU19DNjIyOS0xOTg0LWthbmEgaXNvLWlyLTk2IGNzSVNPOTZKSVNDNjIyOTE5ODRrYW5hIH0KICAgIHsgSVNPXzIwMzMtMTk4MyBpc28taXItOTggZTEzYiBjc0lTTzIwMzMgfQogICAgeyBBTlNJX1gzLjExMC0xOTgzIGlzby1pci05OSBDU0FfVDUwMC0xOTgzIE5BUExQUyBjc0lTTzk5TkFQTFBTIH0KICAgIHsgSVNPXzg4NTktMToxOTg3IGlzby1pci0xMDAgSVNPXzg4NTktMSBJU08tODg1OS0xIGxhdGluMSBsMSBJQk04MTkKICAgICAgQ1A4MTkgY3NJU09MYXRpbjEgfQogICAgeyBJU09fODg1OS0yOjE5ODcgaXNvLWlyLTEwMSBJU09fODg1OS0yIElTTy04ODU5LTIgbGF0aW4yIGwyIGNzSVNPTGF0aW4yIH0KICAgIHsgVC42MS03Yml0IGlzby1pci0xMDIgY3NJU08xMDJUNjE3Yml0IH0KICAgIHsgVC42MS04Yml0IFQuNjEgaXNvLWlyLTEwMyBjc0lTTzEwM1Q2MThiaXQgfQogICAgeyBJU09fODg1OS0zOjE5ODggaXNvLWlyLTEwOSBJU09fODg1OS0zIElTTy04ODU5LTMgbGF0aW4zIGwzIGNzSVNPTGF0aW4zIH0KICAgIHsgSVNPXzg4NTktNDoxOTg4IGlzby1pci0xMTAgSVNPXzg4NTktNCBJU08tODg1OS00IGxhdGluNCBsNCBjc0lTT0xhdGluNCB9CiAgICB7IEVDTUEtY3lyaWxsaWMgaXNvLWlyLTExMSBLT0k4LUUgY3NJU08xMTFFQ01BQ3lyaWxsaWMgfQogICAgeyBDU0FfWjI0My40LTE5ODUtMSBpc28taXItMTIxIElTTzY0Ni1DQSBjc2E3LTEgY2EgY3NJU08xMjFDYW5hZGlhbjEgfQogICAgeyBDU0FfWjI0My40LTE5ODUtMiBpc28taXItMTIyIElTTzY0Ni1DQTIgY3NhNy0yIGNzSVNPMTIyQ2FuYWRpYW4yIH0KICAgIHsgQ1NBX1oyNDMuNC0xOTg1LWdyIGlzby1pci0xMjMgY3NJU08xMjNDU0FaMjQzNDE5ODVnciB9CiAgICB7IElTT184ODU5LTY6MTk4NyBpc28taXItMTI3IElTT184ODU5LTYgSVNPLTg4NTktNiBFQ01BLTExNCBBU01PLTcwOAogICAgICBhcmFiaWMgY3NJU09MYXRpbkFyYWJpYyB9CiAgICB7IElTT184ODU5LTYtRSBjc0lTTzg4NTk2RSBJU08tODg1OS02LUUgfQogICAgeyBJU09fODg1OS02LUkgY3NJU084ODU5NkkgSVNPLTg4NTktNi1JIH0KICAgIHsgSVNPXzg4NTktNzoxOTg3IGlzby1pci0xMjYgSVNPXzg4NTktNyBJU08tODg1OS03IEVMT1RfOTI4IEVDTUEtMTE4CiAgICAgIGdyZWVrIGdyZWVrOCBjc0lTT0xhdGluR3JlZWsgfQogICAgeyBULjEwMS1HMiBpc28taXItMTI4IGNzSVNPMTI4VDEwMUcyIH0KICAgIHsgSVNPXzg4NTktODoxOTg4IGlzby1pci0xMzggSVNPXzg4NTktOCBJU08tODg1OS04IGhlYnJldwogICAgICBjc0lTT0xhdGluSGVicmV3IH0KICAgIHsgSVNPXzg4NTktOC1FIGNzSVNPODg1OThFIElTTy04ODU5LTgtRSB9CiAgICB7IElTT184ODU5LTgtSSBjc0lTTzg4NTk4SSBJU08tODg1OS04LUkgfQogICAgeyBDU05fMzY5MTAzIGlzby1pci0xMzkgY3NJU08xMzlDU04zNjkxMDMgfQogICAgeyBKVVNfSS5CMS4wMDIgaXNvLWlyLTE0MSBJU082NDYtWVUganMgeXUgY3NJU08xNDFKVVNJQjEwMDIgfQogICAgeyBJU09fNjkzNy0yLWFkZCBpc28taXItMTQyIGNzSVNPVGV4dENvbW0gfQogICAgeyBJRUNfUDI3LTEgaXNvLWlyLTE0MyBjc0lTTzE0M0lFQ1AyNzEgfQogICAgeyBJU09fODg1OS01OjE5ODggaXNvLWlyLTE0NCBJU09fODg1OS01IElTTy04ODU5LTUgY3lyaWxsaWMKICAgICAgY3NJU09MYXRpbkN5cmlsbGljIH0KICAgIHsgSlVTX0kuQjEuMDAzLXNlcmIgaXNvLWlyLTE0NiBzZXJiaWFuIGNzSVNPMTQ2U2VyYmlhbiB9CiAgICB7IEpVU19JLkIxLjAwMy1tYWMgbWFjZWRvbmlhbiBpc28taXItMTQ3IGNzSVNPMTQ3TWFjZWRvbmlhbiB9CiAgICB7IElTT184ODU5LTk6MTk4OSBpc28taXItMTQ4IElTT184ODU5LTkgSVNPLTg4NTktOSBsYXRpbjUgbDUgY3NJU09MYXRpbjUgfQogICAgeyBncmVlay1jY2l0dCBpc28taXItMTUwIGNzSVNPMTUwIGNzSVNPMTUwR3JlZWtDQ0lUVCB9CiAgICB7IE5DX05DMDAtMTA6ODEgY3ViYSBpc28taXItMTUxIElTTzY0Ni1DVSBjc0lTTzE1MUN1YmEgfQogICAgeyBJU09fNjkzNy0yLTI1IGlzby1pci0xNTIgY3NJU082OTM3QWRkIH0KICAgIHsgR09TVF8xOTc2OC03NCBTVF9TRVZfMzU4LTg4IGlzby1pci0xNTMgY3NJU08xNTNHT1NUMTk3Njg3NCB9CiAgICB7IElTT184ODU5LXN1cHAgaXNvLWlyLTE1NCBsYXRpbjEtMi01IGNzSVNPODg1OVN1cHAgfQogICAgeyBJU09fMTAzNjctYm94IGlzby1pci0xNTUgY3NJU08xMDM2N0JveCB9CiAgICB7IElTTy04ODU5LTEwIGlzby1pci0xNTcgbDYgSVNPXzg4NTktMTA6MTk5MiBjc0lTT0xhdGluNiBsYXRpbjYgfQogICAgeyBsYXRpbi1sYXAgbGFwIGlzby1pci0xNTggY3NJU08xNThMYXAgfQogICAgeyBKSVNfWDAyMTItMTk5MCB4MDIxMiBpc28taXItMTU5IGNzSVNPMTU5SklTWDAyMTIxOTkwIH0KICAgIHsgRFNfMjA4OSBEUzIwODkgSVNPNjQ2LURLIGRrIGNzSVNPNjQ2RGFuaXNoIH0KICAgIHsgdXMtZGsgY3NVU0RLIH0KICAgIHsgZGstdXMgY3NES1VTIH0KICAgIHsgSklTX1gwMjAxIFgwMjAxIGNzSGFsZldpZHRoS2F0YWthbmEgfQogICAgeyBLU0M1NjM2IElTTzY0Ni1LUiBjc0tTQzU2MzYgfQogICAgeyBJU08tMTA2NDYtVUNTLTIgY3NVbmljb2RlIH0KICAgIHsgSVNPLTEwNjQ2LVVDUy00IGNzVUNTNCB9CiAgICB7IERFQy1NQ1MgZGVjIGNzREVDTUNTIH0KICAgIHsgaHAtcm9tYW44IHJvbWFuOCByOCBjc0hQUm9tYW44IH0KICAgIHsgbWFjaW50b3NoIG1hYyBjc01hY2ludG9zaCB9CiAgICB7IElCTTAzNyBjcDAzNyBlYmNkaWMtY3AtdXMgZWJjZGljLWNwLWNhIGViY2RpYy1jcC13dCBlYmNkaWMtY3AtbmwKICAgICAgY3NJQk0wMzcgfQogICAgeyBJQk0wMzggRUJDRElDLUlOVCBjcDAzOCBjc0lCTTAzOCB9CiAgICB7IElCTTI3MyBDUDI3MyBjc0lCTTI3MyB9CiAgICB7IElCTTI3NCBFQkNESUMtQkUgQ1AyNzQgY3NJQk0yNzQgfQogICAgeyBJQk0yNzUgRUJDRElDLUJSIGNwMjc1IGNzSUJNMjc1IH0KICAgIHsgSUJNMjc3IEVCQ0RJQy1DUC1ESyBFQkNESUMtQ1AtTk8gY3NJQk0yNzcgfQogICAgeyBJQk0yNzggQ1AyNzggZWJjZGljLWNwLWZpIGViY2RpYy1jcC1zZSBjc0lCTTI3OCB9CiAgICB7IElCTTI4MCBDUDI4MCBlYmNkaWMtY3AtaXQgY3NJQk0yODAgfQogICAgeyBJQk0yODEgRUJDRElDLUpQLUUgY3AyODEgY3NJQk0yODEgfQogICAgeyBJQk0yODQgQ1AyODQgZWJjZGljLWNwLWVzIGNzSUJNMjg0IH0KICAgIHsgSUJNMjg1IENQMjg1IGViY2RpYy1jcC1nYiBjc0lCTTI4NSB9CiAgICB7IElCTTI5MCBjcDI5MCBFQkNESUMtSlAta2FuYSBjc0lCTTI5MCB9CiAgICB7IElCTTI5NyBjcDI5NyBlYmNkaWMtY3AtZnIgY3NJQk0yOTcgfQogICAgeyBJQk00MjAgY3A0MjAgZWJjZGljLWNwLWFyMSBjc0lCTTQyMCB9CiAgICB7IElCTTQyMyBjcDQyMyBlYmNkaWMtY3AtZ3IgY3NJQk00MjMgfQogICAgeyBJQk00MjQgY3A0MjQgZWJjZGljLWNwLWhlIGNzSUJNNDI0IH0KICAgIHsgSUJNNDM3IGNwNDM3IDQzNyBjc1BDOENvZGVQYWdlNDM3IH0KICAgIHsgSUJNNTAwIENQNTAwIGViY2RpYy1jcC1iZSBlYmNkaWMtY3AtY2ggY3NJQk01MDAgfQogICAgeyBJQk03NzUgY3A3NzUgY3NQQzc3NUJhbHRpYyB9CiAgICB7IElCTTg1MCBjcDg1MCA4NTAgY3NQQzg1ME11bHRpbGluZ3VhbCB9CiAgICB7IElCTTg1MSBjcDg1MSA4NTEgY3NJQk04NTEgfQogICAgeyBJQk04NTIgY3A4NTIgODUyIGNzUENwODUyIH0KICAgIHsgSUJNODU1IGNwODU1IDg1NSBjc0lCTTg1NSB9CiAgICB7IElCTTg1NyBjcDg1NyA4NTcgY3NJQk04NTcgfQogICAgeyBJQk04NjAgY3A4NjAgODYwIGNzSUJNODYwIH0KICAgIHsgSUJNODYxIGNwODYxIDg2MSBjcC1pcyBjc0lCTTg2MSB9CiAgICB7IElCTTg2MiBjcDg2MiA4NjIgY3NQQzg2MkxhdGluSGVicmV3IH0KICAgIHsgSUJNODYzIGNwODYzIDg2MyBjc0lCTTg2MyB9CiAgICB7IElCTTg2NCBjcDg2NCBjc0lCTTg2NCB9CiAgICB7IElCTTg2NSBjcDg2NSA4NjUgY3NJQk04NjUgfQogICAgeyBJQk04NjYgY3A4NjYgODY2IGNzSUJNODY2IH0KICAgIHsgSUJNODY4IENQODY4IGNwLWFyIGNzSUJNODY4IH0KICAgIHsgSUJNODY5IGNwODY5IDg2OSBjcC1nciBjc0lCTTg2OSB9CiAgICB7IElCTTg3MCBDUDg3MCBlYmNkaWMtY3Atcm9lY2UgZWJjZGljLWNwLXl1IGNzSUJNODcwIH0KICAgIHsgSUJNODcxIENQODcxIGViY2RpYy1jcC1pcyBjc0lCTTg3MSB9CiAgICB7IElCTTg4MCBjcDg4MCBFQkNESUMtQ3lyaWxsaWMgY3NJQk04ODAgfQogICAgeyBJQk04OTEgY3A4OTEgY3NJQk04OTEgfQogICAgeyBJQk05MDMgY3A5MDMgY3NJQk05MDMgfQogICAgeyBJQk05MDQgY3A5MDQgOTA0IGNzSUJCTTkwNCB9CiAgICB7IElCTTkwNSBDUDkwNSBlYmNkaWMtY3AtdHIgY3NJQk05MDUgfQogICAgeyBJQk05MTggQ1A5MTggZWJjZGljLWNwLWFyMiBjc0lCTTkxOCB9CiAgICB7IElCTTEwMjYgQ1AxMDI2IGNzSUJNMTAyNiB9CiAgICB7IEVCQ0RJQy1BVC1ERSBjc0lCTUVCQ0RJQ0FUREUgfQogICAgeyBFQkNESUMtQVQtREUtQSBjc0VCQ0RJQ0FUREVBIH0KICAgIHsgRUJDRElDLUNBLUZSIGNzRUJDRElDQ0FGUiB9CiAgICB7IEVCQ0RJQy1ESy1OTyBjc0VCQ0RJQ0RLTk8gfQogICAgeyBFQkNESUMtREstTk8tQSBjc0VCQ0RJQ0RLTk9BIH0KICAgIHsgRUJDRElDLUZJLVNFIGNzRUJDRElDRklTRSB9CiAgICB7IEVCQ0RJQy1GSS1TRS1BIGNzRUJDRElDRklTRUEgfQogICAgeyBFQkNESUMtRlIgY3NFQkNESUNGUiB9CiAgICB7IEVCQ0RJQy1JVCBjc0VCQ0RJQ0lUIH0KICAgIHsgRUJDRElDLVBUIGNzRUJDRElDUFQgfQogICAgeyBFQkNESUMtRVMgY3NFQkNESUNFUyB9CiAgICB7IEVCQ0RJQy1FUy1BIGNzRUJDRElDRVNBIH0KICAgIHsgRUJDRElDLUVTLVMgY3NFQkNESUNFU1MgfQogICAgeyBFQkNESUMtVUsgY3NFQkNESUNVSyB9CiAgICB7IEVCQ0RJQy1VUyBjc0VCQ0RJQ1VTIH0KICAgIHsgVU5LTk9XTi04QklUIGNzVW5rbm93bjhCaVQgfQogICAgeyBNTkVNT05JQyBjc01uZW1vbmljIH0KICAgIHsgTU5FTSBjc01uZW0gfQogICAgeyBWSVNDSUkgY3NWSVNDSUkgfQogICAgeyBWSVFSIGNzVklRUiB9CiAgICB7IEtPSTgtUiBjc0tPSThSIH0KICAgIHsgSUJNMDA4NTggQ0NTSUQwMDg1OCBDUDAwODU4IFBDLU11bHRpbGluZ3VhbC04NTArZXVybyB9CiAgICB7IElCTTAwOTI0IENDU0lEMDA5MjQgQ1AwMDkyNCBlYmNkaWMtTGF0aW45LS1ldXJvIH0KICAgIHsgSUJNMDExNDAgQ0NTSUQwMTE0MCBDUDAxMTQwIGViY2RpYy11cy0zNytldXJvIH0KICAgIHsgSUJNMDExNDEgQ0NTSUQwMTE0MSBDUDAxMTQxIGViY2RpYy1kZS0yNzMrZXVybyB9CiAgICB7IElCTTAxMTQyIENDU0lEMDExNDIgQ1AwMTE0MiBlYmNkaWMtZGstMjc3K2V1cm8gZWJjZGljLW5vLTI3NytldXJvIH0KICAgIHsgSUJNMDExNDMgQ0NTSUQwMTE0MyBDUDAxMTQzIGViY2RpYy1maS0yNzgrZXVybyBlYmNkaWMtc2UtMjc4K2V1cm8gfQogICAgeyBJQk0wMTE0NCBDQ1NJRDAxMTQ0IENQMDExNDQgZWJjZGljLWl0LTI4MCtldXJvIH0KICAgIHsgSUJNMDExNDUgQ0NTSUQwMTE0NSBDUDAxMTQ1IGViY2RpYy1lcy0yODQrZXVybyB9CiAgICB7IElCTTAxMTQ2IENDU0lEMDExNDYgQ1AwMTE0NiBlYmNkaWMtZ2ItMjg1K2V1cm8gfQogICAgeyBJQk0wMTE0NyBDQ1NJRDAxMTQ3IENQMDExNDcgZWJjZGljLWZyLTI5NytldXJvIH0KICAgIHsgSUJNMDExNDggQ0NTSUQwMTE0OCBDUDAxMTQ4IGViY2RpYy1pbnRlcm5hdGlvbmFsLTUwMCtldXJvIH0KICAgIHsgSUJNMDExNDkgQ0NTSUQwMTE0OSBDUDAxMTQ5IGViY2RpYy1pcy04NzErZXVybyB9CiAgICB7IElCTTEwNDcgSUJNLTEwNDcgfQogICAgeyBQVENQMTU0IGNzUFRDUDE1NCBQVDE1NCBDUDE1NCBDeXJpbGxpYy1Bc2lhbiB9CiAgICB7IEFtaWdhLTEyNTEgQW1pMTI1MSBBbWlnYTEyNTEgQW1pLTEyNTEgfQogICAgeyBVTklDT0RFLTEtMSBjc1VuaWNvZGUxMSB9CiAgICB7IENFU1UtOCBjc0NFU1UtOCB9CiAgICB7IEJPQ1UtMSBjc0JPQ1UtMSB9CiAgICB7IFVOSUNPREUtMS0xLVVURi03IGNzVW5pY29kZTExVVRGNyB9CiAgICB7IElTTy04ODU5LTE0IGlzby1pci0xOTkgSVNPXzg4NTktMTQ6MTk5OCBJU09fODg1OS0xNCBsYXRpbjggaXNvLWNlbHRpYwogICAgICBsOCB9CiAgICB7IElTTy04ODU5LTE1IElTT184ODU5LTE1IExhdGluLTkgfQogICAgeyBJU08tODg1OS0xNiBpc28taXItMjI2IElTT184ODU5LTE2OjIwMDEgSVNPXzg4NTktMTYgbGF0aW4xMCBsMTAgfQogICAgeyBHQksgQ1A5MzYgTVM5MzYgd2luZG93cy05MzYgfQogICAgeyBKSVNfRW5jb2RpbmcgY3NKSVNFbmNvZGluZyB9CiAgICB7IFNoaWZ0X0pJUyBNU19LYW5qaSBjc1NoaWZ0SklTIH0KICAgIHsgRXh0ZW5kZWRfVU5JWF9Db2RlX1BhY2tlZF9Gb3JtYXRfZm9yX0phcGFuZXNlIGNzRVVDUGtkRm10SmFwYW5lc2UKICAgICAgRVVDLUpQIH0KICAgIHsgRXh0ZW5kZWRfVU5JWF9Db2RlX0ZpeGVkX1dpZHRoX2Zvcl9KYXBhbmVzZSBjc0VVQ0ZpeFdpZEphcGFuZXNlIH0KICAgIHsgSVNPLTEwNjQ2LVVDUy1CYXNpYyBjc1VuaWNvZGVBU0NJSSB9CiAgICB7IElTTy0xMDY0Ni1Vbmljb2RlLUxhdGluMSBjc1VuaWNvZGVMYXRpbjEgSVNPLTEwNjQ2IH0KICAgIHsgSVNPLVVuaWNvZGUtSUJNLTEyNjEgY3NVbmljb2RlSUJNMTI2MSB9CiAgICB7IElTTy1Vbmljb2RlLUlCTS0xMjY4IGNzVW5pY29kZUlCTTEyNjggfQogICAgeyBJU08tVW5pY29kZS1JQk0tMTI3NiBjc1VuaWNvZGVJQk0xMjc2IH0KICAgIHsgSVNPLVVuaWNvZGUtSUJNLTEyNjQgY3NVbmljb2RlSUJNMTI2NCB9CiAgICB7IElTTy1Vbmljb2RlLUlCTS0xMjY1IGNzVW5pY29kZUlCTTEyNjUgfQogICAgeyBJU08tODg1OS0xLVdpbmRvd3MtMy4wLUxhdGluLTEgY3NXaW5kb3dzMzBMYXRpbjEgfQogICAgeyBJU08tODg1OS0xLVdpbmRvd3MtMy4xLUxhdGluLTEgY3NXaW5kb3dzMzFMYXRpbjEgfQogICAgeyBJU08tODg1OS0yLVdpbmRvd3MtTGF0aW4tMiBjc1dpbmRvd3MzMUxhdGluMiB9CiAgICB7IElTTy04ODU5LTktV2luZG93cy1MYXRpbi01IGNzV2luZG93czMxTGF0aW41IH0KICAgIHsgQWRvYmUtU3RhbmRhcmQtRW5jb2RpbmcgY3NBZG9iZVN0YW5kYXJkRW5jb2RpbmcgfQogICAgeyBWZW50dXJhLVVTIGNzVmVudHVyYVVTIH0KICAgIHsgVmVudHVyYS1JbnRlcm5hdGlvbmFsIGNzVmVudHVyYUludGVybmF0aW9uYWwgfQogICAgeyBQQzgtRGFuaXNoLU5vcndlZ2lhbiBjc1BDOERhbmlzaE5vcndlZ2lhbiB9CiAgICB7IFBDOC1UdXJraXNoIGNzUEM4VHVya2lzaCB9CiAgICB7IElCTS1TeW1ib2xzIGNzSUJNU3ltYm9scyB9CiAgICB7IElCTS1UaGFpIGNzSUJNVGhhaSB9CiAgICB7IEhQLUxlZ2FsIGNzSFBMZWdhbCB9CiAgICB7IEhQLVBpLWZvbnQgY3NIUFBpRm9udCB9CiAgICB7IEhQLU1hdGg4IGNzSFBNYXRoOCB9CiAgICB7IEFkb2JlLVN5bWJvbC1FbmNvZGluZyBjc0hQUFNNYXRoIH0KICAgIHsgSFAtRGVza1RvcCBjc0hQRGVza3RvcCB9CiAgICB7IFZlbnR1cmEtTWF0aCBjc1ZlbnR1cmFNYXRoIH0KICAgIHsgTWljcm9zb2Z0LVB1Ymxpc2hpbmcgY3NNaWNyb3NvZnRQdWJsaXNoaW5nIH0KICAgIHsgV2luZG93cy0zMUogY3NXaW5kb3dzMzFKIH0KICAgIHsgR0IyMzEyIGNzR0IyMzEyIH0KICAgIHsgQmlnNSBjc0JpZzUgfQp9Cgpwcm9jIHRjbF9lbmNvZGluZyB7ZW5jfSB7CiAgICBnbG9iYWwgZW5jb2RpbmdfYWxpYXNlcwogICAgc2V0IG5hbWVzIFtlbmNvZGluZyBuYW1lc10KICAgIHNldCBsY25hbWVzIFtzdHJpbmcgdG9sb3dlciAkbmFtZXNdCiAgICBzZXQgZW5jIFtzdHJpbmcgdG9sb3dlciAkZW5jXQogICAgc2V0IGkgW2xzZWFyY2ggLWV4YWN0ICRsY25hbWVzICRlbmNdCiAgICBpZiB7JGkgPCAwfSB7CgkjIGxvb2sgZm9yICJpc29ubm4iIGluc3RlYWQgb2YgImlzby1ubm4iIG9yICJpc29fbm5uIgoJaWYge1tyZWdzdWIge15pc29bLV9dfSAkZW5jIGlzbyBlbmN4XX0gewoJICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAkbGNuYW1lcyAkZW5jeF0KCX0KICAgIH0KICAgIGlmIHskaSA8IDB9IHsKCWZvcmVhY2ggbCAkZW5jb2RpbmdfYWxpYXNlcyB7CgkgICAgc2V0IGxsIFtzdHJpbmcgdG9sb3dlciAkbF0KCSAgICBpZiB7W2xzZWFyY2ggLWV4YWN0ICRsbCAkZW5jXSA8IDB9IGNvbnRpbnVlCgkgICAgIyBsb29rIHRocm91Z2ggdGhlIGFsaWFzZXMgZm9yIG9uZSB0aGF0IHRjbCBrbm93cyBhYm91dAoJICAgIGZvcmVhY2ggZSAkbGwgewoJCXNldCBpIFtsc2VhcmNoIC1leGFjdCAkbGNuYW1lcyAkZV0KCQlpZiB7JGkgPCAwfSB7CgkJICAgIGlmIHtbcmVnc3ViIHteaXNvWy1fXX0gJGUgaXNvIGV4XX0gewoJCQlzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJGxjbmFtZXMgJGV4XQoJCSAgICB9CgkJfQoJCWlmIHskaSA+PSAwfSBicmVhawoJICAgIH0KCSAgICBicmVhawoJfQogICAgfQogICAgaWYgeyRpID49IDB9IHsKCXJldHVybiBbbGluZGV4ICRuYW1lcyAkaV0KICAgIH0KICAgIHJldHVybiB7fQp9CgojIGRlZmF1bHRzLi4uCnNldCBkYXRlbW9kZSAwCnNldCBkaWZmb3B0cyAiLVUgNSAtcCIKc2V0IHdyY29tY21kICJnaXQgZGlmZi10cmVlIC0tc3RkaW4gLXAgLS1wcmV0dHkiCgpzZXQgZ2l0ZW5jb2Rpbmcge30KY2F0Y2ggewogICAgc2V0IGdpdGVuY29kaW5nIFtleGVjIGdpdCByZXBvLWNvbmZpZyAtLWdldCBpMThuLmNvbW1pdGVuY29kaW5nXQp9CmlmIHskZ2l0ZW5jb2RpbmcgPT0gIiJ9IHsKICAgIHNldCBnaXRlbmNvZGluZyAidXRmLTgiCn0Kc2V0IHRjbGVuY29kaW5nIFt0Y2xfZW5jb2RpbmcgJGdpdGVuY29kaW5nXQppZiB7JHRjbGVuY29kaW5nID09IHt9fSB7CiAgICBwdXRzIHN0ZGVyciAiV2FybmluZzogZW5jb2RpbmcgJGdpdGVuY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgVGNsL1RrIgp9CgpzZXQgbWFpbmZvbnQge0hlbHZldGljYSA5fQpzZXQgdGV4dGZvbnQge0NvdXJpZXIgOX0Kc2V0IHVpZm9udCB7SGVsdmV0aWNhIDkgYm9sZH0Kc2V0IGZpbmRtZXJnZWZpbGVzIDAKc2V0IG1heGdyYXBocGN0IDUwCnNldCBtYXh3aWR0aCAxNgpzZXQgcmV2bGlzdG9yZGVyIDAKc2V0IGZhc3RkYXRlIDAKc2V0IHVwYXJyb3dsZW4gNwpzZXQgZG93bmFycm93bGVuIDcKc2V0IG1pbmdhcGxlbiAzMApzZXQgY21pdG1vZGUgInBhdGNoIgpzZXQgd3JhcGNvbW1lbnQgIm5vbmUiCnNldCBzaG93bmVhcnRhZ3MgMQoKc2V0IGNvbG9ycyB7Z3JlZW4gcmVkIGJsdWUgbWFnZW50YSBkYXJrZ3JleSBicm93biBvcmFuZ2V9CnNldCBiZ2NvbG9yIHdoaXRlCnNldCBmZ2NvbG9yIGJsYWNrCnNldCBkaWZmY29sb3JzIHtyZWQgIiMwMGEwMDAiIGJsdWV9CgpjYXRjaCB7c291cmNlIH4vLmdpdGt9Cgpmb250IGNyZWF0ZSBvcHRpb25mb250IC1mYW1pbHkgc2Fucy1zZXJpZiAtc2l6ZSAtMTIKCnNldCByZXZ0cmVlYXJncyB7fQpmb3JlYWNoIGFyZyAkYXJndiB7CiAgICBzd2l0Y2ggLXJlZ2V4cCAtLSAkYXJnIHsKCSJeJCIgeyB9CgkiXi1kIiB7IHNldCBkYXRlbW9kZSAxIH0KCWRlZmF1bHQgewoJICAgIGxhcHBlbmQgcmV2dHJlZWFyZ3MgJGFyZwoJfQogICAgfQp9CgojIGNoZWNrIHRoYXQgd2UgY2FuIGZpbmQgYSAuZ2l0IGRpcmVjdG9yeSBzb21ld2hlcmUuLi4Kc2V0IGdpdGRpciBbZ2l0ZGlyXQppZiB7IVtmaWxlIGlzZGlyZWN0b3J5ICRnaXRkaXJdfSB7CiAgICBzaG93X2Vycm9yIHt9IC4gIkNhbm5vdCBmaW5kIHRoZSBnaXQgZGlyZWN0b3J5IFwiJGdpdGRpclwiLiIKICAgIGV4aXQgMQp9CgpzZXQgY21kbGluZV9maWxlcyB7fQpzZXQgaSBbbHNlYXJjaCAtZXhhY3QgJHJldnRyZWVhcmdzICItLSJdCmlmIHskaSA+PSAwfSB7CiAgICBzZXQgY21kbGluZV9maWxlcyBbbHJhbmdlICRyZXZ0cmVlYXJncyBbZXhwciB7JGkgKyAxfV0gZW5kXQogICAgc2V0IHJldnRyZWVhcmdzIFtscmFuZ2UgJHJldnRyZWVhcmdzIDAgW2V4cHIgeyRpIC0gMX1dXQp9IGVsc2VpZiB7JHJldnRyZWVhcmdzIG5lIHt9fSB7CiAgICBpZiB7W2NhdGNoIHsKCXNldCBmIFtldmFsIGV4ZWMgZ2l0IHJldi1wYXJzZSAtLW5vLXJldnMgLS1uby1mbGFncyAkcmV2dHJlZWFyZ3NdCglzZXQgY21kbGluZV9maWxlcyBbc3BsaXQgJGYgIlxuIl0KCXNldCBuIFtsbGVuZ3RoICRjbWRsaW5lX2ZpbGVzXQoJc2V0IHJldnRyZWVhcmdzIFtscmFuZ2UgJHJldnRyZWVhcmdzIDAgZW5kLSRuXQogICAgfSBlcnJdfSB7CgkjIHVuZm9ydHVuYXRlbHkgd2UgZ2V0IGJvdGggc3Rkb3V0IGFuZCBzdGRlcnIgaW4gJGVyciwKCSMgc28gbG9vayBmb3IgImZhdGFsOiIuCglzZXQgaSBbc3RyaW5nIGZpcnN0ICJmYXRhbDoiICRlcnJdCglpZiB7JGkgPiAwfSB7CgkgICAgc2V0IGVyciBbc3RyaW5nIHJhbmdlICRlcnIgW2V4cHIgeyRpICsgNn1dIGVuZF0KCX0KCXNob3dfZXJyb3Ige30gLiAiQmFkIGFyZ3VtZW50cyB0byBnaXRrOlxuJGVyciIKCWV4aXQgMQogICAgfQp9CgpzZXQgaGlzdG9yeSB7fQpzZXQgaGlzdG9yeWluZGV4IDAKc2V0IGZoX3NlcmlhbCAwCnNldCBuaGxfbmFtZXMge30Kc2V0IGhpZ2hsaWdodF9wYXRocyB7fQpzZXQgc2VhcmNoZGlybiAtZm9yd2FyZHMKc2V0IGJvbGRyb3dzIHt9CnNldCBib2xkbmFtZXJvd3Mge30KCnNldCBvcHRpbV9kZWxheSAxNgoKc2V0IG5leHR2aWV3bnVtIDEKc2V0IGN1cnZpZXcgMApzZXQgc2VsZWN0ZWR2aWV3IDAKc2V0IHNlbGVjdGVkaGx2aWV3IE5vbmUKc2V0IHZpZXdmaWxlcygwKSB7fQpzZXQgdmlld3Blcm0oMCkgMApzZXQgdmlld2FyZ3MoMCkge30KCnNldCBjbWRsaW5lb2sgMApzZXQgc3RvcHBlZCAwCnNldCBzdHVmZnNhdmVkIDAKc2V0IHBhdGNobnVtIDAKc2V0Y29vcmRzCm1ha2V3aW5kb3cKcmVhZHJlZnMKCmlmIHskY21kbGluZV9maWxlcyBuZSB7fSB8fCAkcmV2dHJlZWFyZ3MgbmUge319IHsKICAgICMgY3JlYXRlIGEgdmlldyBmb3IgdGhlIGZpbGVzL2RpcnMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUKICAgIHNldCBjdXJ2aWV3IDEKICAgIHNldCBzZWxlY3RlZHZpZXcgMQogICAgc2V0IG5leHR2aWV3bnVtIDIKICAgIHNldCB2aWV3bmFtZSgxKSAiQ29tbWFuZCBsaW5lIgogICAgc2V0IHZpZXdmaWxlcygxKSAkY21kbGluZV9maWxlcwogICAgc2V0IHZpZXdhcmdzKDEpICRyZXZ0cmVlYXJncwogICAgc2V0IHZpZXdwZXJtKDEpIDAKICAgIGFkZHZpZXdtZW51IDEKICAgIC5iYXIudmlldyBlbnRyeWNvbmYgMiAtc3RhdGUgbm9ybWFsCiAgICAuYmFyLnZpZXcgZW50cnljb25mIDMgLXN0YXRlIG5vcm1hbAp9CgppZiB7W2luZm8gZXhpc3RzIHBlcm12aWV3c119IHsKICAgIGZvcmVhY2ggdiAkcGVybXZpZXdzIHsKCXNldCBuICRuZXh0dmlld251bQoJaW5jciBuZXh0dmlld251bQoJc2V0IHZpZXduYW1lKCRuKSBbbGluZGV4ICR2IDBdCglzZXQgdmlld2ZpbGVzKCRuKSBbbGluZGV4ICR2IDFdCglzZXQgdmlld2FyZ3MoJG4pIFtsaW5kZXggJHYgMl0KCXNldCB2aWV3cGVybSgkbikgMQoJYWRkdmlld21lbnUgJG4KICAgIH0KfQpnZXRjb21taXRzCg==