IyEvYmluL2Jhc2gKIyBXSU5FIEluc3RhbGxhdGlvbiBzY3JpcHQKIyBDYW4gZG8gYWxtb3N0IGV2ZXJ5dGhpbmcgZnJvbSBjb21waWxpbmcgdG8gY29uZmlndXJpbmcuLi4KCiMgTWFyIDMxIDE5OTkgLSBPdmUgS+V2ZW4KIyAgRmlyc3QgdmVyc2lvbgojIERlYyA5IDE5OTkgLSBPdmUgS+V2ZW4KIyAgcmVxdWlyZSBYcG0KIyBGZWIgMjUgMjAwMCAtIE92ZSBL5XZlbgojICBhdXRvLWFkZCAvdXNyL2xvY2FsL2xpYiB0byAvZXRjL2xkLnNvLmNvbmYKIyBNYXIgMiAyMDAwIC0gT3ZlIEvldmVuCiMgIHNvdXJjZSByYXRoZXIgdGhhbiBncmVwIGNvbmZpZy5jYWNoZQojICB1c2Ugc291cmNlZCBjb25maWcuY2FjaGUgdG8gc3RhcnQgbGRjb25maWcKIyAgcmVjb25maWd1cmUgaWYgY29uZmlnLmNhY2hlIGRvZXNuJ3QgZXhpc3QKIyBNYXIgMzAgMjAwMCAtIE92ZSBL5XZlbgojICBhdXRvY29uZmlndXJlIG5vLXdpbmRvd3MgaW5zdGFsbHMKIyAgZG8gbm90IGluc3RhbGwgcmVnaXN0cnkgb24gcmVhbC13aW5kb3dzIGluc3RhbGxzCiMgIHNvbWUgc3VwcG9ydCBmb3IgYmluYXJ5IHBhY2thZ2UgaW5zdGFsbHMKIyAgc2V0IGFuZCB0ZWxsIHVzZXIgYWJvdXQgTERfTElCUkFSWV9QQVRIIGlmIG5lY2Vzc2FyeQojICBzZXQgRVhUUkFfTERfTElCUkFSWV9QQVRIIGluIHdpbmUuY29uZgojIEFwciA5IDIwMDAgLSBPdmUgS+V2ZW4KIyAgbWFrZSByb290J3MgcmVnaXN0cnkgZ2xvYmFsIChzeXN0ZW0tZGVmYXVsdCkKIyBNYXkgOSAyMDAwIC0gT3ZlIEvldmVuCiMgIHVzZSB0dHlkcnYgd2hlbiBydW5uaW5nIHJlZ2FwaSwgc28gd2UgZG9uJ3QgaGF2ZSB0byBydW4gZnJvbSBYCiMgIGNoYW5nZSBkZWJ1Z2dlciBwYXRoIGluIHJlZ2lzdHJ5CiMgT2N0IDI5IDIwMDAgLSBPdmUgS+V2ZW4KIyAgYWRkZWQgLS1lbmFibGUtb3BlbmdsIHRvIGRlZmF1bHQgY29uZmFyZ3MKIyAgYWRkZWQgY29uZl9xdWVzdGlvbiwgY29uZl95ZXNub19hbnN3ZXIsIGFuZCBjb25mX3N0cmluZ19hbnN3ZXIgZnVuY3Rpb25zCiMgIGFkZGVkIERFRkNBVCB2YXJpYWJsZQojIChsYXRlciB0aGF0IGRheS4uLikKIyAgYWRkZWQgY29uZl9yZXNldF9xdWVzdGlvbiBmdW5jdGlvbgojICBhZGRlZCBmaWxlIGV4aXN0ZW5jZSBjaGVja3MgdG8gdGhlIHJlZ2lzdHJ5IGNvcHlpbmcKIyAgZml4ZWQgcHJvYmxlbSB3aXRoIG5vLXdpbmRvd3MgZGlyZWN0b3J5IGNyZWF0aW9uCiMgIHNvbWUgdGV4dCByZWZvcm1hdHRpbmcgZnJvbSBFcmljIE1hcnluaWFrCgojLS0tIGRlZmF1bHRzIChjaGFuZ2UgdGhlc2UgaWYgeW91IGFyZSBhIHBhY2thZ2VyKQpDT05GQVJHUz0tLWVuYWJsZS1vcGVuZ2wgICAgICAjIGNvbmZpZ3VyZSBhcmdzLCBlLmcuIC0tcHJlZml4PS91c3IgLS1zeXNjb25mZGlyPS9ldGMKcHJlZml4PS91c3IvbG9jYWwgICAgICAgICAgICAgIyBpbnN0YWxsYXRpb24gcHJlZml4CnN5c2NvbmZkaXI9JHByZWZpeC9ldGMgICAgICAgICMgd2hlcmUgd2luZS5jb25mIGFuZCBnbG9iYWwgcmVnaXN0cnkgaXMgc3VwcG9zZWQgdG8gYmUKYmluZGlyPSRwcmVmaXgvYmluICAgICAgICAgICAgIyB3aGVyZSB3aW5lbGliIGFwcHMgd2lsbCBiZSAob3IgaXMpIGluc3RhbGxlZApsaWJkaXI9JHByZWZpeC9saWIgICAgICAgICAgICAjIHdoZXJlIGxpYndpbmUuc28gd2lsbCBiZSAob3IgaXMpIGluc3RhbGxlZApleGRpcj1kb2N1bWVudGF0aW9uL3NhbXBsZXMgICAjIHdoZXJlIHRoZSBleGFtcGxlIHN5c3RlbS5pbmkgcmVzaWRlcwpDT05GPSRzeXNjb25mZGlyL3dpbmUuY29uZiAgICAjIGRlZmF1bHQgcGF0aCBvZiB0aGUgd2luZS5jb25mCkJJTkRJU1Q9bm8gICAgICAgICAgICAgICAgICAgICMgd2hldGhlciBjYWxsZWQgZnJvbSBhIGJpbmFyeSBwYWNrYWdlIGNvbmZpZyBzY3JpcHQKRE9DT05GPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9nZW5lcmF0ZSB3aW5lLmNvbmYKRE9XQ0hLPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9jb25maWd1cmUgZXhpc3Rpbmctd2luZG93cyBpbnN0YWxsYXRpb24KRE9XSU5FPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9jb25maWd1cmUgbm8td2luZG93cyBpbnN0YWxsYXRpb24KRE9SRUc9YXV0byAgICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGluc3RhbGwgZGVmYXVsdCByZWdpc3RyeQpTWVNSRUc9eWVzICAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gbWFrZSByb290J3MgcmVnaXN0cnkgZ2xvYmFsIChzeXN0ZW0tZGVmYXVsdCkKCiMgIm1ha2UgaW5zdGFsbCIgc3RpbGwgaW5zdGFsbHMgdGhlIGRsbHMgaW50byAkbGliZGlyLCBidXQgdGhpcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUKIyAoRExMUEFUSCBzaG91bGQgcG9pbnQgdG8gdGhlbSBpZi93aGVuIHRoZXkgYXJlIG5vdCBpbiBzdGFuZGFyZCBsZC5zbyBwYXRocykKRExMUEFUSD0kbGliZGlyL3dpbmUgICAgICAgICAgIyBkZWZhdWx0IHBhdGggb2YgdGhlIGRsbCAuc28gZmlsZXMgKGV4Y2VwdCBsaWJ3aW5lLnNvKQoKIyBoYXZpbmcgdGhlIFdpbmUgZGVidWdnZXIgbGF1bmNoZWQgYXV0b21hdGljYWxseSB3aWxsIGJlIGEgcGx1cyBmb3IgdXMKREVCVUdHRVI9JGJpbmRpci93aW5lZGJnICAgICAgIyB0aGUgKGluc3RhbGxlZCkgcGF0aCBvZiB3aW5lZGJnCkhERUJVR0dFUj1kZWJ1Z2dlci93aW5lZGJnICAgICMgdGhlIChub24taW5zdGFsbGVkKSBwYXRoIG9mIHdpbmVkYmcKCiMgdGhpcyBpcyBvbmx5IGZvciBleGlzdGluZy13aW5kb3dzIGluc3RhbGxzCldJTkVDT05GPXRvb2xzL3dpbmVjb25mICAgICAgICMgdGhlIHBhdGggb2Ygd2luZWNvbmYgcGVybCBzY3JpcHQKCiMgdGhpcyBpcyBvbmx5IGZvciBuby13aW5kb3dzIGluc3RhbGxzCldJTkVJTkk9d2luZS5pbmkgICAgICAgICAgICAgICMgdGhlIHBhdGggb2YgZGVmYXVsdCB3aW5lLmluaSAoYWxzbyB1c2VkIGJ5IHdpbmVjb25mKQpXSU5JTkk9L2Rldi9udWxsICAgICAgICAgICAgICAjIHRoZSBwYXRoIG9mIGRlZmF1bHQgd2luLmluaQpTWVNURU1JTkk9JGV4ZGlyL3N5c3RlbS5pbmkgICAjIHRoZSBwYXRoIG9mIGRlZmF1bHQgc3lzdGVtLmluaQpSRUdBUEk9cHJvZ3JhbXMvcmVnYXBpL3JlZ2FwaSAjIHRoZSBwYXRoIG9mIHJlZ2FwaSB3aW5lbGliIGFwcGxpY2F0aW9uCkRFRlJFRz13aW5lZGVmYXVsdC5yZWcgICAgICAgICMgdGhlIHBhdGggb2YgdGhlIHJlZ2lzdHJ5IGZpbGUgdG8gYmUgZmVkIHRvIHJlZ2FwaQojIENST09UPS92YXIvd2luZSAgICAgICAgICAgICAjIHRoZSBwYXRoIG9mIHRoZSBmYWtlIERyaXZlIEMgKGFza3MgdXNlciBpZiBub3Qgc2V0KQpERUZDQVQ9Y2F0ICAgICAgICAgICAgICAgICAgICAjIHByb2dyYW0gdG8gY2F0ICRERUZSRUcgd2l0aCAoc29tZSBwYWNrYWdlcyBuZWVkIHpjYXQpCiMtLS0gZW5kIG9mIGRlZmF1bHRzCgojIHRlbXBvcmFyeSBmaWxlcyB1c2VkIGJ5IHRoZSBpbnN0YWxsZXIKVE1QQ09ORj0vdG1wL3dpbmVpbnN0YWxsLmNvbmYKVE1QUkVHPS90bXAvd2luZWluc3RhbGwucmVnCgojIGZ1bmN0aW9ucwoKZnVuY3Rpb24gY29uZl9xdWVzdGlvbiB7CiAgIyBwYXJhbWV0ZXJzOiAkMSA9IGltcG9ydGFuY2UsICQyID0gcXVlc3Rpb24taWQsICQzKyA9IG1lc3NhZ2UgbGluZXMKICAjIHRoZSBmaXJzdCB0d28gcGFyYW1ldGVycyBjYW4gYmUgdXNlZCBieSBlLmcuIGRlYmNvbmYgaW4gZGViaWFuIHBhY2thZ2VzCiAgIyBidXQgaGVyZSB3ZSBqdXN0IHByaW50IHRoZSBtZXNzYWdlCiAgc2hpZnQgMgogIGVjaG8KICBsb2NhbCBMSU5FPSIkMSIKICB3aGlsZSBzaGlmdAogIGRvIHsKICAgIGVjaG8gIiRMSU5FIgogICAgTElORT0iJDEiCiAgfQogIGRvbmUKfQoKZnVuY3Rpb24gY29uZl9yZXNldF9xdWVzdGlvbiB7CiAgIyBwYXJhbWV0ZXJzOiAkMSA9IHF1ZXN0aW9uLWlkCiAgIyB0aGlzIGlzIHVzZWQgdG8gZmx1c2ggYW55IGNhY2hlZCBhbnN3ZXJzIGFuZCAiYWxyZWFkeS1kaXNwbGF5ZWQiIGZsYWdzCiAgc2hpZnQgIyBkdW1teSBjb21tYW5kCn0KCmZ1bmN0aW9uIGNvbmZfeWVzbm9fYW5zd2VyIHsKICB1bnNldCBBTlNXRVIKICB3aGlsZSBbICIkQU5TV0VSIiAhPSAneWVzJyBdICYmIFsgIiRBTlNXRVIiICE9ICdubycgXQogIGRvIHsKICAgIGVjaG8gLW4gIiQxIgogICAgcmVhZCBBTlNXRVIKICB9CiAgZG9uZQp9CgpmdW5jdGlvbiBjb25mX3N0cmluZ19hbnN3ZXIgewogIGVjaG8gLW4gIiQxIgogIHJlYWQgQU5TV0VSCn0KCiMgc3RhcnR1cC4uLgoKZWNobyAiV0lORSBJbnN0YWxsZXIgdjAuNSIKZWNobwoKaWYgWyAiJEJJTkRJU1QiID0gJ25vJyBdCnRoZW4gewoKaWYgISBbIC1mIGNvbmZpZ3VyZSBdCnRoZW4gewogIGVjaG8gIllvdSdyZSBydW5uaW5nIHRoaXMgZnJvbSB0aGUgd3JvbmcgZGlyZWN0b3J5LiIKICBlY2hvICJDaGFuZ2UgdG8gdGhlIFdpbmUgZGlyZWN0b3J5IGFuZCB0cnkgYWdhaW4uIgogIGV4aXQgMQp9CmZpCgojIGNoZWNrIHdoZXRoZXIgUlBNIGluc3RhbGxlZCwgYW5kIGlmIGl0IGlzLCByZW1vdmUgYW55IG9sZCB3aW5lIHJwbS4KaGFzaCBycG0gJj4vZGV2L251bGwKUkVUPSQ/CmlmIFsgJFJFVCAtZXEgMCBdOyB0aGVuCiAgaWYgWyAtbiAiYHJwbSAtcWkgd2luZSAyPi9kZXYvbnVsbHxncmVwICJeTmFtZSJgIiBdOyB0aGVuCiAgICBlY2hvICJXYXJuaW5nOiBPbGQgV2luZSBSUE0gaW5zdGFsbCBkZXRlY3RlZC4gRG8geW91IHdhbnQgdG8gcmVtb3ZlIGl0IGZpcnN0PyIKICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICBpZiBbICIkQU5TV0VSIiA9ICd5ZXMnIF07IHRoZW4KICAgICAgZWNobyBTdGFydGluZyB3aW5lIHJwbSByZW1vdmFsLi4uCiAgICAgIHJwbSAtZSB3aW5lOyBSRVQ9JD8KICAgICAgaWYgWyAkUkVUIC1lcSAwIF07IHRoZW4KICAgICAgICBlY2hvIERvbmUuCiAgICAgIGVsc2UKICAgICAgICBlY2hvICJGQUlMRUQuIFByb2JhYmx5IHlvdSBhcmVuJ3QgaW5zdGFsbGluZyBhcyByb290LiIKICAgICAgZmkKICAgIGVsc2UKICAgICAgZWNobyAiU29ycnksIEkgd29uJ3QgaW5zdGFsbCBXaW5lIHdoZW4gYW4gcnBtIHZlcnNpb24gaXMgc3RpbGwgaW5zdGFsbGVkLiIKICAgICAgZWNobyAiKFdpbmUgc3VwcG9ydCBzdWZmZXJlZCBmcm9tIHdheSB0b28gbWFueSBjb25mbGljdHMpIgogICAgICBlY2hvICJIYXZlIGEgbmljZSBkYXkgISIKICAgICAgZXhpdCAxCiAgICBmaSAKICBmaQpmaQoKIyBydW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIGlmIG5lY2Vzc2FyeQoKaWYgWyAtZiBjb25maWcuY2FjaGUgXSAmJiBbIC1mIE1ha2VmaWxlIF0gJiYgWyBNYWtlZmlsZSAtbnQgY29uZmlndXJlIF0KdGhlbiB7CiAgZWNobyAiSSBzZWUgdGhhdCBXSU5FIGhhcyBhbHJlYWR5IGJlZW4gY29uZmlndXJlZCwgc28gSSdsbCBza2lwIHRoYXQuIgogICMgbG9hZCBjb25maWd1cmUgcmVzdWx0cwogIC4gLi9jb25maWcuY2FjaGUKfQplbHNlIHsKICBlY2hvICJSdW5uaW5nIGNvbmZpZ3VyZS4uLiIKICBlY2hvCiAgaWYgISAuL2NvbmZpZ3VyZSAkQ09ORkFSR1MKICB0aGVuIHsKICAgIGVjaG8KICAgIGVjaG8gIkNvbmZpZ3VyZSBmYWlsZWQsIGFib3J0aW5nIGluc3RhbGwuIgogICAgcm0gLWYgY29uZmlnLmNhY2hlCiAgICBleGl0IDEKICB9CiAgZmkKICAjIGxvYWQgY29uZmlndXJlIHJlc3VsdHMKICAuIC4vY29uZmlnLmNhY2hlCiAgIyBtYWtlIHN1cmUgWCB3YXMgZm91bmQKICBldmFsICIkYWNfY3ZfaGF2ZV94IgogIGlmIFsgIiRoYXZlX3giICE9ICJ5ZXMiIF0KICB0aGVuIHsKICAgIGVjaG8gIkluc3RhbGwgdGhlIFggZGV2ZWxvcG1lbnQgaGVhZGVycyBhbmQgdHJ5IGFnYWluLiIKICAgIHJtIC1mIGNvbmZpZy5jYWNoZQogICAgZXhpdCAxCiAgfQogIGVsaWYgWyAiJGFjX2N2X2hlYWRlcl9YMTFfeHBtX2giICE9ICJ5ZXMiIF0KICB0aGVuIHsKICAgIGVjaG8gIkluc3RhbGwgdGhlIFhwbSBkZXZlbG9wbWVudCBoZWFkZXJzIGFuZCB0cnkgYWdhaW4uIgogICAgcm0gLWYgY29uZmlnLmNhY2hlCiAgICBleGl0IDEKICB9CiAgZmkKfQpmaQoKIyBub3cgZG8gdGhlIGNvbXBpbGF0aW9uCgppZiBbIC1mIHdpbmUgXSAmJiBbIHdpbmUgLW50IE1ha2VmaWxlIF0KdGhlbiB7CiAgZWNobyAiSG1tLCBsb29rcyBsaWtlIFdJTkUgaXMgYWxyZWFkeSBjb21waWxlZC4gSSdsbCBza2lwIHRoYXQgdG9vLCBJIGd1ZXNzLiIKfQplbHNlIHsKICBlY2hvICJDb21waWxpbmcgV0lORS4gR3JhYiBhIGx1bmNoIG9yIHR3bywgcmVudCBhIHZpZGVvLCBvciB3aGF0ZXZlciwiCiAgZWNobyAiaW4gdGhlIG1lYW50aW1lLi4uIgogIGVjaG8KICBpZiAhIHsgbWFrZSBkZXBlbmQgJiYgbWFrZTsgfQogIHRoZW4gewogICAgZWNobwogICAgZWNobyAiQ29tcGlsYXRpb24gZmFpbGVkLCBhYm9ydGluZyBpbnN0YWxsLiIKICAgIGV4aXQgMQogIH0KICBmaQogIGVjaG8KfQpmaQoKIyBhbmQgaW5zdGFsbGF0aW9uLCBpZiByb290CgppZiBbIGB3aG9hbWlgICE9ICdyb290JyBdCnRoZW4gewogIGVjaG8gIllvdSBhcmVuJ3Qgcm9vdCwgc28gSSdsbCBza2lwIHRoZSBtYWtlIGluc3RhbGwuIgogICMgc2V0dXAgdG8gcnVuIGZyb20gY3VycmVudCBkaXJlY3RvcnkKICBETExQQVRIPSIkUFdEL2RsbHMiCiAgaWYgWyAteiAiJExEX0xJQlJBUllfUEFUSCIgXQogIHRoZW4gTERfTElCUkFSWV9QQVRIPSIkUFdEOiRETExQQVRIIgogIGVsc2UgTERfTElCUkFSWV9QQVRIPSIkTERfTElCUkFSWV9QQVRIOiRQV0Q6JERMTFBBVEgiCiAgZmkKICBleHBvcnQgTERfTElCUkFSWV9QQVRICiAgREVCVUdHRVI9IiRQV0QvJEhERUJVR0dFUiIKICBlY2hvCiAgZWNobyAiTk9URSEgVG8gcnVuIFdpbmUgd2l0aG91dCBpbnN0YWxsaW5nLCB5b3UgbXVzdCBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIgogIGVjaG8gIkxEX0xJQlJBUllfUEFUSCB0byAkUFdEOiRETExQQVRIIgogIGVjaG8gImluIHlvdXIgbG9nb24gc2NyaXB0cy4iCn0KZWxzZSB7CiAgZWNobyAiTm93IGluc3RhbGxpbmcgYmluYXJpZXMgb250byB0aGUgc3lzdGVtLi4uIgogIGVjaG8KICBpZiAhIG1ha2UgaW5zdGFsbAogIHRoZW4gewogICAgZWNobwogICAgZWNobyAiSW5zdGFsbGF0aW9uIGZhaWxlZCwgYWJvcnRpbmcuIgogICAgZXhpdCAxCiAgfQogIGZpCiAgaWYgWyAtZiAvZXRjL2xkLnNvLmNvbmYgXSAmJiAhIGdyZXAgLXFzICIkbGliZGlyIiAvZXRjL2xkLnNvLmNvbmYKICB0aGVuIHsKICAgIGVjaG8KICAgIGVjaG8gIiRsaWJkaXIgZGlkbid0IGV4aXN0IGluIHlvdXIgL2V0Yy9sZC5zby5jb25mLCBhZGRpbmcgaXQgbm93Li4uIgogICAgZWNobyAiJGxpYmRpciIgPj4vZXRjL2xkLnNvLmNvbmYKICAgIGVjaG8gIlJlLXJ1bm5pbmcgbGRjb25maWcuLi4iCiAgICBldmFsICIkYWNfY3ZfcGF0aF9MRENPTkZJRyIKICB9CiAgZmkKfQpmaQoKfQpmaSAjIEJJTkRJU1QKCiMgbm93IGNoZWNrIHdoZXRoZXIgd2Ugc2hvdWxkIGdlbmVyYXRlIHdpbmUuY29uZgppZiBbIC16ICIkRE9DT05GIiBdCnRoZW4gRE9DT05GPWF1dG8KZmkKCmlmIFsgIiRET0NPTkYiID0gJ2F1dG8nIF0KdGhlbiB7CiAgIyBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgc3lzdGVtIHdpbmUuY29uZgogIGlmIFsgLWYgJENPTkYgXQogIHRoZW4gRE9DT05GPW5vCiAgZmkKfQpmaQoKaWYgWyAiJERPQ09ORiIgIT0gJ25vJyBdCnRoZW4gewogIGlmIFsgYHdob2FtaWAgIT0gJ3Jvb3QnIF0KICB0aGVuIHsKICAgIENPTkY9fi8ud2luZXJjCiAgICBpZiAhIFsgLWYgJENPTkYgXQogICAgdGhlbiB7CiAgICAgIGlmIFsgIiRET0NPTkYiICE9ICd5ZXMnIF0KICAgICAgdGhlbiB7CiAgICAgICAgY29uZl9xdWVzdGlvbiBtZWRpdW0gbWFrZV91c2VyX3dpbmVyYyBcCiAgICAgICAgICJTaW5jZSB5b3UgYXJlbid0IHJvb3QsIGFuZCB0aGVyZSdzIG5vIHN5c3RlbSB3aW5lLmNvbmYsIEkgYXNzdW1lIiBcCiAgICAgICAgICJ5b3Ugd2FudCBhIHVzZXItc3BlY2lmaWMgLndpbmVyYy4gQW0gSSBjb3JyZWN0PyIKICAgICAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgICAgIERPQ09ORj0iJEFOU1dFUiIKICAgICAgfQogICAgICBmaQogICAgICBpZiBbICIkRE9DT05GIiA9ICdubycgXQogICAgICB0aGVuIHsKICAgICAgICBjb25mX3F1ZXN0aW9uIGhpZ2ggbmVlZF9yb290IFwKICAgICAgICAgIkFib3J0aW5nIGluc3RhbGwuIFRyeSBhZ2FpbiBhcyByb290IHRvIGdlbmVyYXRlIGEgc3lzdGVtIHdpbmUuY29uZi4iCiAgICAgICAgZXhpdCAxCiAgICAgIH0KICAgICAgZmkKICAgICAgZWNobwogICAgfQogICAgZmkKICB9CiAgZWxzZSB7CiAgICBta2RpciAtcCAkc3lzY29uZmRpcgogICAgRE9DT05GPXllcwogIH0KICBmaQp9CmZpCgojIGdlbmVyYXRlIHdpbmUuY29uZiBmcm9tIGV4aXN0aW5nIHdpbmRvd3MgaW5zdGFsbCwgaWYgYW55CmlmIFsgIiRET0NPTkYiID0gJ3llcycgXQp0aGVuIHsKICBpZiBbICIkRE9XQ0hLIiA9ICd5ZXMnIF0gfHwgWyAiJERPV0NISyIgPSAnYXV0bycgXQogIHRoZW4gewogICAgZWNobwogICAgZWNobyAtbiAiU2VhcmNoaW5nIGZvciBhbiBleGlzdGluZyBXaW5kb3dzIGluc3RhbGxhdGlvbi4uLiIKICAgIGlmICEgJFdJTkVDT05GIC1pbmlmaWxlICIkV0lORUlOSSIgPiAkQ09ORiAyPi9kZXYvbnVsbAogICAgdGhlbiB7CiAgICAgIHJtIC1mICRDT05GCiAgICAgIGVjaG8gIiBub3QgZm91bmQuIgogICAgICBjb25mX3F1ZXN0aW9uIGxvdyBkb193aXRob3V0X3dpbmRvd3MgXAogICAgICAgIldpbmRvd3Mgd2FzIG5vdCBmb3VuZCBvbiB5b3VyIHN5c3RlbSwgc28gSSBhc3N1bWUgeW91IHdhbnQiIFwKICAgICAgICJhIFdpbmUtb25seSBpbnN0YWxsYXRpb24uIEFtIEkgY29ycmVjdD8iCiAgICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICAgIGlmIFsgIiRBTlNXRVIiID0gJ25vJyBdCiAgICAgIHRoZW4gewogICAgICAgIGNvbmZfcXVlc3Rpb24gaGlnaCB3aW5kb3dzX25vdF9mb3VuZCBcCiAgICAgICAgICJBYm9ydGluZyBpbnN0YWxsLiBNYWtlIHN1cmUgeW91ciBXaW5kb3dzIHBhcnRpdGlvbiBpcyBtb3VudGVkIGFuZCB0cnkgYWdhaW4sIiBcCiAgICAgICAgICJvciBjcmVhdGUgJENPTkYgbWFudWFsbHkgYnkgY29weWluZyBmcm9tICRXSU5FSU5JIGFuZCBhZGFwdGluZyB0aGUgZHJpdmUgcGF0aHMuIgogICAgICAgIGV4aXQgMQogICAgICB9CiAgICAgIGZpCiAgICAgIERPV0lORT15ZXMKICAgIH0KICAgIGVsc2UgewogICAgICBlY2hvICIgZm91bmQuIgogICAgICBjb25mX3Jlc2V0X3F1ZXN0aW9uIHdpbmRvd3NfZm91bmQKICAgICAgY29uZl9xdWVzdGlvbiBsb3cgd2luZG93c19mb3VuZCBcCiAgICAgICAiQ3JlYXRlZCAkQ09ORiB1c2luZyB5b3VyIGV4aXN0aW5nIFdpbmRvd3MgaW5zdGFsbGF0aW9uLiIgXAogICAgICAgIllvdSBwcm9iYWJseSB3YW50IHRvIHJldmlldyB0aGUgZmlsZSwgdGhvdWdoLiIKICAgICAgRE9XSU5FPW5vCiAgICB9CiAgICBmaQogIH0KICBlbGlmIFsgIiRET1dJTkUiID0gJ2F1dG8nIF0KICB0aGVuIERPV0lORT15ZXMKICBmaQp9CmVsaWYgWyAiJERPV0lORSIgPSAnYXV0bycgXQp0aGVuIERPV0lORT1ubwpmaQoKIyBzZXR1cCBhIG5vLXdpbmRvd3MgaW5zdGFsbGF0aW9uLCBpZiBuZWNlc3NhcnkKaWYgWyAiJERPV0lORSIgPSAneWVzJyBdCnRoZW4gewogIGlmIFsgYHdob2FtaWAgIT0gJ3Jvb3QnIF0KICB0aGVuIERDUk9PVD1+L2MKICBlbHNlIERDUk9PVD0vYwogIGZpCiAgY29uZl9xdWVzdGlvbiBsb3cgZHJpdmVjX3BhdGggXAogICAiQ29uZmlndXJpbmcgV2luZSB3aXRob3V0IFdpbmRvd3MuIiBcCiAgICJTb21lIGZha2UgV2luZG93cyBkaXJlY3RvcmllcyBtdXN0IGJlIGNyZWF0ZWQsIHRvIGhvbGQgYW55IC5pbmkgZmlsZXMsIERMTHMsIiBcCiAgICJzdGFydCBtZW51IGVudHJpZXMsIGFuZCBvdGhlciB0aGluZ3MgeW91ciBhcHBsaWNhdGlvbnMgbWF5IG5lZWQgdG8gaW5zdGFsbC4iIFwKICAgIldoZXJlIHdvdWxkIG95dSBsaWtlIHlvdXIgZmFrZSBDIGRyaXZlIHRvIGJlIHBsYWNlZD8iCiAgd2hpbGUgWyAteiAiJENST09UIiBdCiAgZG8gewogICAgY29uZl9zdHJpbmdfYW5zd2VyICIoZGVmYXVsdCBpcyAkRENST09UKSAiCiAgICBpZiBbIC16ICIkQU5TV0VSIiBdCiAgICB0aGVuIENST09UPSIkRENST09UIgogICAgZWxpZiAhIFsgLWQgIiRBTlNXRVIiIF0KICAgIHRoZW4gewogICAgICBpZiBta2RpciAtcCAiJEFOU1dFUiIKICAgICAgdGhlbiBDUk9PVD0iJEFOU1dFUiIKICAgICAgZWxzZSBjb25mX3Jlc2V0X3F1ZXN0aW9uIGRyaXZlY19wYXRoCiAgICAgIGZpCiAgICB9CiAgICBlbHNlIENST09UPSIkQU5TV0VSIgogICAgZmkKICB9CiAgZG9uZQogIGVjaG8gIkNvbmZpZ3VyaW5nIFdpbmUgZm9yIGEgbm8td2luZG93cyBpbnN0YWxsIGluICRDUk9PVC4uLiIKICBmb3IgdGRpciBpbiAiJENST09UL3dpbmRvd3MiICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0iIFwKICAgICAgICAgICAgICAiJENST09UL3dpbmRvd3MvU3RhcnQgTWVudSIgIiRDUk9PVC93aW5kb3dzL1N0YXJ0IE1lbnUvUHJvZ3JhbXMiIFwKICAgICAgICAgICAgICAiJENST09UL0NvbW1vbiBGaWxlcyIgIiRDUk9PVC9Qcm9ncmFtIEZpbGVzIiBcCiAgICAgICAgICAgICAgIiRDUk9PVC93aW5kb3dzL1Byb2ZpbGVzIiAiJENST09UL3dpbmRvd3MvUHJvZmlsZXMvQWRtaW5pc3RyYXRvciIKICBkbyBbIC1kICIkdGRpciIgXSB8fCBta2RpciAiJHRkaXIiCiAgZG9uZQogIFsgLWYgIiRDUk9PVC93aW5kb3dzL3dpbi5pbmkiIF0gICAgfHwgY3AgIiRXSU5JTkkiICAgICIkQ1JPT1Qvd2luZG93cy93aW4uaW5pIgogIFsgLWYgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS5pbmkiIF0gfHwgY3AgIiRTWVNURU1JTkkiICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0uaW5pIgogIGlmIFsgIiRET0NPTkYiID0gJ3llcycgXQogIHRoZW4gewogICAgc2VkICJzfFBhdGg9L2NcJHxQYXRoPSR7Q1JPT1R9fCIgJFdJTkVJTkkgPiAkQ09ORgogICAgY29uZl9yZXNldF9xdWVzdGlvbiBkZWZhdWx0X2NvbmZpZwogICAgY29uZl9xdWVzdGlvbiBsb3cgZGVmYXVsdF9jb25maWcgXAogICAgICJDcmVhdGVkICRDT05GIHVzaW5nIGRlZmF1bHQgV2luZSBjb25maWd1cmF0aW9uLiIgXAogICAgICJZb3UgcHJvYmFibHkgd2FudCB0byByZXZpZXcgdGhlIGZpbGUsIHRob3VnaC4iCiAgfQogIGZpCiAgIyBub3cgd2UgcmVhbGx5IHNob3VsZCBpbnN0YWxsIHRoZSByZWdpc3RyeQogIGlmIFsgIiRET1JFRyIgPSAnYXV0bycgXQogIHRoZW4gRE9SRUc9eWVzCiAgZmkKfQplbGlmIFsgLXogIiRDUk9PVCIgXQp0aGVuIHsKICBlY2hvCiAgZWNobyAiUmVhZGluZyBjdXJyZW50IFdpbmUgY29uZmlndXJhdGlvbiBmcm9tICRDT05GLi4uIgogIENST09UPWBzZWQgLW4gJy9eXFtEcml2ZSBDXF0kLywvXlxbLipcXSQvIHMvXlBhdGg9XCguKlwpL1wxL3AnICRDT05GYAogIGVjaG8gIkRyaXZlIEMgaXMgY29uZmlndXJlZCBhdCAkQ1JPT1QuIgp9CmZpCmVjaG8KCiMgZml4dXAgRVhUUkFfTERfTElCUkFSWV9QQVRICmlmIFsgIiRET0NPTkYiID0gJ3llcycgXQp0aGVuIHsKICBlY2hvICJTZXR0aW5nIEVYVFJBX0xEX0xJQlJBUllfUEFUSCBpbiAud2luZXJjIHRvICRETExQQVRILi4uIgogIHNlZCAic3xFWFRSQV9MRF9MSUJSQVJZX1BBVEg9Lip8RVhUUkFfTERfTElCUkFSWV9QQVRIPSR7RExMUEFUSH18IiAkQ09ORiA+ICRDT05GLm5ldwogIG12IC1mICRDT05GLm5ldyAkQ09ORgogIGVjaG8KfQpmaQoKIyBjaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gaW5zdGFsbCBkZWZhdWx0IHJlZ2lzdHJ5CiMgKG5vdCB0byBiZSBkb25lIGlmIHdpbmRvd3MgcmVnaXN0cnkgZXhpc3RzKQppZiBbICIkRE9SRUciID0gJ2F1dG8nIF0KdGhlbiB7CiAgZWNobyAiQ2hlY2tpbmcgZm9yIHJlYWwgV2luZG93cyByZWdpc3RyeS4uLiIKICBpZiBbIC1mICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0uZGF0IiBdCiAgdGhlbiBET1JFRz1ubwogIGVsaWYgWyAtZiAiJENST09UL3dpbmRvd3Mvc3lzdGVtMzIvY29uZmlnL3N5c3RlbSIgXQogIHRoZW4gRE9SRUc9bm8KICBlbHNlIERPUkVHPXllcwogIGZpCiAgaWYgWyAiJERPUkVHIiA9ICd5ZXMnIF0KICB0aGVuIGVjaG8gIk5vdCBmb3VuZCwgZGVmYXVsdCBXaW5lIHJlZ2lzdHJ5IHdpbGwgYmUgaW5zdGFsbGVkLiIKICBlbHNlIGVjaG8gIldpbmRvd3MgcmVnaXN0cnkgZm91bmQsIHdpbGwgbm90IGluc3RhbGwgZGVmYXVsdCBXaW5lIHJlZ2lzdHJ5LiIKICBmaQogIGVjaG8KfQpmaQoKIyBpbnN0YWxsIGRlZmF1bHQgcmVnaXN0cnkgZW50cmllcwppZiBbICIkRE9SRUciID0gJ3llcycgXQp0aGVuIHsKICBpZiBbICIkQklORElTVCIgPSAnbm8nIF0KICB0aGVuIHsKICAgIGVjaG8gIkNvbXBpbGluZyByZWdhcGkuLi4iCiAgICBlY2hvCiAgICAoY2QgcHJvZ3JhbXMvcmVnYXBpOyBtYWtlKQogICAgZWNobwogIH0KICBmaQogIGVjaG8gIlByZXBhcmluZyB0byBpbnN0YWxsIGRlZmF1bHQgV2luZSByZWdpc3RyeSBlbnRyaWVzLi4uIgoKICAjIGNyZWF0ZSBhIHRlbXBvcmFyeSB3aW5laW5zdGFsbC5jb25mIGZpbGUgdXNpbmcgdHR5ZHJ2LAogICMgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHJ1biByZWdhcGkgdW5kZXIgWAogIHNlZCAicy9HcmFwaGljc0RyaXZlcj0uKi9HcmFwaGljc0RyaXZlcj10dHlkcnYvIiAkQ09ORiA+ICRUTVBDT05GCgogICMgY3JlYXRlIGEgdGVtcG9yYXJ5IHdpbmVpbnN0YWxsLnJlZyB3aXRoIGZpeGVkIGRlYnVnZ2VyIHBhdGgKICAkREVGQ0FUICRERUZSRUcgfCBzZWQgInN8ZGVidWdnZXIvd2luZWRiZ3wke0RFQlVHR0VSfXwiID4gJFRNUFJFRwoKICBlY2hvICJJbnN0YWxsaW5nIGRlZmF1bHQgV2luZSByZWdpc3RyeSBlbnRyaWVzLi4uIgogIGVjaG8KICBpZiAhICRSRUdBUEkgLS1jb25maWcgJFRNUENPTkYgc2V0VmFsdWUgPCAkVE1QUkVHID4gL2Rldi9udWxsCiAgdGhlbiB7CiAgICBybSAtZiAkVE1QQ09ORiAkVE1QUkVHCiAgICBlY2hvICJSZWdpc3RyeSBpbnN0YWxsIGZhaWxlZC4iCiAgICBjb25mX3Jlc2V0X3F1ZXN0aW9uIHJlZ2FwaV9lcnJvcgogICAgY29uZl9xdWVzdGlvbiBoaWdoIHJlZ2FwaV9lcnJvcgogICAgZXhpdCAxCiAgfQogIGVsc2UgZWNobyAiUmVnaXN0cnkgZW50cmllcyBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkLiIKICBmaQogIHJtIC1mICRUTVBDT05GICRUTVBSRUcKICBpZiBbICIkU1lTUkVHIiA9ICdhdXRvJyBdCiAgdGhlbiBTWVNSRUc9eWVzCiAgZmkKfQpmaQoKIyBtYWtlIHJvb3QncyByZWdpc3RyeSBnbG9iYWwsIGlmIGRlc2lyZWQKaWYgWyBgd2hvYW1pYCA9ICdyb290JyBdICYmIFsgIiRTWVNSRUciID0gJ3llcycgXQp0aGVuIHsKICBbIC1kIH4vLndpbmUgXSB8fCBta2RpciB+Ly53aW5lCiAgaWYgISBbIC1mICRzeXNjb25mZGlyL3dpbmUudXNlcnJlZyBdCiAgdGhlbiB7CiAgICBlY2hvICJMaW5raW5nIHJvb3QncyB1c2VyIHJlZ2lzdHJ5IGhpdmUgdG8gdGhlIGdsb2JhbCByZWdpc3RyeS4uLiIKICAgIFsgLWYgfi8ud2luZS93aW5lLnVzZXJyZWcgXSAmJiBjcCB+Ly53aW5lL3dpbmUudXNlcnJlZyAkc3lzY29uZmRpci93aW5lLnVzZXJyZWcKICAgIGxuIC1zZiAkc3lzY29uZmRpci93aW5lLnVzZXJyZWcgfi8ud2luZS93aW5lLnVzZXJyZWcKICB9CiAgZmkKICBpZiAhIFsgLWYgJHN5c2NvbmZkaXIvd2luZS5zeXN0ZW1yZWcgXQogIHRoZW4gewogICAgZWNobyAiTGlua2luZyByb290J3Mgc3lzdGVtIHJlZ2lzdHJ5IGhpdmUgdG8gdGhlIGdsb2JhbCByZWdpc3RyeS4uLiIKICAgIFsgLWYgfi8ud2luZS9zeXN0ZW0ucmVnIF0gJiYgY3Agfi8ud2luZS9zeXN0ZW0ucmVnICRzeXNjb25mZGlyL3dpbmUuc3lzdGVtcmVnCiAgICBsbiAtc2YgJHN5c2NvbmZkaXIvd2luZS5zeXN0ZW1yZWcgfi8ud2luZS9zeXN0ZW0ucmVnCiAgfQogIGZpCn0KZmkKCiMgaXQncyBhIHdyYXAKZWNobwplY2hvICJJbnN0YWxsYXRpb24gY29tcGxldGUgZm9yIG5vdy4gR29vZCBsdWNrICh0aGlzIGlzIHN0aWxsIGFscGhhIHNvZnR3YXJlKS4iCmVjaG8gIklmIHlvdSBoYXZlIHByb2JsZW1zIHdpdGggV0lORSwgcGxlYXNlIHJlYWQgdGhlIGRvY3VtZW50YXRpb24gZmlyc3QsIgplY2hvICJhcyBtYW55IGtpbmRzIG9mIHBvdGVudGlhbCBwcm9ibGVtcyBhcmUgZXhwbGFpbmVkIHRoZXJlLiIKCmV4aXQgMAo=