Ly8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLy8gICAgICAgICAgICAgICAgICAgICAgIENBREVOQ0UgQ09QWVJJR0hUIE5PVElDRQovLyAgICAgICAgIKkgMjAwOC0yMDA5IENhZGVuY2UgRGVzaWduIFN5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gVGhpcyBGb3VuZGF0aW9uIEZsb3cgaXMgcHJvdmlkZWQgYXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gcGVyZm9ybSBzcGVjaWFsaXplZAovLyB0YXNrcyB3aXRoaW4gSW5ub3Z1cyBTeXN0ZW0uCi8vCi8vIFRoaXMgd29yayBtYXkgbm90IGJlIGNvcGllZCwgcmUtcHVibGlzaGVkLCB1cGxvYWRlZCwgb3IgZGlzdHJpYnV0ZWQgaW4gYW55IHdheSwKLy8gaW4gYW55IG1lZGl1bSwgd2hldGhlciBpbiB3aG9sZSBvciBpbiBwYXJ0LCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgovLyBmcm9tIENhZGVuY2UuIE5vdHdpdGhzdGFuZGluZyBhbnkgcmVzdHJpY3Rpb25zIGhlcmVpbiwgc3ViamVjdCB0byBjb21wbGlhbmNlCi8vIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDYWRlbmNlIHNvZnR3YXJlIGxpY2Vuc2UgYWdyZWVtZW50IHVuZGVyCi8vIHdoaWNoIHRoaXMgbWF0ZXJpYWwgd2FzIHByb3ZpZGVkLCB0aGlzIG1hdGVyaWFsIG1heSBiZSBjb3BpZWQgYW5kIGludGVybmFsbHkKLy8gZGlzdHJpYnV0ZWQgc29sZWx5IGZvciBpbnRlcm5hbCBwdXJwb3NlcyBmb3IgdXNlIHdpdGggQ2FkZW5jZSB0b29scy4KLy8KLy8gVGhpcyB3b3JrIGlzIENhZGVuY2UgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGFuZCBtYXkgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBiZQovLyBnaXZlbiB0byB0aGlyZCBwYXJ0aWVzLCBuZWl0aGVyIGluIG9yaWdpbmFsIG5vciBpbiBtb2RpZmllZCB2ZXJzaW9ucywgd2l0aG91dAovLyBleHBsaWNpdCB3cml0dGVuIHBlcm1pc3Npb24gZnJvbSBDYWRlbmNlLiBUaGUgaW5mb3JtYXRpb24gY29udGFpbmVkIGhlcmVpbiBpcwovLyB0aGUgcHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbCBpbmZvcm1hdGlvbiBvZiBDYWRlbmNlIG9yIGl0cyBsaWNlbnNvcnMsIGFuZAovLyBpcyBzdXBwbGllZCBzdWJqZWN0IHRvLCBhbmQgbWF5IGJlIHVzZWQgb25seSBieSBDYWRlbmNlJ3MgY3VycmVudCBjdXN0b21lcnMKLy8gaW4gYWNjb3JkYW5jZSB3aXRoLCBhIHByZXZpb3VzbHkgZXhlY3V0ZWQgbGljZW5zZSBhZ3JlZW1lbnQgYmV0d2VlbiBDYWRlbmNlCi8vIGFuZCBpdHMgY3VzdG9tZXIuCi8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFRISVMgTUFURVJJQUwgSVMgUFJPVklERUQgQlkgQ0FERU5DRSAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi8vIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi8vIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi8vIElOIE5PIEVWRU5UIFNIQUxMIENBREVOQ0UgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTAovLyBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAovLyBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLy8gT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyAgTUFURVJJQUwsIEVWRU4gSUYKLy8gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgp2cHhtb2RlCnNldCBkb2ZpbGUgYWJvcnQgZXhpdApzZXQgdW5kZWZpbmVkIGNlbGwgYmxhY2tfYm94IC1ub2FzY2VuZCAtYm90aAp0Y2xtb2RlCi8vIHNldHVwIHZhcmlhYmxlcyAKZ2xvYmFsIHZhcnMKcHJvYyBQdXRzIHthcmdzfSB7CglwdXRzICRhcmdzCn0KLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLy8gU291cmNlIHNjcmlwdCB0byBkZWZpbmUgZGVzaWduIHNwZWNpZmljIHZhcmlhYmxlcwovLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwppZiB7W2luZm8gZXhpc3RzIGVudihGRl9TRVRVUF9QQVRIKV19IHsKICAgaWYge1tmaWxlIGV4aXN0cyAkZW52KEZGX1NFVFVQX1BBVEgpXX0gewogICAgICBQdXRzICI8RkY+IExPQURJTkcgJGVudihGRl9TRVRVUF9QQVRIKS9zZXR1cC50Y2wgLi4uIgogICAgICBjYXRjaCB7c291cmNlICRlbnYoRkZfU0VUVVBfUEFUSCkvc2V0dXAudGNsfQogICB9IGVsc2UgewogICAgICBQdXRzICI8RkY+IEVSUk9SOiAkZW52KEZGX1NFVFVQX1BBVEgpL3NldHVwLnRjbCBkb2VzIG5vdCBleGlzdCIKICAgICAgZXhpdAogICB9Cn0gZWxzZSB7CiAgIGlmIHtbZmlsZSBleGlzdHMgc2V0dXAudGNsXX0gewogICAgICBjYXRjaCB7c291cmNlIHNldHVwLnRjbH0KICAgfSBlbHNlIHsKICAgICAgUHV0cyAiPEZGPiBFUlJPUjogc2V0dXAudGNsIGRvZXMgbm90IGV4aXN0IgogICAgICBleGl0CiAgIH0KfQoKLy9EZWZpbmUgdGhlIG5ldGxpc3QgdG8gYmUgdmVyaWZ5CmlmIHtbaW5mbyBleGlzdHMgZW52KFNURVApXSAmJiBbZmlsZSBleGlzdHMgREJTLyRlbnYoU1RFUCkuZW5jLmRhdC8kdmFycyhkZXNpZ24pLnYuZ3pdfSB7CglzZXQgcmV2aXNlZE5ldGxpc3QgREJTLyRlbnYoU1RFUCkuZW5jLmRhdC8kdmFycyhkZXNpZ24pLnYuZ3oKfSBlbHNlIHsKICAgUHV0cyAiPEZGPiBGYWlsZWQgdG8gZmluZCBuZXRsaXN0ICBEQlMvJGVudihTVEVQKS5lbmMuZGF0LyR2YXJzKGRlc2lnbikudi5neiIKfQoKc2V0IHJjIFtjYXRjaCB7c291cmNlICR2YXJzKHNjcmlwdF9yb290KS9FVEMvdXRpbHMudGNsfV0KaWYge1tpbmZvIGV4aXN0cyB2YXJzKHRocmVhZHMpXX0gewoJdnB4IHNldCBjb21wYXJlIG9wdGlvbiAtdGhyZWFkcyAkdmFycyh0aHJlYWRzKQp9CgoKLy8gcmVhZCBMaWJlcnR5IGNlbGwgZGVmaW5pdGlvbnMKc2V0IGxpYlNldCAkdmFycygkdmFycygkdmFycyhkZWZhdWx0X3NldHVwX3ZpZXcpLGRlbGF5X2Nvcm5lciksbGlicmFyeV9zZXQpCnZweCByZWFkIGxpYnJhcnkgLXN0YXRldGFibGUgLWJvdGggLWxpYmVydHkgJHZhcnMoJHtsaWJTZXR9LHRpbWluZykKCi8vIHJlYWQgcmVmZXJlbmNlIG5ldGxpc3QKdnB4IHJlYWQgZGVzaWduIC12ZXJpbG9nIC1zZW5zaXRpdmUgLWdvbGRlbiAkdmFycyhuZXRsaXN0KQoKLy8gcmVhZCBwb3N0LWltcGxlbWVudGF0aW9uIG5ldGxpc3QKdnB4IHJlYWQgZGVzaWduIC12ZXJpbG9nIC1zZW5zaXRpdmUgLXJldmlzZWQgJHJldmlzZWROZXRsaXN0CgovL3NldCB0b3AgbGV2ZWwKdnB4IHNldCByb290IG1vZHVsZSAkdmFycyhkZXNpZ24pIC1ib3RoCgpmZl9zb3VyY2VfcGx1ZyBwcmVfbGVjX2NoZWNrX3RjbAoKdnB4bW9kZQpyZXBvcnQgZGVzaWduIGRhdGEKcmVwb3J0IGJsYWNrIGJveAoKc2V0IG1hcHBpbmcgbWV0aG9kIC1uYW1lIGZpcnN0CnNldCBmbGF0dGVuIG1vZGVsIC1zZXFfY29uc3RhbnQgLXNlcV9jb25zdGFudF94X3RvIDAKc2V0IGZsYXR0ZW4gbW9kZWwgLW5vZGZmX3RvX2RsYXRfemVybyAtbm9kZmZfdG9fZGxhdF9mZWVkYmFjawpzZXQgZmxhdHRlbiBtb2RlbCAtZ2F0ZWRfY2xvY2sKCnNldCBzeXN0ZW0gbW9kZSBsZWMKYWRkIGNvbXBhcmUgcG9pbnQgLWFsbApjb21wYXJlIC1nYXRlX3RvX2dhdGUKdXNhZ2UKLy8gICB2cHggcmVwb3J0IGNvbXBhcmUgZGF0YQpyZXBvcnQgY29tcGFyZSBkYXRhIC1jbGFzcyBub25lcXVpdmFsZW50IC1jbGFzcyBhYm9ydCAtY2xhc3Mgbm90Y29tcGFyZWQKcmVwb3J0IHZlcmlmaWNhdGlvbiAtdmVyYm9zZQpyZXBvcnQgc3RhdGlzdGljcwoKdGNsbW9kZQpzZXQgcG9pbnRzX2NvdW50IFtnZXRfY29tcGFyZV9wb2ludHMgLWNvdW50XQpzZXQgZGlmZl9jb3VudCBbZ2V0X2NvbXBhcmVfcG9pbnRzIC1kaWZmIC1jb3VudF0Kc2V0IGFib3J0X2NvdW50IFtnZXRfY29tcGFyZV9wb2ludHMgLWFib3J0IC1jb3VudF0Kc2V0IHVua25vd25fY291bnQgW2dldF9jb21wYXJlX3BvaW50cyAtdW5rbm93biAtY291bnRdCmlmIHskcG9pbnRzX2NvdW50ID09IDB9IHsKICAgIHB1dHMgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKICAgIHB1dHMgIkVSUk9SOiBObyBjb21wYXJlIHBvaW50cyBkZXRlY3RlZCIKICAgIHB1dHMgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKfQppZiB7JGRpZmZfY291bnQgPiAwfSB7CiAgICBwdXRzICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCiAgICBwdXRzICJFUlJPUjogRGlmZmVyZW50IEtleSBQb2ludHMgZGV0ZWN0ZWQiCiAgICBwdXRzICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCn0KaWYgeyRhYm9ydF9jb3VudCA+IDB9IHsKICAgIHB1dHMgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgogICAgcHV0cyAiRVJST1I6IEFib3J0IFBvaW50cyBkZXRlY3RlZCAiCiAgICBwdXRzICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKfQppZiB7JHVua25vd25fY291bnQgPiAwfSB7CiAgICBwdXRzICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgogICAgcHV0cyAiRVJST1I6IFVua25vd24gS2V5IFBvaW50cyBkZXRlY3RlZCIKICAgIHB1dHMgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCn0KcHV0cyAiTm8gb2YgY29tcGFyZSBwb2ludHMgPSAkcG9pbnRzX2NvdW50IgpwdXRzICJObyBvZiBkaWZmIHBvaW50cyAgICA9ICRkaWZmX2NvdW50IgpwdXRzICJObyBvZiBhYm9ydCBwb2ludHMgICA9ICRhYm9ydF9jb3VudCIKcHV0cyAiTm8gb2YgdW5rbm93biBwb2ludHMgPSAkdW5rbm93bl9jb3VudCIKZXhpdCAwCg==