IyEvYmluL2Jhc2gKIyBXSU5FIEluc3RhbGxhdGlvbiBzY3JpcHQKCiMgTWFyIDMxIDE5OTkgLSBPdmUgS+V2ZW4KIyAgRmlyc3QgdmVyc2lvbgojIERlYyA5IDE5OTkgLSBPdmUgS+V2ZW4KIyAgcmVxdWlyZSBYcG0KIyBGZWIgMjUgMjAwMCAtIE92ZSBL5XZlbgojICBhdXRvLWFkZCAvdXNyL2xvY2FsL2xpYiB0byAvZXRjL2xkLnNvLmNvbmYKIyBNYXIgMiAyMDAwIC0gT3ZlIEvldmVuCiMgIHNvdXJjZSByYXRoZXIgdGhhbiBncmVwIGNvbmZpZy5jYWNoZQojICB1c2Ugc291cmNlZCBjb25maWcuY2FjaGUgdG8gc3RhcnQgbGRjb25maWcKIyAgcmVjb25maWd1cmUgaWYgY29uZmlnLmNhY2hlIGRvZXNuJ3QgZXhpc3QKIyBNYXIgMzAgMjAwMCAtIE92ZSBL5XZlbgojICBhdXRvY29uZmlndXJlIG5vLXdpbmRvd3MgaW5zdGFsbHMKIyAgZG8gbm90IGluc3RhbGwgcmVnaXN0cnkgb24gcmVhbC13aW5kb3dzIGluc3RhbGxzCiMgIHNvbWUgc3VwcG9ydCBmb3IgYmluYXJ5IHBhY2thZ2UgaW5zdGFsbHMKIyAgc2V0IGFuZCB0ZWxsIHVzZXIgYWJvdXQgTERfTElCUkFSWV9QQVRIIGlmIG5lY2Vzc2FyeQojICBzZXQgRVhUUkFfTERfTElCUkFSWV9QQVRIIGluIHdpbmUuY29uZgojIEFwciA5IDIwMDAgLSBPdmUgS+V2ZW4KIyAgbWFrZSByb290J3MgcmVnaXN0cnkgZ2xvYmFsIChzeXN0ZW0tZGVmYXVsdCkKIyBNYXkgOSAyMDAwIC0gT3ZlIEvldmVuCiMgIHVzZSB0dHlkcnYgd2hlbiBydW5uaW5nIHJlZ2FwaSwgc28gd2UgZG9uJ3QgaGF2ZSB0byBydW4gZnJvbSBYCiMgIGNoYW5nZSBkZWJ1Z2dlciBwYXRoIGluIHJlZ2lzdHJ5CgojLS0tIGRlZmF1bHRzIChjaGFuZ2UgdGhlc2UgaWYgeW91IGFyZSBhIHBhY2thZ2VyKQpDT05GQVJHUz0gICAgICAgICAgICAgICAgICAgICAjIGNvbmZpZ3VyZSBhcmdzLCBlLmcuIC0tcHJlZml4PS91c3IgLS1zeXNjb25mZGlyPS9ldGMKcHJlZml4PS91c3IvbG9jYWwgICAgICAgICAgICAgIyBpbnN0YWxsYXRpb24gcHJlZml4CnN5c2NvbmZkaXI9JHByZWZpeC9ldGMgICAgICAgICMgd2hlcmUgd2luZS5jb25mIGFuZCBnbG9iYWwgcmVnaXN0cnkgaXMgc3VwcG9zZWQgdG8gYmUKYmluZGlyPSRwcmVmaXgvYmluICAgICAgICAgICAgIyB3aGVyZSB3aW5lbGliIGFwcHMgd2lsbCBiZSAob3IgaXMpIGluc3RhbGxlZApsaWJkaXI9JHByZWZpeC9saWIgICAgICAgICAgICAjIHdoZXJlIGxpYndpbmUuc28gd2lsbCBiZSAob3IgaXMpIGluc3RhbGxlZApleGRpcj1kb2N1bWVudGF0aW9uL3NhbXBsZXMgICAjIHdoZXJlIHRoZSBleGFtcGxlIHN5c3RlbS5pbmkgcmVzaWRlcwpDT05GPSRzeXNjb25mZGlyL3dpbmUuY29uZiAgICAjIGRlZmF1bHQgcGF0aCBvZiB0aGUgd2luZS5jb25mCkJJTkRJU1Q9bm8gICAgICAgICAgICAgICAgICAgICMgd2hldGhlciBjYWxsZWQgZnJvbSBhIGJpbmFyeSBwYWNrYWdlIGNvbmZpZyBzY3JpcHQKRE9DT05GPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9nZW5lcmF0ZSB3aW5lLmNvbmYKRE9XQ0hLPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9jb25maWd1cmUgZXhpc3Rpbmctd2luZG93cyBpbnN0YWxsYXRpb24KRE9XSU5FPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9jb25maWd1cmUgbm8td2luZG93cyBpbnN0YWxsYXRpb24KRE9SRUc9YXV0byAgICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGluc3RhbGwgZGVmYXVsdCByZWdpc3RyeQpTWVNSRUc9eWVzICAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gbWFrZSByb290J3MgcmVnaXN0cnkgZ2xvYmFsIChzeXN0ZW0tZGVmYXVsdCkKCiMgIm1ha2UgaW5zdGFsbCIgc3RpbGwgaW5zdGFsbHMgdGhlIGRsbHMgaW50byAkbGliZGlyLCBidXQgdGhpcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUKIyAoRExMUEFUSCBzaG91bGQgcG9pbnQgdG8gdGhlbSBpZi93aGVuIHRoZXkgYXJlIG5vdCBpbiBzdGFuZGFyZCBsZC5zbyBwYXRocykKRExMUEFUSD0kbGliZGlyL3dpbmUgICAgICAgICAgIyBkZWZhdWx0IHBhdGggb2YgdGhlIGRsbCAuc28gZmlsZXMgKGV4Y2VwdCBsaWJ3aW5lLnNvKQoKIyBoYXZpbmcgdGhlIFdpbmUgZGVidWdnZXIgbGF1bmNoZWQgYXV0b21hdGljYWxseSB3aWxsIGJlIGEgcGx1cyBmb3IgdXMKREVCVUdHRVI9JGJpbmRpci93aW5lZGJnICAgICAgIyB0aGUgKGluc3RhbGxlZCkgcGF0aCBvZiB3aW5lZGJnCkhERUJVR0dFUj1kZWJ1Z2dlci93aW5lZGJnICAgICMgdGhlIChub24taW5zdGFsbGVkKSBwYXRoIG9mIHdpbmVkYmcKCiMgdGhpcyBpcyBvbmx5IGZvciBleGlzdGluZy13aW5kb3dzIGluc3RhbGxzCldJTkVDT05GPXRvb2xzL3dpbmVjb25mICAgICAgICMgdGhlIHBhdGggb2Ygd2luZWNvbmYgcGVybCBzY3JpcHQKCiMgdGhpcyBpcyBvbmx5IGZvciBuby13aW5kb3dzIGluc3RhbGxzCldJTkVJTkk9d2luZS5pbmkgICAgICAgICAgICAgICMgdGhlIHBhdGggb2YgZGVmYXVsdCB3aW5lLmluaSAoYWxzbyB1c2VkIGJ5IHdpbmVjb25mKQpXSU5JTkk9L2Rldi9udWxsICAgICAgICAgICAgICAjIHRoZSBwYXRoIG9mIGRlZmF1bHQgd2luLmluaQpTWVNURU1JTkk9JGV4ZGlyL3N5c3RlbS5pbmkgICAjIHRoZSBwYXRoIG9mIGRlZmF1bHQgc3lzdGVtLmluaQpSRUdBUEk9cHJvZ3JhbXMvcmVnYXBpL3JlZ2FwaSAjIHRoZSBwYXRoIG9mIHJlZ2FwaSB3aW5lbGliIGFwcGxpY2F0aW9uCkRFRlJFRz13aW5lZGVmYXVsdC5yZWcgICAgICAgICMgdGhlIHBhdGggb2YgdGhlIHJlZ2lzdHJ5IGZpbGUgdG8gYmUgZmVkIHRvIHJlZ2FwaQojIENST09UPS92YXIvd2luZSAgICAgICAgICAgICAjIHRoZSBwYXRoIG9mIHRoZSBmYWtlIERyaXZlIEMgKGFza3MgdXNlciBpZiBub3Qgc2V0KQojLS0tIGVuZCBvZiBkZWZhdWx0cwoKIyB0ZW1wb3JhcnkgZmlsZXMgdXNlZCBieSB0aGUgaW5zdGFsbGVyClRNUENPTkY9L3RtcC93aW5laW5zdGFsbC5jb25mClRNUFJFRz0vdG1wL3dpbmVpbnN0YWxsLnJlZwoKIyBzdGFydHVwLi4uCgplY2hvICJXSU5FIEluc3RhbGxlciB2MC40IgplY2hvCgppZiBbICIkQklORElTVCIgPSAnbm8nIF0KdGhlbiB7CgppZiAhIFsgLWYgY29uZmlndXJlIF0KdGhlbiB7CiAgZWNobyAiWW91J3JlIHJ1bm5pbmcgdGhpcyBmcm9tIHRoZSB3cm9uZyBkaXJlY3RvcnkuIgogIGVjaG8gIkNoYW5nZSB0byB0aGUgV2luZSBkaXJlY3RvcnkgYW5kIHRyeSBhZ2Fpbi4iCiAgZXhpdCAxCn0KZmkKCiMgY2hlY2sgd2hldGhlciBSUE0gaW5zdGFsbGVkLCBhbmQgaWYgaXQgaXMsIHJlbW92ZSBhbnkgb2xkIHdpbmUgcnBtLgpoYXNoIHJwbTsgUkVUPSQ/ICY+L2Rldi9udWxsCmlmIFsgJFJFVCAtZXEgMCBdOyB0aGVuCiAgaWYgWyAtbiAiYHJwbSAtcWkgd2luZSAyPi9kZXYvbnVsbHxncmVwICJeTmFtZSJgIiBdOyB0aGVuCiAgICBlY2hvICJXYXJuaW5nOiBPbGQgV2luZSBSUE0gaW5zdGFsbCBkZXRlY3RlZC4gV2Ugd2FudCB0byBnZXQgcmlkIG9mIGl0IGZpcnN0LiIKICAgIGVjaG8gLW4gIm9rIChZL24pID8gIgogICAgcmVhZCBET1dJTkUKICAgIGlmIFsgIiRET1dJTkUiICE9ICduJyAtYSAiJERPV0lORSIgIT0gJ04nIF07IHRoZW4KICAgICAgZWNobyBTdGFydGluZyB3aW5lIHJwbSByZW1vdmFsLi4uCiAgICAgIHJwbSAtZSB3aW5lOyBSRVQ9JD8KICAgICAgaWYgWyAkUkVUIC1lcSAwIF07IHRoZW4KICAgICAgICBlY2hvIERvbmUuCiAgICAgIGVsc2UKICAgICAgICBlY2hvIEZBSUxFRC4gUHJvYmFibHkgeW91IGFyZW4ndCBpbnN0YWxsaW5nIGFzIHJvb3QuCiAgICAgIGZpCiAgICBlbHNlCiAgICAgIGVjaG8gIlNvcnJ5LCBJIHdvbid0IGluc3RhbGwgV2luZSB3aGVuIGFuIHJwbSB2ZXJzaW9uIGlzIHN0aWxsIGluc3RhbGxlZC4iCiAgICAgIGVjaG8gIihXaW5lIHN1cHBvcnQgc3VmZmVyZWQgZnJvbSB3YXkgdG9vIG1hbnkgY29uZmxpY3RzKSIKICAgICAgZWNobyAiSGF2ZSBhIG5pY2UgZGF5ICEiCiAgICAgIGV4aXQKICAgIGZpIAogIGZpCmZpCgojIHJ1biB0aGUgY29uZmlndXJlIHNjcmlwdCwgaWYgbmVjZXNzYXJ5CgppZiBbIC1mIGNvbmZpZy5jYWNoZSBdICYmIFsgLWYgTWFrZWZpbGUgXSAmJiBbIE1ha2VmaWxlIC1udCBjb25maWd1cmUgXQp0aGVuIHsKICBlY2hvICJJIHNlZSB0aGF0IFdJTkUgaGFzIGFscmVhZHkgYmVlbiBjb25maWd1cmVkLCBzbyBJJ2xsIHNraXAgdGhhdC4iCiAgIyBsb2FkIGNvbmZpZ3VyZSByZXN1bHRzCiAgLiAuL2NvbmZpZy5jYWNoZQp9CmVsc2UgewogIGVjaG8gIlJ1bm5pbmcgY29uZmlndXJlLi4uIgogIGVjaG8KICBpZiAhIC4vY29uZmlndXJlICRDT05GQVJHUwogIHRoZW4gewogICAgZWNobwogICAgZWNobyAiQ29uZmlndXJlIGZhaWxlZCwgYWJvcnRpbmcgaW5zdGFsbC4iCiAgICBybSAtZiBjb25maWcuY2FjaGUKICAgIGV4aXQgMQogIH0KICBmaQogICMgbG9hZCBjb25maWd1cmUgcmVzdWx0cwogIC4gLi9jb25maWcuY2FjaGUKICAjIG1ha2Ugc3VyZSBYIHdhcyBmb3VuZAogIGV2YWwgIiRhY19jdl9oYXZlX3giCiAgaWYgWyAiJGhhdmVfeCIgIT0gInllcyIgXQogIHRoZW4gewogICAgZWNobyAiSW5zdGFsbCB0aGUgWCBkZXZlbG9wbWVudCBoZWFkZXJzIGFuZCB0cnkgYWdhaW4uIgogICAgcm0gLWYgY29uZmlnLmNhY2hlCiAgICBleGl0IDEKICB9CiAgZWxpZiBbICIkYWNfY3ZfaGVhZGVyX1gxMV94cG1faCIgIT0gInllcyIgXQogIHRoZW4gewogICAgZWNobyAiSW5zdGFsbCB0aGUgWHBtIGRldmVsb3BtZW50IGhlYWRlcnMgYW5kIHRyeSBhZ2Fpbi4iCiAgICBybSAtZiBjb25maWcuY2FjaGUKICAgIGV4aXQgMQogIH0KICBmaQp9CmZpCgojIG5vdyBkbyB0aGUgY29tcGlsYXRpb24KCmlmIFsgLWYgd2luZSBdICYmIFsgd2luZSAtbnQgTWFrZWZpbGUgXQp0aGVuIHsKICBlY2hvICJIbW0sIGxvb2tzIGxpa2UgV0lORSBpcyBhbHJlYWR5IGNvbXBpbGVkLiBJJ2xsIHNraXAgdGhhdCB0b28sIEkgZ3Vlc3MuIgp9CmVsc2UgewogIGVjaG8gIkNvbXBpbGluZyBXSU5FLiBHcmFiIGEgbHVuY2ggb3IgdHdvLCByZW50IGEgdmlkZW8sIG9yIHdoYXRldmVyLCBpbiB0aGUgbWVhbnRpbWUuLi4iCiAgZWNobwogIGlmICEgeyBtYWtlIGRlcGVuZCAmJiBtYWtlOyB9CiAgdGhlbiB7CiAgICBlY2hvCiAgICBlY2hvICJDb21waWxhdGlvbiBmYWlsZWQsIGFib3J0aW5nIGluc3RhbGwuIgogICAgZXhpdCAxCiAgfQogIGZpCiAgZWNobwp9CmZpCgojIGFuZCBpbnN0YWxsYXRpb24sIGlmIHJvb3QKCmlmIFsgYHdob2FtaWAgIT0gJ3Jvb3QnIF0KdGhlbiB7CiAgZWNobyAiWW91IGFyZW4ndCByb290LCBzbyBJJ2xsIHNraXAgdGhlIG1ha2UgaW5zdGFsbC4iCiAgIyBzZXR1cCB0byBydW4gZnJvbSBjdXJyZW50IGRpcmVjdG9yeQogIERMTFBBVEg9IiRQV0QvZGxscyIKICBpZiBbIC16ICIkTERfTElCUkFSWV9QQVRIIiBdCiAgdGhlbiBMRF9MSUJSQVJZX1BBVEg9IiRQV0Q6JERMTFBBVEgiCiAgZWxzZSBMRF9MSUJSQVJZX1BBVEg9IiRMRF9MSUJSQVJZX1BBVEg6JFBXRDokRExMUEFUSCIKICBmaQogIGV4cG9ydCBMRF9MSUJSQVJZX1BBVEgKICBERUJVR0dFUj0iJFBXRC8kSERFQlVHR0VSIgogIGVjaG8KICBlY2hvICJOT1RFISBUbyBydW4gV2luZSB3aXRob3V0IGluc3RhbGxpbmcsIHlvdSBtdXN0IHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUiCiAgZWNobyAiTERfTElCUkFSWV9QQVRIIHRvICRQV0Q6JERMTFBBVEgiCiAgZWNobyAiaW4geW91ciBsb2dvbiBzY3JpcHRzLiIKfQplbHNlIHsKICBlY2hvICJOb3cgaW5zdGFsbGluZyBiaW5hcmllcyBvbnRvIHRoZSBzeXN0ZW0uLi4iCiAgZWNobwogIGlmICEgbWFrZSBpbnN0YWxsCiAgdGhlbiB7CiAgICBlY2hvCiAgICBlY2hvICJJbnN0YWxsYXRpb24gZmFpbGVkLCBhYm9ydGluZy4iCiAgICBleGl0IDEKICB9CiAgZmkKICBpZiBbIC1mIC9ldGMvbGQuc28uY29uZiBdICYmICEgZ3JlcCAtcXMgIiRsaWJkaXIiIC9ldGMvbGQuc28uY29uZgogIHRoZW4gewogICAgZWNobwogICAgZWNobyAiJGxpYmRpciBkaWRuJ3QgZXhpc3QgaW4geW91ciAvZXRjL2xkLnNvLmNvbmYsIGFkZGluZyBpdCBub3cuLi4iCiAgICBlY2hvICIkbGliZGlyIiA+Pi9ldGMvbGQuc28uY29uZgogICAgZWNobyAiUmUtcnVubmluZyBsZGNvbmZpZy4uLiIKICAgIGV2YWwgIiRhY19jdl9wYXRoX0xEQ09ORklHIgogIH0KICBmaQp9CmZpCmVjaG8KCn0KZmkgIyBCSU5ESVNUCgojIG5vdyBjaGVjayB3aGV0aGVyIHdlIHNob3VsZCBnZW5lcmF0ZSB3aW5lLmNvbmYKaWYgWyAteiAiJERPQ09ORiIgXQp0aGVuIERPQ09ORj1hdXRvCmZpCgppZiBbICIkRE9DT05GIiA9ICdhdXRvJyBdCnRoZW4gewogICMgc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHN5c3RlbSB3aW5lLmNvbmYKICBpZiBbIC1mICRDT05GIF0KICB0aGVuIERPQ09ORj1ubwogIGZpCn0KZmkKCmlmIFsgIiRET0NPTkYiICE9ICdubycgXQp0aGVuIHsKICBpZiBbIGB3aG9hbWlgICE9ICdyb290JyBdCiAgdGhlbiB7CiAgICBDT05GPX4vLndpbmVyYwogICAgaWYgISBbIC1mICRDT05GIF0KICAgIHRoZW4gewogICAgICBpZiBbICIkRE9DT05GIiAhPSAneWVzJyBdCiAgICAgIHRoZW4gewogICAgICAgIGVjaG8gIlNpbmNlIHlvdSBhcmVuJ3Qgcm9vdCwgYW5kIHRoZXJlJ3Mgbm8gc3lzdGVtIHdpbmUuY29uZiwgSSBhc3N1bWUiCiAgICAgICAgZWNobyAieW91IHdhbnQgYSB1c2VyLXNwZWNpZmljIC53aW5lcmMuIEFtIEkgY29ycmVjdD8gKHllcy9ubykiCiAgICAgICAgd2hpbGUgWyAiJERPQ09ORiIgIT0gJ3llcycgXSAmJiBbICIkRE9DT05GIiAhPSAnbm8nIF0KICAgICAgICBkbyByZWFkIERPQ09ORgogICAgICAgIGRvbmUKICAgICAgfQogICAgICBmaQogICAgICBpZiBbICIkRE9DT05GIiA9ICdubycgXQogICAgICB0aGVuIHsKICAgICAgICBlY2hvICJBYm9ydGluZyBpbnN0YWxsLiBUcnkgYWdhaW4gYXMgcm9vdCB0byBnZW5lcmF0ZSBhIHN5c3RlbSB3aW5lLmNvbmYuIgogICAgICAgIGV4aXQgMQogICAgICB9CiAgICAgIGZpCiAgICAgIGVjaG8KICAgIH0KICAgIGZpCiAgfQogIGVsc2UgewogICAgbWtkaXIgLXAgJHN5c2NvbmZkaXIKICAgIERPQ09ORj15ZXMKICB9CiAgZmkKfQpmaQoKIyBnZW5lcmF0ZSB3aW5lLmNvbmYgZnJvbSBleGlzdGluZyB3aW5kb3dzIGluc3RhbGwsIGlmIGFueQppZiBbICIkRE9DT05GIiA9ICd5ZXMnIF0KdGhlbiB7CiAgaWYgWyAiJERPV0NISyIgPSAneWVzJyBdIHx8IFsgIiRET1dDSEsiID0gJ2F1dG8nIF0KICB0aGVuIHsKICAgIGVjaG8gIlNlYXJjaGluZyBmb3IgYW4gZXhpc3RpbmcgV2luZG93cyBpbnN0YWxsYXRpb24uLi4iCiAgICBpZiAhICRXSU5FQ09ORiA+ICRDT05GIDI+L2Rldi9udWxsCiAgICB0aGVuIHsKICAgICAgcm0gLWYgJENPTkYKICAgICAgZWNobwogICAgICBlY2hvICJXaW5kb3dzIHdhcyBub3QgZm91bmQgb24geW91ciBzeXN0ZW0sIHNvIEkgYXNzdW1lIHlvdSB3YW50IGEgV2luZS1vbmx5IGluc3RhbGxhdGlvbi4iCiAgICAgIGVjaG8gIkFtIEkgY29ycmVjdD8gKHllcy9ubykiCiAgICAgIHdoaWxlIFsgIiRET1dJTkUiICE9ICd5ZXMnIF0gJiYgWyAiJERPV0lORSIgIT0gJ25vJyBdCiAgICAgIGRvIHJlYWQgRE9XSU5FCiAgICAgIGRvbmUKICAgICAgaWYgWyAiJERPV0lORSIgPSAnbm8nIF0KICAgICAgdGhlbiB7CiAgICAgICAgZWNobyAiQWJvcnRpbmcgaW5zdGFsbC4gTWFrZSBzdXJlIHlvdXIgV2luZG93cyBwYXJ0aXRpb24gaXMgbW91bnRlZCBhbmQgdHJ5IGFnYWluLCIKICAgICAgICBlY2hvICJvciBjcmVhdGUgJENPTkYgbWFudWFsbHkgYnkgY29weWluZyBmcm9tICRXSU5FSU5JIGFuZCBhZGFwdGluZyB0aGUgZHJpdmUgcGF0aHMuIgogICAgICAgIGV4aXQgMQogICAgICB9CiAgICAgIGZpCiAgICB9CiAgICBlbHNlIHsKICAgICAgZWNobwogICAgICBlY2hvICJDcmVhdGVkICRDT05GIHVzaW5nIHlvdXIgZXhpc3RpbmcgV2luZG93cyBpbnN0YWxsYXRpb24uIgogICAgICBlY2hvICJZb3UgcHJvYmFibHkgd2FudCB0byByZXZpZXcgdGhlIGZpbGUsIHRob3VnaC4iCiAgICAgIERPV0lORT1ubwogICAgfQogICAgZmkKICAgIGVjaG8KICB9CiAgZWxpZiBbICIkRE9XSU5FIiA9ICdhdXRvJyBdCiAgdGhlbiBET1dJTkU9eWVzCiAgZmkKfQplbGlmIFsgIiRET1dJTkUiID0gJ2F1dG8nIF0KdGhlbiBET1dJTkU9bm8KZmkKCiMgc2V0dXAgYSBuby13aW5kb3dzIGluc3RhbGxhdGlvbiwgaWYgbmVjZXNzYXJ5CmlmIFsgIiRET1dJTkUiID0gJ3llcycgXQp0aGVuIHsKICBpZiBbIGB3aG9hbWlgICE9ICdyb290JyBdCiAgdGhlbiBEQ1JPT1Q9fi9jCiAgZWxzZSBEQ1JPT1Q9L2MKICBmaQogIGVjaG8gIkNvbmZpZ3VyaW5nIFdpbmUgd2l0aG91dCBXaW5kb3dzLiBTb21lIGZha2UgV2luZG93cyBkaXJlY3RvcmllcyBtdXN0IGJlIGNyZWF0ZWQsIHRvIgogIGVjaG8gImhvbGQgYW55IC5pbmkgZmlsZXMsIERMTHMsIGFuZCBzdGFydCBtZW51IGVudHJpZXMgeW91ciBhcHBsaWNhdGlvbnMgbWF5IG5lZWQgdG8gaW5zdGFsbC4iCiAgd2hpbGUgWyAteiAiJENST09UIiBdCiAgZG8gewogICAgZWNobyAiV2hlcmUgd291bGQgeW91IGxpa2UgeW91ciBmYWtlIEMgZHJpdmUgdG8gYmUgcGxhY2VkPyAoZGVmYXVsdCBpcyAkRENST09UKSIKICAgIHJlYWQgQ1JPT1QKICAgIGlmIFsgLXogIiRDUk9PVCIgXQogICAgdGhlbiBDUk9PVD0iJERDUk9PVCIKICAgIGZpCiAgICBpZiAhIFsgLWQgIiRDUk9PVCIgXQogICAgdGhlbiB7CiAgICAgIGlmICEgbWtkaXIgLXAgIiRDUk9PVCIKICAgICAgdGhlbiB1bnNldCBDUk9PVAogICAgICBmaQogICAgfQogICAgZmkKICB9CiAgZG9uZQogIGVjaG8gIkNvbmZpZ3VyaW5nIFdpbmUgZm9yIGEgbm8td2luZG93cyBpbnN0YWxsIGluICRDUk9PVC4uLiIKICBmb3IgdGRpciBpbiAiJENST09UL3dpbmRvd3MiICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0iICIkQ1JPT1Qvd2luZG93cy9TdGFydCBNZW51IiAiJENST09UL3dpbmRvd3MvU3RhcnQgTWVudS9Qcm9ncmFtcyIgIiRDUk9PVC9Db21tb24gRmlsZXMiCiAgZG8gWyAtZCAiJHRkaXIiIF0gfHwgbWtkaXIgIiR0ZGlyIgogIGRvbmUKICBbIC1mICIkQ1JPT1Qvd2luZG93cy93aW4uaW5pIiBdICAgIHx8IGNwICIkV0lOSU5JIiAgICAiJENST09UL3dpbmRvd3Mvd2luLmluaSIKICBbIC1mICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0uaW5pIiBdIHx8IGNwICIkU1lTVEVNSU5JIiAiJENST09UL3dpbmRvd3Mvc3lzdGVtLmluaSIKICBpZiBbICIkRE9DT05GIiA9ICd5ZXMnIF0KICB0aGVuIHsKICAgIHNlZCAic3xQYXRoPS9jXCR8UGF0aD0ke0NST09UfXwiICRXSU5FSU5JID4gJENPTkYKICAgIGVjaG8gIkNyZWF0ZWQgJENPTkYgdXNpbmcgZGVmYXVsdCBXaW5lIGNvbmZpZ3VyYXRpb24uIgogICAgZWNobyAiWW91IHByb2JhYmx5IHdhbnQgdG8gcmV2aWV3IHRoZSBmaWxlLCB0aG91Z2guIgogIH0KICBmaQogICMgbm93IHdlIHJlYWxseSBzaG91bGQgaW5zdGFsbCB0aGUgcmVnaXN0cnkKICBpZiBbICIkRE9SRUciID0gJ2F1dG8nIF0KICB0aGVuIERPUkVHPXllcwogIGZpCn0KZWxpZiBbIC16ICIkQ1JPT1QiIF0KdGhlbiB7CiAgZWNobyAiUmVhZGluZyBjdXJyZW50IFdpbmUgY29uZmlndXJhdGlvbiBmcm9tICRDT05GLi4uIgogIENST09UPWBzZWQgLW4gJy9eXFtEcml2ZSBDXF0kLywvXlxbLipcXSQvIHMvXlBhdGg9XCguKlwpL1wxL3AnICRDT05GYAogIGVjaG8gIkRyaXZlIEMgaXMgY29uZmlndXJlZCBhdCAkQ1JPT1QuIgp9CmZpCmVjaG8KCiMgZml4dXAgRVhUUkFfTERfTElCUkFSWV9QQVRICmlmIFsgIiRET0NPTkYiID0gJ3llcycgXQp0aGVuIHsKICBlY2hvICJTZXR0aW5nIEVYVFJBX0xEX0xJQlJBUllfUEFUSCBpbiAud2luZXJjIHRvICRETExQQVRILi4uIgogIHNlZCAic3xFWFRSQV9MRF9MSUJSQVJZX1BBVEg9Lip8RVhUUkFfTERfTElCUkFSWV9QQVRIPSR7RExMUEFUSH18IiAkQ09ORiA+ICRDT05GLm5ldwogIG12IC1mICRDT05GLm5ldyAkQ09ORgogIGVjaG8KfQpmaQoKIyBjaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gaW5zdGFsbCBkZWZhdWx0IHJlZ2lzdHJ5CiMgKG5vdCB0byBiZSBkb25lIGlmIHdpbmRvd3MgcmVnaXN0cnkgZXhpc3RzKQppZiBbICIkRE9SRUciID0gJ2F1dG8nIF0KdGhlbiB7CiAgZWNobyAiQ2hlY2tpbmcgZm9yIHJlYWwgV2luZG93cyByZWdpc3RyeS4uLiIKICBpZiBbIC1mICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0uZGF0IiBdCiAgdGhlbiBET1JFRz1ubwogIGVsaWYgWyAtZiAiJENST09UL3dpbmRvd3Mvc3lzdGVtMzIvY29uZmlnL3N5c3RlbSIgXQogIHRoZW4gRE9SRUc9bm8KICBlbHNlIERPUkVHPXllcwogIGZpCiAgaWYgWyAiJERPUkVHIiA9ICd5ZXMnIF0KICB0aGVuIGVjaG8gIk5vdCBmb3VuZCwgZGVmYXVsdCBXaW5lIHJlZ2lzdHJ5IHdpbGwgYmUgaW5zdGFsbGVkLiIKICBlbHNlIGVjaG8gIldpbmRvd3MgcmVnaXN0cnkgZm91bmQsIHdpbGwgbm90IGluc3RhbGwgZGVmYXVsdCBXaW5lIHJlZ2lzdHJ5LiIKICBmaQogIGVjaG8KfQpmaQoKIyBpbnN0YWxsIGRlZmF1bHQgcmVnaXN0cnkgZW50cmllcwppZiBbICIkRE9SRUciID0gJ3llcycgXQp0aGVuIHsKICBpZiBbICIkQklORElTVCIgPSAnbm8nIF0KICB0aGVuIHsKICAgIGVjaG8gIkNvbXBpbGluZyByZWdhcGkuLi4iCiAgICBlY2hvCiAgICAoY2QgcHJvZ3JhbXMvcmVnYXBpOyBtYWtlKQogICAgZWNobwogIH0KICBmaQogIGVjaG8gIlByZXBhcmluZyB0byBpbnN0YWxsIGRlZmF1bHQgV2luZSByZWdpc3RyeSBlbnRyaWVzLi4uIgoKICAjIGNyZWF0ZSBhIHRlbXBvcmFyeSB3aW5laW5zdGFsbC5jb25mIGZpbGUgdXNpbmcgdHR5ZHJ2LAogICMgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHJ1biByZWdhcGkgdW5kZXIgWAogIHNlZCAicy9HcmFwaGljc0RyaXZlcj0uKi9HcmFwaGljc0RyaXZlcj10dHlkcnYvIiAkQ09ORiA+ICRUTVBDT05GCgogICMgY3JlYXRlIGEgdGVtcG9yYXJ5IHdpbmVpbnN0YWxsLnJlZyB3aXRoIGZpeGVkIGRlYnVnZ2VyIHBhdGgKICBzZWQgInN8ZGVidWdnZXIvd2luZWRiZ3wke0RFQlVHR0VSfXwiICRERUZSRUcgPiAkVE1QUkVHCgogIGVjaG8gIkluc3RhbGxpbmcgZGVmYXVsdCBXaW5lIHJlZ2lzdHJ5IGVudHJpZXMuLi4iCiAgZWNobwogIGlmICEgJFJFR0FQSSAtLWNvbmZpZyAkVE1QQ09ORiBzZXRWYWx1ZSA8ICRUTVBSRUcgPiAvZGV2L251bGwKICB0aGVuIHsKICAgIHJtIC1mICRUTVBDT05GICRUTVBSRUcKICAgIGVjaG8KICAgIGVjaG8gIlJlZ2lzdHJ5IGluc3RhbGwgZmFpbGVkLiIKICAgIGV4aXQgMQogIH0KICBlbHNlIGVjaG8gIlJlZ2lzdHJ5IGVudHJpZXMgc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZC4iCiAgZmkKICBybSAtZiAkVE1QQ09ORiAkVE1QUkVHCiAgaWYgWyAiJFNZU1JFRyIgPSAnYXV0bycgXQogIHRoZW4gU1lTUkVHPXllcwogIGZpCn0KZmkKCiMgbWFrZSByb290J3MgcmVnaXN0cnkgZ2xvYmFsLCBpZiBkZXNpcmVkCmlmIFsgYHdob2FtaWAgPSAncm9vdCcgXSAmJiBbICIkU1lTUkVHIiA9ICd5ZXMnIF0KdGhlbiB7CiAgWyAtZCB+Ly53aW5lIF0gfHwgbWtkaXIgfi8ud2luZQogIGlmICEgWyAtZiAkc3lzY29uZmRpci93aW5lLnVzZXJyZWcgXQogIHRoZW4gewogICAgZWNobyAiTGlua2luZyByb290J3MgdXNlciByZWdpc3RyeSBoaXZlIHRvIHRoZSBnbG9iYWwgcmVnaXN0cnkuLi4iCiAgICBjcCB+Ly53aW5lL3dpbmUudXNlcnJlZyAkc3lzY29uZmRpci93aW5lLnVzZXJyZWcKICAgIGxuIC1zZiAkc3lzY29uZmRpci93aW5lLnVzZXJyZWcgfi8ud2luZS93aW5lLnVzZXJyZWcKICB9CiAgZmkKICBpZiAhIFsgLWYgJHN5c2NvbmZkaXIvd2luZS5zeXN0ZW1yZWcgXQogIHRoZW4gewogICAgZWNobyAiTGlua2luZyByb290J3Mgc3lzdGVtIHJlZ2lzdHJ5IGhpdmUgdG8gdGhlIGdsb2JhbCByZWdpc3RyeS4uLiIKICAgIGNwIH4vLndpbmUvc3lzdGVtLnJlZyAkc3lzY29uZmRpci93aW5lLnN5c3RlbXJlZwogICAgbG4gLXNmICRzeXNjb25mZGlyL3dpbmUuc3lzdGVtcmVnIH4vLndpbmUvc3lzdGVtLnJlZwogIH0KICBmaQp9CmZpCgojIGl0J3MgYSB3cmFwCmVjaG8KZWNobyAiSW5zdGFsbGF0aW9uIGNvbXBsZXRlIGZvciBub3cuIEdvb2QgbHVjayAodGhpcyBpcyBzdGlsbCBhbHBoYSBzb2Z0d2FyZSkuIgplY2hvICJJZiB5b3UgaGF2ZSBwcm9ibGVtcyB3aXRoIFdJTkUsIHBsZWFzZSByZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZpcnN0LCIKZWNobyAiYXMgbWFueSBraW5kcyBvZiBwb3RlbnRpYWwgcHJvYmxlbXMgYXJlIGV4cGxhaW5lZCB0aGVyZS4iCg==