IyEvYmluL2Jhc2gKIyBXSU5FIEluc3RhbGxhdGlvbiBzY3JpcHQKIyBDYW4gZG8gYWxtb3N0IGV2ZXJ5dGhpbmcgZnJvbSBjb21waWxpbmcgdG8gY29uZmlndXJpbmcuLi4KIwojIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiMKCiMtLS0gZGVmYXVsdHMgKGNoYW5nZSB0aGVzZSBpZiB5b3UgYXJlIGEgcGFja2FnZXIpCkNPTkZBUkdTPSIiICAgICAgICAgICAgICAgICAgICMgY29uZmlndXJlIGFyZ3MsIGUuZy4gLS1wcmVmaXg9L3VzciAtLXN5c2NvbmZkaXI9L2V0YwpwcmVmaXg9L3Vzci9sb2NhbCAgICAgICAgICAgICAjIGluc3RhbGxhdGlvbiBwcmVmaXgKc3lzY29uZmRpcj0kcHJlZml4L2V0YyAgICAgICAgIyB3aGVyZSB3aW5lLmNvbmYgYW5kIHRoZSBnbG9iYWwgcmVnaXN0cnkgYXJlIHN1cHBvc2VkIHRvIGJlCmJpbmRpcj0kcHJlZml4L2JpbiAgICAgICAgICAgICMgd2hlcmUgd2luZWxpYiBhcHBzIHdpbGwgYmUgKG9yIGFyZSkgaW5zdGFsbGVkCmxpYmRpcj0kcHJlZml4L2xpYiAgICAgICAgICAgICMgd2hlcmUgbGlid2luZS5zbyB3aWxsIGJlIChvciBpcykgaW5zdGFsbGVkCmV4ZGlyPWRvY3VtZW50YXRpb24vc2FtcGxlcyAgICMgd2hlcmUgdGhlIHNhbXBsZSBzeXN0ZW0uaW5pIHJlc2lkZXMKTENPTkY9fi8ud2luZS9jb25maWcgICAgICAgICAgIyBkZWZhdWx0IHBhdGggb2YgdGhlIGxvY2FsIGNvbmZpZyBmaWxlCkJJTkRJU1Q9bm8gICAgICAgICAgICAgICAgICAgICMgd2hldGhlciBjYWxsZWQgZnJvbSBhIGJpbmFyeSBwYWNrYWdlIGNvbmZpZyBzY3JpcHQKRE9MT0NBTENPTkY9YXV0byAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9nZW5lcmF0ZSBsb2NhbGNvbmYKRE9XQ0hLPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9jb25maWd1cmUgZXhpc3Rpbmctd2luZG93cyBpbnN0YWxsYXRpb24KRE9XSU5FPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9jb25maWd1cmUgbm8td2luZG93cyBpbnN0YWxsYXRpb24KRE9SRUc9YXV0byAgICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGluc3RhbGwgZGVmYXVsdCByZWdpc3RyeQpET0FQUD1hdXRvICAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gaW5zdGFsbCBhcHBsaWNhdGlvbnMsIGRpc3RyaWJ1dGVkIHdpdGggV2luZQpTWVNSRUc9eWVzICAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gbWFrZSByb290J3MgcmVnaXN0cnkgZ2xvYmFsIChzeXN0ZW0tZGVmYXVsdCkKCiMgdGhpcyBpcyBvbmx5IGZvciBleGlzdGluZy13aW5kb3dzIGluc3RhbGxzCldJTkVDT05GPXRvb2xzL3dpbmVjb25mICAgICAgICMgcGF0aCB0byB0aGUgd2luZWNvbmYgcGVybCBzY3JpcHQKCiMgdGhpcyBpcyBvbmx5IGZvciBuby13aW5kb3dzIGluc3RhbGxzCldJTkVJTkk9JGV4ZGlyL2NvbmZpZyAgICAgICAgICMgcGF0aCB0byB0aGUgZGVmYXVsdCB3aW5lIGNvbmZpZyBmaWxlIChhbHNvIHVzZWQgYnkgd2luZWNvbmYpCiMgQ1JPT1Q9L3Zhci93aW5lICAgICAgICAgICAgICMgcGF0aCBvZiB0aGUgZmFrZSBEcml2ZSBDIChhc2tzIHVzZXIgaWYgbm90IHNldCkKIy0tLSBlbmQgb2YgZGVmYXVsdHMKCiMgdGVtcG9yYXJ5IGZpbGVzIHVzZWQgYnkgdGhlIGluc3RhbGxlcgpUTVBDT05GPS90bXAvd2luZWluc3RhbGwuY29uZgoKIyBmdW5jdGlvbnMKCmZ1bmN0aW9uIHN0ZF9zbGVlcCB7CiAgc2xlZXAgMQp9CgpmdW5jdGlvbiBjb25mX3F1ZXN0aW9uIHsKICAjIHBhcmFtZXRlcnM6ICQxID0gaW1wb3J0YW5jZSwgJDIgPSBxdWVzdGlvbi1pZCwgJDMrID0gbWVzc2FnZSBsaW5lcwogICMgdGhlIGZpcnN0IHR3byBwYXJhbWV0ZXJzIGNhbiBiZSB1c2VkIGJ5IGUuZy4gZGViY29uZiBpbiBkZWJpYW4gcGFja2FnZXMKICAjIGJ1dCBoZXJlIHdlIGp1c3QgcHJpbnQgdGhlIG1lc3NhZ2UKICBzaGlmdCAyCiAgZWNobwogIGxvY2FsIExJTkU9IiQxIgogIHdoaWxlIHNoaWZ0CiAgZG8gewogICAgZWNobyAiJExJTkUiCiAgICBMSU5FPSIkMSIKICB9CiAgZG9uZQp9CgpmdW5jdGlvbiBjb25mX3Jlc2V0X3F1ZXN0aW9uIHsKICAjIHBhcmFtZXRlcnM6ICQxID0gcXVlc3Rpb24taWQKICAjIHRoaXMgaXMgdXNlZCB0byBmbHVzaCBhbnkgY2FjaGVkIGFuc3dlcnMgYW5kICJhbHJlYWR5LWRpc3BsYXllZCIgZmxhZ3MKICBzaGlmdCAjIGR1bW15IGNvbW1hbmQKfQoKZnVuY3Rpb24gY29uZl95ZXNub19hbnN3ZXIgewogIHVuc2V0IEFOU1dFUgogIHdoaWxlIFsgIiRBTlNXRVIiICE9ICd5ZXMnIF0gJiYgWyAiJEFOU1dFUiIgIT0gJ25vJyBdCiAgZG8gewogICAgZWNobyAtbiAiJDEiCiAgICByZWFkIEFOU1dFUgogIH0KICBkb25lCn0KCmZ1bmN0aW9uIGNvbmZfc3RyaW5nX2Fuc3dlciB7CiAgZWNobyAtbiAiJDEiCiAgcmVhZCBBTlNXRVIKfQoKIyBzdGFydHVwLi4uCgplY2hvICJXSU5FIEluc3RhbGxlciB2MC43NCIKZWNobwoKaWYgWyAiJEJJTkRJU1QiID0gJ25vJyBdCnRoZW4gewoKICBpZiAhIFsgLWYgY29uZmlndXJlIF0KICB0aGVuIHsKICAgIGlmIFsgLWYgLi4vY29uZmlndXJlIF0KICAgIHRoZW4gewogICAgICBwdXNoZCAuLgogICAgfQogICAgZWxzZSB7CiAgICAgIGVjaG8gIllvdSdyZSBydW5uaW5nIHRoaXMgZnJvbSB0aGUgd3JvbmcgZGlyZWN0b3J5LiIKICAgICAgZWNobyAiQ2hhbmdlIHRvIHRoZSBXaW5lIHNvdXJjZSdzIG1haW4gZGlyZWN0b3J5IGFuZCB0cnkgYWdhaW4uIgogICAgICBleGl0IDEKICAgIH0KICAgIGZpCiAgfQogIGZpCgogIGlmIFsgYHdob2FtaWAgPSAncm9vdCcgXQogIHRoZW4gewogICAgZWNobyAiWW91IGFyZSBydW5uaW5nIHdpbmVpbnN0YWxsIGFzIHJvb3QsIHRoaXMgaXMgbm90IGFkdmlzYWJsZS4gUGxlYXNlIHJlcnVuIGFzIGEgdXNlci4iCiAgICBlY2hvICJBYm9ydGluZy4iCiAgICBleGl0IDEKICB9CiAgZmkKCiAgaWYgWyAhIC13IC4gXQogIHRoZW4gewogICAgZWNobyAiVGhlIHNvdXJjZSBkaXJlY3RvcnkgaXMgbm90IHdyaXRhYmxlLiBZb3UgcHJvYmFibHkgZXh0cmFjdGVkIHRoZSBzb3VyY2VzIGFzIHJvb3QuIgogICAgZWNobyAiWW91IHNob3VsZCByZW1vdmUgdGhlIHNvdXJjZSB0cmVlIGFuZCBleHRyYWN0IGl0IGFnYWluIGFzIGEgbm9ybWFsIHVzZXIuIgogICAgZXhpdCAxCiAgfQogIGZpCgogICMgY2hlY2sgd2hldGhlciBSUE0gaW5zdGFsbGVkLCBhbmQgaWYgaXQgaXMsIHJlbW92ZSBhbnkgb2xkIHdpbmUgcnBtLgogIGhhc2ggcnBtICY+L2Rldi9udWxsCiAgUkVUPSQ/CiAgaWYgWyAkUkVUIC1lcSAwIF07IHRoZW4KICAgIGlmIFsgLW4gImBycG0gLXFpIHdpbmUgMj4vZGV2L251bGx8Z3JlcCAiXk5hbWUiYCIgXTsgdGhlbgogICAgICBlY2hvICJXYXJuaW5nOiBPbGQgV2luZSBSUE0gaW5zdGFsbCBkZXRlY3RlZC4gRG8geW91IHdhbnQgdG8gcmVtb3ZlIGl0IGZpcnN0PyIKICAgICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgICAgaWYgWyAiJEFOU1dFUiIgPSAneWVzJyBdOyB0aGVuCiAgICAgICAgZWNobyAiV2UgbmVlZCB0byByZW1vdmUgdGhlIHJwbSBhcyByb290LCBwbGVhc2UgZW50ZXIgeW91ciByb290IHBhc3N3b3JkIgogICAgICAgIGVjaG8KICAgICAgICBlY2hvIFN0YXJ0aW5nIHdpbmUgcnBtIHJlbW92YWwuLi4KICAgICAgICBzdSAtYyAicnBtIC1lIHdpbmU7IFJFVD0kPyIKICAgICAgICBpZiBbICRSRVQgLWVxIDAgXTsgdGhlbgogICAgICAgICAgZWNobyBEb25lLgogICAgICAgIGVsc2UKICAgICAgICAgIGVjaG8gIkZBSUxFRC4gUHJvYmFibHkgeW91IGFyZW4ndCBpbnN0YWxsaW5nIGFzIHJvb3QuIgogICAgICAgICAgZWNobyAiRXhwZWN0IHByb2JsZW1zIChsaWJyYXJ5IGNvbmZsaWN0cyB3aXRoIGV4aXN0aW5nIGluc3RhbGwgZXRjLikuIgogICAgICAgIGZpCiAgICAgIGVsc2UKICAgICAgICBlY2hvICJTb3JyeSwgSSB3b24ndCBpbnN0YWxsIFdpbmUgd2hlbiBhbiBycG0gdmVyc2lvbiBpcyBzdGlsbCBpbnN0YWxsZWQuIgogICAgICAgIGVjaG8gIihXaW5lIHN1cHBvcnQgc3VmZmVyZWQgZnJvbSB3YXkgdG9vIG1hbnkgY29uZmxpY3RzIGJldHdlZW4gUlBNIgogICAgICAgIGVjaG8gImFuZCBzb3VyY2UgaW5zdGFsbHMpIgogICAgICAgIGVjaG8gIkhhdmUgYSBuaWNlIGRheSAhIgogICAgICAgIGV4aXQgMQogICAgICBmaQogICAgZmkKICBmaQoKICAjIGNoZWNrIHdoZXRoZXIgd2luZSBiaW5hcnkgc3RpbGwgYXZhaWxhYmxlCiAgaWYgWyAtbiAiYHdoaWNoIHdpbmUgMj4vZGV2L251bGx8Z3JlcCAnL3dpbmUnYCIgXTsgdGhlbgogICAgZWNobyAiV2FybmluZyAhISB3aW5lIGJpbmFyeSAoc3RpbGwpIGZvdW5kLCB3aGljaCBtYXkgaW5kaWNhdGUiCiAgICBlY2hvICJhIChjb25mbGljdGluZykgcHJldmlvdXMgaW5zdGFsbGF0aW9uLiIKICAgIGVjaG8gIllvdSBtaWdodCB3YW50IHRvIGFib3J0IGFuZCB1bmluc3RhbGwgV2luZSBmaXJzdC4iCiAgICBzdGRfc2xlZXAKICBmaQoKICAjIHJ1biB0aGUgY29uZmlndXJlIHNjcmlwdCwgaWYgbmVjZXNzYXJ5CgogIGlmIFsgLWYgY29uZmlnLmNhY2hlIF0gJiYgWyAtZiBNYWtlZmlsZSBdICYmIFsgTWFrZWZpbGUgLW50IGNvbmZpZ3VyZSBdCiAgdGhlbiB7CiAgICBlY2hvCiAgICBlY2hvICJJIHNlZSB0aGF0IFdJTkUgaGFzIGFscmVhZHkgYmVlbiBjb25maWd1cmVkLCBzbyBJJ2xsIHNraXAgdGhhdC4iCiAgICBzdGRfc2xlZXAKICAgICMgbG9hZCBjb25maWd1cmUgcmVzdWx0cwogICAgLiAuL2NvbmZpZy5jYWNoZQogIH0KICBlbHNlIHsKICAgIGVjaG8gIlJ1bm5pbmcgY29uZmlndXJlLi4uIgogICAgZWNobwogICAgaWYgISAuL2NvbmZpZ3VyZSAtQyAkQ09ORkFSR1MgLS1wcmVmaXg9JHByZWZpeAogICAgdGhlbiB7CiAgICAgIGVjaG8KICAgICAgZWNobyAiQ29uZmlndXJlIGZhaWxlZCwgYWJvcnRpbmcgaW5zdGFsbC4iCiAgICAgIHJtIC1mIGNvbmZpZy5jYWNoZQogICAgICBleGl0IDEKICAgIH0KICAgIGZpCiAgICAjIGxvYWQgY29uZmlndXJlIHJlc3VsdHMKICAgIC4gLi9jb25maWcuY2FjaGUKICAgICMgbWFrZSBzdXJlIFggd2FzIGZvdW5kCiAgICBldmFsICIkYWNfY3ZfaGF2ZV94IgogICAgaWYgWyAiJGhhdmVfeCIgIT0gInllcyIgXQogICAgdGhlbiB7CiAgICAgIGVjaG8gIkluc3RhbGwgdGhlIFggZGV2ZWxvcG1lbnQgaGVhZGVycyBhbmQgdHJ5IGFnYWluLiIKICAgICAgcm0gLWYgY29uZmlnLmNhY2hlCiAgICAgIGV4aXQgMQogICAgfQogICAgZmkKICB9CiAgZmkKCiAgIyBub3cgZG8gdGhlIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsLCB3ZSBuZWVkIHRvIGFsd2F5cyBkbyB0aGlzIGJlY2F1c2Ugd2UKICAjIGRvbid0IHdhbnQgdGhlICdtYWtlIGluc3RhbGwnIGNvbW1hbmQgd2UgbWlnaHQgcnVuIHRvIHJ1biAnbWFrZScgYXMgcm9vdAogIGlmIFsgYHdob2FtaWAgIT0gJ3Jvb3QnIF0KICB0aGVuIHsKICAgICMgYXNrIHRoZSB1c2VyIGlmIHRoZXkgd2FudCB0byBidWlsZCBhbmQgaW5zdGFsbCB3aW5lCiAgICBlY2hvCiAgICBlY2hvICJXZSBuZWVkIHRvIGluc3RhbGwgd2luZSBhcyByb290IHVzZXIsIGRvIHlvdSB3YW50IHVzIHRvIGJ1aWxkIHdpbmUsIgogICAgZWNobyAiJ3N1IHJvb3QnIGFuZCBpbnN0YWxsIFdpbmU/ICBFbnRlciAnbm8nIHRvIGNvbnRpbnVlIHdpdGhvdXQgaW5zdGFsbGluZyIKICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICBST09USU5TVEFMTD0iJEFOU1dFUiIKCiAgICBpZiBbICIkUk9PVElOU1RBTEwiID0gInllcyIgXQogICAgdGhlbiB7CiAgICAgICMgc3RhcnQgb3V0IHdpdGggdGhlIGJhc2ljIGNvbW1hbmQKICAgICAgc3Vjb21tYW5kPSJtYWtlIGluc3RhbGwiCgogICAgICAjIGlmIHRoZSB1c2VyIGRvZXNuJ3QgaGF2ZSAkbGliZGlyIGluIHRoZWlyIGxkLnNvLmNvbmYgYWRkIHRoaXMKICAgICAgIyB0byBvdXIgc3Vjb21tYW5kIHN0cmluZwogICAgICBpZiBbIC1mIC9ldGMvbGQuc28uY29uZiBdCiAgICAgIHRoZW4KICAgICAgICBpZiAhIGdyZXAgLXMgIiRsaWJkaXIiIC9ldGMvbGQuc28uY29uZiA+L2Rldi9udWxsIDI+JjEKICAgICAgICB0aGVuIHsKICAgICAgICAgIGVjaG8KICAgICAgICAgIGVjaG8gIiRsaWJkaXIgZG9lc24ndCBleGlzdCBpbiB5b3VyIC9ldGMvbGQuc28uY29uZiwgaXQgd2lsbCBiZSBhZGRlZCIKICAgICAgICAgIGVjaG8gIndoZW4gd2UgcGVyZm9ybSB0aGUgaW5zdGFsbC4uLiIKICAgICAgICAgIHN1Y29tbWFuZD0iJHN1Y29tbWFuZDtlY2hvICRsaWJkaXI+Pi9ldGMvbGQuc28uY29uZiIKICAgICAgICB9CiAgICAgICAgZmkKICAgICAgICAjIHJ1biBsZGNvbmZpZyBhbHdheXMganVzdCBpbiBjYXNlIHNvbWUgdXBkYXRlZCBmaWxlcyBkb24ndCBnZXQgbGlua2VkCiAgICAgICAgc3Vjb21tYW5kPSIkc3Vjb21tYW5kOyRhY19jdl9wYXRoX0xEQ09ORklHIgogICAgICBmaQogICAgfQogICAgZmkgIyBbICIkUk9PVElOU1RBTEwiID0gInllcyIgXQoKICAgIGVjaG8KCiAgICBlY2hvICJDb21waWxpbmcgV0lORS4gR3JhYiBhIGx1bmNoIG9yIHR3bywgcmVudCBhIHZpZGVvLCBvciB3aGF0ZXZlciwiCiAgICBlY2hvICJpbiB0aGUgbWVhbnRpbWUuLi4iCiAgICBlY2hvCiAgICBzdGRfc2xlZXAKCiAgICAjIHRyeSB0byBqdXN0IG1ha2Ugd2luZSwgaWYgdGhpcyBmYWlscyAnbWFrZSBkZXBlbmQnIGFuZCB0cnkgdG8gcmVtYWtlCiAgICBpZiAhIHsgbWFrZTsgfQogICAgdGhlbiB7CiAgICAgIGlmICEgeyBtYWtlIGRlcGVuZCAmJiBtYWtlOyB9CiAgICAgIHRoZW4gewogICAgICAgIGVjaG8KICAgICAgICBlY2hvICJDb21waWxhdGlvbiBmYWlsZWQsIGFib3J0aW5nIGluc3RhbGwuIgogICAgICAgIGV4aXQgMQogICAgICB9CiAgICAgIGZpCiAgICB9CiAgICBmaQoKICAgIGlmIFsgIiRST09USU5TVEFMTCIgPSAieWVzIiBdCiAgICB0aGVuIHsKICAgICAgZWNobwoKICAgICAgZWNobyAiUGVyZm9ybWluZyAnbWFrZSBpbnN0YWxsJyBhcyByb290IHRvIGluc3RhbGwgYmluYXJpZXMsIGVudGVyIHJvb3QgcGFzc3dvcmQiCgogICAgICBzdGRfc2xlZXAKCiAgICAgIGlmICEgc3Ugcm9vdCAtYyAiJHN1Y29tbWFuZCIKICAgICAgdGhlbiB7CiAgICAgIAlpZiAhIHN1IHJvb3QgLWMgIiRzdWNvbW1hbmQiCiAgICAgICAgdGhlbiB7CiAgICAgIAkgICAgIGVjaG8KICAgICAgICAgICAgIGVjaG8gIkVpdGhlciB5b3UgZW50ZXJlZCBhbiBpbmNvcnJlY3QgcGFzc3dvcmQgb3Igd2UgZmFpbGVkIHRvIgogICAgICAgICAgICAgZWNobyAicnVuICckc3Vjb21tYW5kJyBjb3JyZWN0bHkuIgogICAgICAgICAgICAgZWNobyAiSWYgeW91IGRpZG4ndCBlbnRlciBhbiBpbmNvcnJlY3QgcGFzc3dvcmQgdGhlbiBwbGVhc2UiCiAgICAgICAgICAgICBlY2hvICJyZXBvcnQgdGhpcyBlcnJvciBhbmQgYW55IHN0ZXBzIHRvIHBvc3NpYmx5IHJlcHJvZHVjZSBpdCB0byIKICAgICAgICAgICAgIGVjaG8gImh0dHA6Ly9idWdzLndpbmVocS5vcmcvIgogICAgICAgICAgICAgZWNobwogICAgICAgICAgICAgZWNobyAiSW5zdGFsbGF0aW9uIGZhaWxlZCwgYWJvcnRpbmcuIgogICAgICAgICAgICAgZXhpdCAxCiAgICAgICAgIH0KICAgICAgICAgZmkKICAgICAgIH0KICAgICAgZmkKCiAgICAgIGVjaG8KCiAgICAgICMgc2VlIGlmIHdpbmUgaXMgaW5zdGFsbGVkIG9uIHRoZSB1c2VycyBzeXN0ZW0sIGlmIG5vdCBwcm9tcHQgdGhlbQogICAgICAjIGFuZCB0aGVuIGV4aXQKICAgICAgaWYgWyAhIGB3aGljaCB3aW5lYCBdCiAgICAgIHRoZW4KICAgICAgICBlY2hvICJDb3VsZCBub3QgZmluZCB3aW5lIG9uIHlvdXIgc3lzdGVtLiAgUnVuIHdpbmVpbnN0YWxsIGFzIHJvb3QgdG8gaW5zdGFsbCB3aW5lIgogICAgICAgIGVjaG8gImJlZm9yZSByZS1ydW5uaW5nIHdpbmVpbnN0YWxsIGFzIGEgdXNlci4iCiAgICAgICAgZWNobwogICAgICAgIGVjaG8gIkV4aXRpbmcgd2luZWluc3RhbGwiCiAgICAgICAgZXhpdCAxOwogICAgICBmaQoKICAgICAgV0lORUlOU1RBTExFRD15ZXMKICAgIH0KICAgIGVsc2UgewogICAgICBXSU5FSU5TVEFMTEVEPW5vCiAgICB9CiAgICBmaSAjIFsgIiRST09USU5TVEFMTCIgPSAieWVzIiBdCiAgfQogIGZpICMgWyBgd2hvYW1pYCAhPSAncm9vdCcgXQoKfQpmaSAjIEJJTkRJU1QKCiMgbm93IGNoZWNrIHdoZXRoZXIgd2Ugc2hvdWxkIGdlbmVyYXRlIHdpbmUuY29uZgppZiBbICIkRE9MT0NBTENPTkYiID0gJ2F1dG8nIF0KdGhlbiB7CiAgIyBzZWUgaWYgdGhlIHVzZXIgaXMgcm9vdCwgaWYgc28sIGV4cGxpY2l0bHkgYXNrIHRoZW0gaWYgdGhleSB3YW50IGEKICAjIGxvY2FsIGNvbmZpZyBmaWxlCiAgaWYgWyBgd2hvYW1pYCA9ICdyb290JyBdCiAgdGhlbgogICAgZWNobyAiWW91IGFyZSBydW5uaW5nIGFzIHJvb3QuICBEbyB5b3Ugd2FudCBhIGxvY2FsIGNvbmZpZyBmaWxlLCIKICAgIGVjaG8gImZpbGUsIH4vLndpbmUvY29uZmlnLCBjcmVhdGVkPyIKICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICBET0xPQ0FMQ09ORj0iJEFOU1dFUiIKICBlbHNlCiAgICAjIGlmIHRoZSB1c2VyIGhhcyBhbiBleGlzdGluZyBjb25maWcgZmlsZSBhc2sgdGhlbSBpZiB0aGV5IHdhbnQgdXMgdG8KICAgICMgb3ZlcndyaXRlIGl0LCBvdGhlcndpc2UganVzdCBhc2sgdGhlbSBpZiB0aGV5IHdhbnQgdG8gY3JlYXRlIG9uZQogICAgaWYgWyAtZiAiJExDT05GIiBdCiAgICB0aGVuCiAgICAgIGVjaG8gIkZvdW5kIGV4aXN0aW5nICRMQ09ORiwgZG8geW91IHdhbnQgdG8gb3ZlcndyaXRlIHRoaXMiCiAgICAgIGVjaG8gImV4aXN0aW5nIFdpbmUgY29uZmlndXJhdGlvbiBmaWxlPyIKICAgICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgICAgRE9MT0NBTENPTkY9IiRBTlNXRVIiCiAgICAgIGVjaG8KICAgICAgaWYgWyAiJEFOU1dFUiIgPSAieWVzIiBdCiAgICAgIHRoZW4KICAgICAgewogICAgICAgIGVjaG8gIldvdWxkIHlvdSBsaWtlIHRvIG1ha2UgYSBiYWNrdXAgb2YgdGhpcyBvbGQgY29uZmlnIGZpbGU/IgogICAgICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICAgICAgZWNobwogICAgICAgIGlmIFsgIiRBTlNXRVIiID0gInllcyIgXQogICAgICAgIHRoZW4KICAgICAgICB7CiAgICAgICAgICBlY2hvICJSZW5hbWluZyAkTENPTkYgdG8gJExDT05GLm9sZCIKICAgICAgICAgIG12IC1mICIkTENPTkYiICIkTENPTkYub2xkIgogICAgICAgICAgZWNobwogICAgICAgIH0KICAgICAgICBmaQogICAgICB9CiAgICAgIGZpCiAgICBlbHNlCiAgICB7CiAgICAgIGVjaG8gIkNyZWF0ZSBsb2NhbCBjb25maWcgZmlsZSB+Ly53aW5lL2NvbmZpZz8iCiAgICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICAgIERPTE9DQUxDT05GPSIkQU5TV0VSIgogICAgICBlY2hvCiAgICAgIGlmIFsgIiRBTlNXRVIiID0gJ25vJyBdCiAgICAgIHRoZW4KICAgICAgICBjb25mX3F1ZXN0aW9uIGhpZ2ggbmVlZF9yb290IFwKICAgICAgICAgICJBYm9ydGluZyBpbnN0YWxsLiBUcnkgYWdhaW4gYXMgcm9vdCB0byBnZW5lcmF0ZSBhIHN5c3RlbSB3aW5lLmNvbmYuIgogICAgICAgIGV4aXQgMQogICAgICBmaQogICAgfQogICAgZmkKICBmaQp9CmZpCgojIGdlbmVyYXRlICRUTVBDT05GIGZyb20gZXhpc3Rpbmcgd2luZG93cyBpbnN0YWxsLCBpZiBhbnkKaWYgWyAiJERPTE9DQUxDT05GIiA9ICd5ZXMnIF0KdGhlbiB7CiAgaWYgWyAiJERPV0NISyIgPSAneWVzJyBdIHx8IFsgIiRET1dDSEsiID0gJ2F1dG8nIF0KICB0aGVuIHsKICAgIGVjaG8gLW4gIlNlYXJjaGluZyBmb3IgYW4gZXhpc3RpbmcgV2luZG93cyBpbnN0YWxsYXRpb24uLi4iCiAgICBpZiAhICRXSU5FQ09ORiAtaW5pZmlsZSAiJFdJTkVJTkkiID4gJFRNUENPTkYgMj4vZGV2L251bGwKICAgIHRoZW4gewogICAgICBybSAtZiAkVE1QQ09ORiA+IC9kZXYvbnVsbAoKICAgICAgZWNobyAiIG5vdCBmb3VuZC4gKG5vIG1hdGNoaW5nIC9ldGMvZnN0YWIgbW91bnQgZW50cnkgZm91bmQpIgogICAgICBjb25mX3F1ZXN0aW9uIGxvdyBkb193aXRob3V0X3dpbmRvd3MgXAogICAgICAgIldpbmRvd3Mgd2FzIG5vdCBmb3VuZCBvbiB5b3VyIHN5c3RlbSwgc28gSSBhc3N1bWUgeW91IHdhbnQiIFwKICAgICAgICJhIFdpbmUtb25seSBpbnN0YWxsYXRpb24uIEFtIEkgY29ycmVjdD8iCiAgICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICAgIGlmIFsgIiRBTlNXRVIiID0gJ25vJyBdCiAgICAgIHRoZW4gewogICAgICAgIGNvbmZfcXVlc3Rpb24gaGlnaCB3aW5kb3dzX25vdF9mb3VuZCBcCiAgICAgICAgICJBYm9ydGluZyBpbnN0YWxsLiBNYWtlIHN1cmUgeW91ciBXaW5kb3dzIHBhcnRpdGlvbiBpcyBtb3VudGVkIGFuZCB0cnkgYWdhaW4sIiBcCiAgICAgICAgICJvciBjcmVhdGUgJExDT05GIG1hbnVhbGx5IGJ5IGNvcHlpbmcgZnJvbSAkV0lORUlOSSBhbmQgYWRhcHRpbmcgdGhlIGRyaXZlIHBhdGhzLiIKICAgICAgICBleGl0IDEKICAgICAgfQogICAgICBmaQogICAgICBET1dJTkU9eWVzCiAgICB9CiAgICBlbHNlIHsKICAgICAgZWNobyAiIGZvdW5kLiIKCiAgICAgIGNvbmZfcXVlc3Rpb24gbG93IGRvX3dpdGhvdXRfd2luZG93cyBcCiAgICAgICAiV2luZG93cyB3YXMgZm91bmQgb24geW91ciBzeXN0ZW0sIGFuZCBzbyB3ZSBjYW4gdXNlIHRoZSBXaW5kb3dzIiBcCiAgICAgICAiRHJpdmUgYXMgb3VyIFdpbmUgZHJpdmUuIFlvdSBtYXksIGhvd2V2ZXIsIHdpc2ggdG8gY3JlYXRlIGEgY2xlYW4iIFwKICAgICAgICJXaW5lIGluc3RhbGwgYW55d2F5cy4iCiAgICAgIGNvbmZfeWVzbm9fYW5zd2VyICJTaG91bGQgSSB1c2UgdGhlIFdpbmRvd3MgZHJpdmUgZm9yIHRoZSBXaW5lIGluc3RhbGw/ICh5ZXMvbm8pICIKICAgICAgaWYgWyAiJEFOU1dFUiIgPSAneWVzJyBdCiAgICAgIHRoZW4gewogICAgICAgIGNvbmZfcmVzZXRfcXVlc3Rpb24gd2luZG93c19mb3VuZAogICAgICAgIGNvbmZfcXVlc3Rpb24gbG93IHdpbmRvd3NfZm91bmQgXAogICAgICAgICAiQ3JlYXRlZCAkTENPTkYgdXNpbmcgeW91ciBleGlzdGluZyBXaW5kb3dzIGluc3RhbGxhdGlvbi4iIFwKICAgICAgICAgIllvdSBwcm9iYWJseSB3YW50IHRvIHJldmlldyB0aGUgZmlsZSwgdGhvdWdoLiIKICAgICAgICBET1dJTkU9bm8KICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBET1dJTkU9eWVzCiAgICAgIH0KICAgICAgZmkKICAgIH0KICAgIGZpCiAgfQogIGVsaWYgWyAiJERPV0lORSIgPSAnYXV0bycgXQogIHRoZW4gRE9XSU5FPXllcwogIGZpCn0KZWxpZiBbICIkRE9XSU5FIiA9ICdhdXRvJyBdCnRoZW4KICBET1dJTkU9bm8KZmkKCiMgc2V0dXAgYSBuby13aW5kb3dzIGluc3RhbGxhdGlvbiwgaWYgbmVjZXNzYXJ5CmlmIFsgIiRET1dJTkUiID0gJ3llcycgXQp0aGVuIHsKICAjIHNldCBhbiBhcHByb3ByaWF0ZSBEQ1JPT1QKICBpZiBbIGB3aG9hbWlgICE9ICdyb290JyBdCiAgdGhlbiBEQ1JPT1Q9fi8ud2luZS9kcml2ZV9jCiAgZWxzZSBEQ1JPT1Q9L2MKICBmaQoKICBjb25mX3F1ZXN0aW9uIGxvdyBkcml2ZWNfcGF0aCBcCiAgICAgIkNvbmZpZ3VyaW5nIFdpbmUgd2l0aG91dCBXaW5kb3dzLiIgXAogICAgICJTb21lIGZha2UgV2luZG93cyBkaXJlY3RvcmllcyBtdXN0IGJlIGNyZWF0ZWQsIHRvIGhvbGQgYW55IC5pbmkgZmlsZXMsIERMTHMsIiBcCiAgICAgInN0YXJ0IG1lbnUgZW50cmllcywgYW5kIG90aGVyIHRoaW5ncyB5b3VyIGFwcGxpY2F0aW9ucyBtYXkgbmVlZCB0byBpbnN0YWxsLiIgXAogICAgICJXaGVyZSB3b3VsZCB5b3UgbGlrZSB5b3VyIGZha2UgQyBkcml2ZSB0byBiZSBwbGFjZWQ/IgogIHdoaWxlIFsgLXogIiRDUk9PVCIgXQogIGRvIHsKICAgIGNvbmZfc3RyaW5nX2Fuc3dlciAiKGRlZmF1bHQgaXMgJERDUk9PVCkgIgogICAgWyAteiAiJEFOU1dFUiIgXSAmJiBBTlNXRVI9IiREQ1JPT1QiCiAgICBpZiAhIFsgLWQgIiRBTlNXRVIiIF0KICAgIHRoZW4gewogICAgICBpZiBta2RpciAtcCAiJEFOU1dFUiIKICAgICAgdGhlbiBDUk9PVD0iJEFOU1dFUiIKICAgICAgZWxzZQogICAgICAgICAgZWNobyAiRGlyZWN0b3J5ICRBTlNXRVIgY2FuJ3QgYmUgY3JlYXRlZCAhIgogICAgICAgICAgY29uZl9yZXNldF9xdWVzdGlvbiBkcml2ZWNfcGF0aAogICAgICBmaQogICAgfQogICAgZWxzZSBDUk9PVD0iJEFOU1dFUiIKICAgIGZpCiAgfQogIGRvbmUKICBlY2hvICJDb25maWd1cmluZyBXaW5lIGZvciBhIG5vLXdpbmRvd3MgaW5zdGFsbCBpbiAkQ1JPT1QuLi4iCgogIGlmIFsgISAtZCB+Ly53aW5lL2Rvc2RldmljZXMgXQogIHRoZW4KICAgIFsgLWQgfi8ud2luZSBdIHx8IG1rZGlyIH4vLndpbmUKICAgIG1rZGlyIH4vLndpbmUvZG9zZGV2aWNlcwogICAgbG4gLXMgL21udC9mZDAgfi8ud2luZS9kb3NkZXZpY2VzL2E6CiAgICBsbiAtcyAkQ1JPT1Qgfi8ud2luZS9kb3NkZXZpY2VzL2M6CiAgICBsbiAtcyAvY2Ryb20gfi8ud2luZS9kb3NkZXZpY2VzL2Q6CiAgICBsbiAtcyAvdG1wIH4vLndpbmUvZG9zZGV2aWNlcy9lOgogICAgbG4gLXMgfiB+Ly53aW5lL2Rvc2RldmljZXMvZjoKICAgIGxuIC1zIC8gfi8ud2luZS9kb3NkZXZpY2VzL3o6CiAgZmkKCiAgaWYgWyAiJFdJTkVJTlNUQUxMRUQiID0gJ25vJyBdCiAgdGhlbgogICAgICB0b29scy93aW5lcHJlZml4Y3JlYXRlIC0tdXBkYXRlIC0tdXNlLXdpbmUtdHJlZSAuCiAgZWxzZQogICAgICB3aW5lcHJlZml4Y3JlYXRlIC0tdXBkYXRlCiAgZmkKCiAgIyBjcmVhdGUgJExDT05GIHVzaW5nIHRoZSBkZWZhdWx0IGNvbmZpZyBmaWxlICRXSU5FSU5JCiAgaWYgWyAiJERPTE9DQUxDT05GIiA9ICd5ZXMnIF0KICB0aGVuIHsKICAgIGNwICRXSU5FSU5JICRUTVBDT05GCiAgICBjb25mX3Jlc2V0X3F1ZXN0aW9uIGRlZmF1bHRfY29uZmlnCiAgICBjb25mX3F1ZXN0aW9uIGxvdyBkZWZhdWx0X2NvbmZpZyBcCiAgICAgIkNyZWF0ZWQgJExDT05GIHVzaW5nIGRlZmF1bHQgV2luZSBjb25maWd1cmF0aW9uLiIgXAogICAgICJZb3UgcHJvYmFibHkgd2FudCB0byByZXZpZXcgdGhlIGZpbGUsIHRob3VnaC4iCiAgfQogIGZpCgogICMgbm93IHdlIHJlYWxseSBzaG91bGQgaW5zdGFsbCB0aGUgcmVnaXN0cnkKICBpZiBbICIkRE9SRUciID0gJ2F1dG8nIF0KICB0aGVuIERPUkVHPXllcwogIGZpCn0KZmkKZWNobwoKI2luc3RhbGwgdGhlIGxvY2FsIGNvbmZpZyBmaWxlICRMQ09ORgppZiBbICIkRE9MT0NBTENPTkYiID0gJ3llcycgXQp0aGVuCiAgaWYgWyAhIC13IH4vLndpbmUgXQogIHRoZW4KICAgIG1rZGlyIH4vLndpbmUKICBmaQogIGNwICRUTVBDT05GICRMQ09ORiA+IC9kZXYvbnVsbAplbHNlCiAgRE9SRUc9bm8KZmkKCiMgbWFrZSByb290J3MgcmVnaXN0cnkgZ2xvYmFsLCBpZiBkZXNpcmVkCmlmIFsgYHdob2FtaWAgPSAncm9vdCcgXSAmJiBbICIkRE9SRUciID0gJ3llcycgXSAmJiBbICIkU1lTUkVHIiA9ICd5ZXMnIF0KdGhlbiB7CiAgWyAtZCB+Ly53aW5lIF0gfHwgbWtkaXIgfi8ud2luZQogIGlmICEgWyAtZiAkc3lzY29uZmRpci93aW5lLnVzZXJyZWcgXQogIHRoZW4gewogICAgZWNobyAiTGlua2luZyByb290J3MgdXNlciByZWdpc3RyeSBoaXZlIHRvIHRoZSBnbG9iYWwgcmVnaXN0cnkuLi4iCiAgICBbIC1mIH4vLndpbmUvd2luZS51c2VycmVnIF0gJiYgY3Agfi8ud2luZS93aW5lLnVzZXJyZWcgJHN5c2NvbmZkaXIvd2luZS51c2VycmVnCiAgICBsbiAtc2YgJHN5c2NvbmZkaXIvd2luZS51c2VycmVnIH4vLndpbmUvd2luZS51c2VycmVnCiAgfQogIGZpCiAgaWYgISBbIC1mICRzeXNjb25mZGlyL3dpbmUuc3lzdGVtcmVnIF0KICB0aGVuIHsKICAgIGVjaG8gIkxpbmtpbmcgcm9vdCdzIHN5c3RlbSByZWdpc3RyeSBoaXZlIHRvIHRoZSBnbG9iYWwgcmVnaXN0cnkuLi4iCiAgICBbIC1mIH4vLndpbmUvc3lzdGVtLnJlZyBdICYmIGNwIH4vLndpbmUvc3lzdGVtLnJlZyAkc3lzY29uZmRpci93aW5lLnN5c3RlbXJlZwogICAgbG4gLXNmICRzeXNjb25mZGlyL3dpbmUuc3lzdGVtcmVnIH4vLndpbmUvc3lzdGVtLnJlZwogIH0KICBmaQp9CmZpCgojIGNsZWFudXAgYW55IHRlbXBvcmFyeSBmaWxlcyB0aGF0IG1heSByZW1haW4KaWYgWyAtZiAkVE1QQ09ORiBdCnRoZW4gcm0gLWYgJFRNUENPTkYKZmkKCgojIGl0J3MgYSB3cmFwCmVjaG8KZWNobyAiSW5zdGFsbGF0aW9uIGNvbXBsZXRlIGZvciBub3cuIEdvb2QgbHVjayAodGhpcyBpcyBzdGlsbCBhbHBoYSBzb2Z0d2FyZSkuIgplY2hvICJJZiB5b3UgaGF2ZSBwcm9ibGVtcyB3aXRoIFdJTkUsIHBsZWFzZSByZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZpcnN0LCIKZWNobyAiYXMgbWFueSBraW5kcyBvZiBwb3RlbnRpYWwgcHJvYmxlbXMgYXJlIGV4cGxhaW5lZCB0aGVyZS4iCgpleGl0IDAK